Подскажите путь решения задачи

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Max Jagger
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 28.07.2005 (Чт) 9:23

Подскажите путь решения задачи

Сообщение Max Jagger » 28.07.2005 (Чт) 9:35

Задача:
есть производственная необходимость периодически сравнивать 2 файла Excel, которые приходят по почте, сравнивать на наличие повторяющихся позиций (строк) и результат сравнения записывать в новый файл Excel.
Подскажите пожалуйста каким образом это можно сделать с помощью офисного VB. Меня интересует какие объекты использовать и куда эти объекты писать (с интерфейсом не знаком совершенно). Логику кода объяснять не нужно - программировать умею.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.07.2005 (Чт) 9:44

Какой результат сравнения записывать?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Max Jagger
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 28.07.2005 (Чт) 9:23

Сообщение Max Jagger » 28.07.2005 (Чт) 9:49

Необходимо отбрасывать повторяющиеся позиции, а оставшиеся позиции записывать в новый файл.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.07.2005 (Чт) 9:58

Самое простое - скопировать один список в конец второго, затем применить Данные :arrow: Фильтр :arrow: Расширенный :arrow: Только уникальные записи.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 8:01

GSerg у меня тоже вопрос на данную тему:

Есть два файла текстовых (можно даже отсортированные по возрастанию) каждая строка которого число (Long). Мне нужно сравнить эти файлы и занести в массив те строки, которые есть лишь в одном файле (не повторяются во втором). Размер файлов может колебаться от 400 до нескольких тысяч строк. Но перебор по каждой строке и сравнение с другим файлом займет много времени (допустим по 1000 строк в каждом файле, тогда 1000 * 1000 = 1000 000 итераций цикла, а это подвисон, даже DoEvents не выход). Вот и хотел спросить алгоритм, скодить-то я смогу... (хотя от готового кода не откажусь :wink: )
А я все практикую лечение травами...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.07.2005 (Пт) 9:00

Twister писал(а):Вот и хотел спросить алгоритм, скодить-то я смогу... (хотя от готового кода не откажусь :wink: )


Ты неправ ибо кол-во переборов меньше.

А если списки в файлах уже отсортированы, то задача упрощается до смешного. Подумай - оно совсем просто...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 9:20

нет, если отсортированные, то я знаю как это быстро сделать
но они не всегда таковые...

Ты неправ ибо кол-во переборов меньше.


Почему меньше - я сравниваю каждую строку в файле со всеми в другом и получается много.

Вообще, я уже почти знаю как реализовать задачу, хотел спросить вашего совета...
А я все практикую лечение травами...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.07.2005 (Пт) 9:44

Twister писал(а):Почему меньше - я сравниваю каждую строку в файле со всеми в другом и получается много.


А зачем сравнивать каждую строку со всеми другими?
Это неоптимально.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 9:51

Знаю, есть другой подход - сравнивать строки попарно, и если несовпадение, то ... ну там действа разные.
А я все практикую лечение травами...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.07.2005 (Пт) 9:53

Twister писал(а):Знаю, есть другой подход - сравнивать строки попарно, и если несовпадение, то ... ну там действа разные.


Ну допустим, не попарно...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 10:02

Ну тогда не темни, зацени идейку...
А я все практикую лечение травами...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.07.2005 (Пт) 10:03

В общем, держи пример:

Код: Выделить всё
    Dim m1(100) As Long, m2(100) As Long, m() As Long, b As Boolean
    Dim i1 As Long, i2 As Long, j As Long, k As Long, i As Long, im As Long
   
    ' Заполним два массива m1 и m2
    For i1 = 0 To UBound(m1)
        m1(i1) = (i1 + 1) * 2
    Next i1
    For i2 = 0 To UBound(m2)
        m2(i2) = (i2 + 1) * 7
    Next i2
   
    ' Из двух массивов получим один с неповторяющимися значениями (неотсортированный)
    ReDim m(UBound(m1) + UBound(m2) + 1)
    For i1 = 0 To UBound(m1)
        m(i1) = m1(i1)
    Next i1
    i1 = UBound(m1): k = 0: im = i1
    For i2 = 0 To UBound(m2)
        j = m2(i2): b = True
        For i = k To i1
            Select Case m(i)
                Case j
                    b = False: k = i + 1
                    Exit For
                Case Is > j
                    k = i
                    Exit For
            End Select
        Next i
        If b Then
            im = im + 1
            m(im) = j
        End If
    Next i2
    ReDim Preserve m(im)
   
    ' При желании - напечатаем результат
    For i = 0 To UBound(m)
        Debug.Print m(i)
    Next i


Специально замера не делал, но неповторяющиеся значения из двух массивов по миллиону строк в каждом выбираются в третий массив примерно за 2 секунды. Устроит?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 14:17

Ну спасибо, просто огромный РЕСПЕКТ!!!
Чуть позже код разберу...
А я все практикую лечение травами...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.07.2005 (Пт) 14:25

Twister писал(а):нет, если отсортированные, то я знаю как это быстро сделать но они не всегда таковые...


А если неотсортированные, то скинуть в две таблички и сделать по ним SELECT FROM NOT EXISTS(...)...

Как вариант - довольно простого решения :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 119

    TopList