Excel. Сравнить два файла по значениям ячееек.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
evstyle
Сообщения: 12
Зарегистрирован: 02 ноя 2006, 12:30

День добрый.
Убедительная просьба! Если у кого есть какие идеи выкладывайте их здесь.
Очень надо! Пожалуйста.
Собственно задача:
Есть два прайс-листа , которые отличаются наличием разного товара oldPrice.xls and newPrice.xls.
Вопрос
как сделать в newPrice.xls чтобы:
1. на против нового товара в новом столбце вывести значение '1'
2. напротив товара, которого уже нет в новом прайсе, вывести значение '0'
3. строки со старым товаром, который есть в обоих файлах, удалить из файла.

Я так понимаю
в цикле надо перебрать и сравнить ячейки в двух файлах:
1.Если ячейки нет в oldPrice, значит товар новый -> ставим значение '1'
2. сравниваем oldPrice с newPrice, если во втором файле нет товара, значит выводи '0'
3. Если кода совпадают, значит товар старый, - удаляем из файла

У кого какие мысли, если можно подкрепите реальным кодом.
Заранее спасибо
Sad_ko
Сообщения: 4
Зарегистрирован: 29 окт 2006, 00:45
Откуда: N.Chelny

Я на днях написал пообный код для сравнения двух листов и поиском отличий в старом и новом. Отправь мне свой майл, я тебе вышлю с пояснениями. Алгоритм примерно такой: сначала ОЛД сравнивается с НЬЮ и все отличия выделяются красным и копируются в отдельны лист РЕПОРТ, затем наоборот и тоже красным и в РЕПОРТ. По две тысячи строк на каждом листе.
Thunder
Сообщения: 57
Зарегистрирован: 24 окт 2006, 03:14
Контактная информация:

можно ли публике посмотреть код?
Влруг посоветуют чего в оптимизации, да и задача не праздная, потомкам пригодится.
Самоучка :)
Аватара пользователя
Ser Artur
Сообщения: 82
Зарегистрирован: 24 май 2005, 16:32

Откопал для Вас и мне пригодилось

Код: Выделить всё

Sub Compare_A_B()
Application.ScreenUpdating = False
Dim i As Integer
Dim stroka1 As Integer: stroka1 = 2     ' íîìåð ïåðâîé ñòðîêè
Dim stroka9 As Integer: stroka9 = 100   ' íîìåð ïîñëåäíåé ñòðîêè

For i = stroka1 To stroka9
    a0 = Range("A" & LTrim(Str(i))).Value      ' ïîëó÷èì çíà÷åíèå òåêóùåé ñòðîêè, êîëîíêè "A"
    b0 = Range("B" & LTrim(Str(i))).Value      ' ïîëó÷èì çíà÷åíèå òåêóùåé ñòðîêè, êîëîíêè "B"
    If a0 <> b0 Then
       r = r + 1
       Range("D" & LTrim(Str(i))).Value = "ÇÄÅÑÜ ÍÅ ÐÀÂÍÎ"
       ' èëè ìîæíî óäàëèòü òåêóùóþ çàïèñü
       'Rows(LTrim(Str(i)) & ":" & LTrim(Str(i))).Select
       'Selection.Delete Shift:=xlUp
       stroka9 = stroka9 - 1
    End If
Next
Application.ScreenUpdating = True
Exit Sub
Err0:
    Application.ScreenUpdating = True
    MsgBox Err.Description & vbCrLf & "íà ñòðîêå   " & Str(i)
End Sub
А какой Ваш код Sad ko :?:
Ser Artur
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

Ser Artur писал(а):Откопал для Вас и мне пригодилось
В редакторе VBA переключись на русский язык, скопируй код и вставь сюда, плиз, а то твои русские комментраии нечитабельны.
Sad_ko
Сообщения: 4
Зарегистрирован: 29 окт 2006, 00:45
Откуда: N.Chelny

Вот мой код. Примитивно, конечно, но написан на скорую руку и что характерно работает.
Суть такая: два листа, открывается форма, вносим названия листов(месяц) в текстбоксы. Конечно надо еще проверку поставить, чтобы проверял есть ли лист с таким именем. Но было не до этого. Хотел поискать попроще, но как через Find не разобрался. Еще видел оператор Like, но с ним тоже еще не работал, поэтому решил по-простому.

Код: Выделить всё

Private Sub CommandButton1_Click()
lst1 = TextBox1.Text
lst2 = TextBox2.Text
If TextBox1 = Empty Then
    MsgBox "Введите название месяца", vbInformation
    Exit Sub
    TextBox1.SetFocus
End If
If TextBox2 = Empty Then
    MsgBox "Введите название месяца", vbInformation
    Exit Sub
    TextBox2.SetFocus
End If
    n1 = Sheets(lst1).Range("B1").CurrentRegion.Rows.Count
    n2 = Sheets(lst2).Range("B1").CurrentRegion.Rows.Count
'сверяем первый лист со вторым
Sheets(lst1).Select
Columns(2).Select
    Selection.Interior.ColorIndex = xlNone
    Range("B2").Select
m1 = 0
For i = 2 To n1
    x = Sheets(lst1).Cells(i, 2).Value
       z = 0
       For j = 2 To n2
        y = Sheets(lst2).Cells(j, 2).Value
            
            If x = y Then GoTo tre
        Next j
     Sheets(lst1).Cells(i, 2).Interior.ColorIndex = 3
     m1 = m1 + 1
            
tre:
Next i
'сверяем второй лист с первым
Sheets(lst2).Select
Columns(2).Select
    Selection.Interior.ColorIndex = xlNone
    Range("B2").Select
m2 = 0
For i = 2 To n2
    x = Sheets(lst2).Cells(i, 2).Value
       z = 0
       For j = 2 To n1
        y = Sheets(lst1).Cells(j, 2).Value
            
            If x = y Then GoTo tren
        Next j
     Sheets(lst2).Cells(i, 2).Interior.ColorIndex = 3
     m2 = m2 + 1
            
tren:
Next i

Me.Hide
MsgBox "Отличия: на листе " & lst1 & " " & m1 & " значений; на листе " & lst2 & " " & m2 & " значений"
End Sub
KAPITOSHKARU
Сообщения: 1
Зарегистрирован: 15 дек 2010, 00:28

В продолжение темы хотелось бы уточнить некоторые особенности.
То что тут предлагается очень хорошо, но только если прайс одной фирмы и сравнивает позиции похожие буква в букву. Хотелось бы попросить умных людей помочь в сравнении нескольких файлов, потому как в одном файле пишется «плата материнская» в другом «материнская плата», либо «сгущенка Рогачев» {моя любимая ;) }, в другом «Рогачев сгущенка», в третьем «сгущенное молоко Рогачев» и т.д. Исходя из этих соображений хотелось бы Вас попросить помочь, сообразить следующее:
0я колонка – номер строчки 1го прайса
1я колонка – позиции наименования 1го прайса
2я колонка- Процентное соотношение совпадения ко второго прайса к первому.
3я колонка – наименование второго прайса
4я колонка – выключатель (если понадобиться исключить наименование [и цену] из данной строки (ячейки с наименованием и ценами будут пусты или нулевые значения)
5я колонка- Процентное соотношение совпадения ко третьего прайса к первому.
6я колонка- Процентное соотношение совпадения ко третьего прайса ко второму.
7я колонка – наименование третьего прайса
8я колонка – выключатель (если понадобиться исключить наименование [и цену] из данной строки (ячейки с наименованием и ценами будут пусты или нулевые значения)
N1я колонка- Процентное соотношение совпадения ко этого прайса к первому.
N1я колонка- Процентное соотношение совпадения ко этого прайса ко второму.
N1я колонка- Процентное соотношение совпадения ко этого прайса к третьему.
N1я колонка- Процентное соотношение совпадения ко этого прайса к предыдущему .
N2я колонка – наименование второго прайса
N3я колонка – выключатель (если понадобиться исключить наименование [и цену] из данной строки
И соответственно цены (при обнаружении минимальной цены в строке дописывать « min»)
С права установить функцию скрыть строку из команд группировки строк.

Думаю вначале можно вывести диалоговое окно с запросом количества файлов,
второе диалоговое окно спросит наименование файла, листа, столбец наименований, столбец цен и количество строк.

И так попробую привести пример

Прас 1
материнская плата 3500р
сетевая карта 500р
оперативная память 2G 1500р
Прас 2
плата материнская 3600р
память оперативная 2G 1600р
карта сетевая 400р
процессор 6000р
Прас 3
Мат. плата 6500р
Жесткий диск 3500р
Опер. память 1G 1000р
Сет. карта 200р
Проц. 5400р.

предполагаю что данную темку можно реализовать в Access
Уточнение - в место первго прайса можно содать файл с ключевыми словами введенные через точку с запятой в ячейку для поиска нужной позиции по прайсам
( мат.;материнская;плата; ), думаю это упростит задачу поиска нужного товара.
(хотел вставить табличку для примера,но не знаю как, подскажите)
Всем кто это прочитал - ставлю виртуальную бутылку пива :confused:
Ответить