Dim wshDel As Worksheet, wshAdd As Worksheet Dim i As Long, j As Long, nDoc As String, dDoc As Date, bRem As Boolean, Nrec As String, Kolvo As Long
' Определить листы для сравнения Set wshDel = ThisWorkbook.Worksheets("Удалённые") Set wshAdd = ThisWorkbook.Worksheets("Добавленные")
' Просмотр первого листа со 2 строки до первой пустой ячейки в первом столбце i = 2 Do While wshDel.Cells(i, 1) <> Empty nDoc = CStr(wshDel.Cells(i, 1)) ' Номер документа dDoc = CDate(wshDel.Cells(i, 2)) ' Дата документа Nrec = CStr(wshDel.Cells(i, 3)) 'Наименование Kolvo = CLng(wshDel.Cells(i, 5)) 'Количество
bRem = False ' Совпадение пока не произошло
' Просмотр второго листа со 2 строки до первой пустой ячейки в первом столбце j = 2 Do While wshAdd.Cells(j, 1) <> Empty ' Если найден документ, совпадающий по номеру и по дате If nDoc = CStr(wshAdd.Cells(j, 1)) And _ dDoc = CDate(wshAdd.Cells(j, 2)) And _ Nrec = CStr(wshAdd.Cells(j, 3)) And _ Kolvo = CLng(wshAdd.Cells(j, 5)) Then ' Удалить строку во втором документе wshAdd.Rows(j).Delete Shift:=xlShiftUp j = j - 1 ' На следующем шаге проверяем ту же строку bRem = True ' Установить флаг "произошло совпадение" End If j = j + 1 ' Перейти к следующей строке на первом листе Loop
' Если во втором листе встречалось совпадение, ' то удалить все аналогичные строки на первом листе If bRem Then j = i Do While wshDel.Cells(j, 1) <> Empty If nDoc = CStr(wshDel.Cells(j, 1)) And _ dDoc = CDate(wshDel.Cells(j, 2)) And _ Nrec = CStr(wshDel.Cells(j, 3)) And _ Kolvo = CLng(wshDel.Cells(j, 5)) Then ' Удалить строку в первом листе при совпадении wshDel.Rows(j).Delete Shift:=xlShiftUp j = j - 1 ' На следующем шаге проверяем ту же строку End If j = j + 1 Loop Else ' Иначе перейти к следующей строке на первом листе i = i + 1 End If Loop
' Освободить объекты листов Set wshDel = Nothing Set wshAdd = Nothing
End Sub
[/vba] здесь идёт сравнение таблиц на двух листах, по четырём переменным(nDoc,dDoc,Nrec,Kolvo). Сравнение идёт по полному совпадению... у меня такой вопрос: можно ли сделать, чтобы сравнение по переменной Kolvo было не по полному совпадению, а больше/меньше. т.е. если на первом листе KOlvo будет равно 3, а на втором 5-и, то строка удаляется с первого листа, а если на первом 5, а на втором 3, то строка удаляется со второго листа. а если ровны удаляются обе.
Здравствуйте! есть код [vba]
Код
Sub Main()
Dim wshDel As Worksheet, wshAdd As Worksheet Dim i As Long, j As Long, nDoc As String, dDoc As Date, bRem As Boolean, Nrec As String, Kolvo As Long
' Определить листы для сравнения Set wshDel = ThisWorkbook.Worksheets("Удалённые") Set wshAdd = ThisWorkbook.Worksheets("Добавленные")
' Просмотр первого листа со 2 строки до первой пустой ячейки в первом столбце i = 2 Do While wshDel.Cells(i, 1) <> Empty nDoc = CStr(wshDel.Cells(i, 1)) ' Номер документа dDoc = CDate(wshDel.Cells(i, 2)) ' Дата документа Nrec = CStr(wshDel.Cells(i, 3)) 'Наименование Kolvo = CLng(wshDel.Cells(i, 5)) 'Количество
bRem = False ' Совпадение пока не произошло
' Просмотр второго листа со 2 строки до первой пустой ячейки в первом столбце j = 2 Do While wshAdd.Cells(j, 1) <> Empty ' Если найден документ, совпадающий по номеру и по дате If nDoc = CStr(wshAdd.Cells(j, 1)) And _ dDoc = CDate(wshAdd.Cells(j, 2)) And _ Nrec = CStr(wshAdd.Cells(j, 3)) And _ Kolvo = CLng(wshAdd.Cells(j, 5)) Then ' Удалить строку во втором документе wshAdd.Rows(j).Delete Shift:=xlShiftUp j = j - 1 ' На следующем шаге проверяем ту же строку bRem = True ' Установить флаг "произошло совпадение" End If j = j + 1 ' Перейти к следующей строке на первом листе Loop
' Если во втором листе встречалось совпадение, ' то удалить все аналогичные строки на первом листе If bRem Then j = i Do While wshDel.Cells(j, 1) <> Empty If nDoc = CStr(wshDel.Cells(j, 1)) And _ dDoc = CDate(wshDel.Cells(j, 2)) And _ Nrec = CStr(wshDel.Cells(j, 3)) And _ Kolvo = CLng(wshDel.Cells(j, 5)) Then ' Удалить строку в первом листе при совпадении wshDel.Rows(j).Delete Shift:=xlShiftUp j = j - 1 ' На следующем шаге проверяем ту же строку End If j = j + 1 Loop Else ' Иначе перейти к следующей строке на первом листе i = i + 1 End If Loop
' Освободить объекты листов Set wshDel = Nothing Set wshAdd = Nothing
End Sub
[/vba] здесь идёт сравнение таблиц на двух листах, по четырём переменным(nDoc,dDoc,Nrec,Kolvo). Сравнение идёт по полному совпадению... у меня такой вопрос: можно ли сделать, чтобы сравнение по переменной Kolvo было не по полному совпадению, а больше/меньше. т.е. если на первом листе KOlvo будет равно 3, а на втором 5-и, то строка удаляется с первого листа, а если на первом 5, а на втором 3, то строка удаляется со второго листа. а если ровны удаляются обе.Espada