Проверьте один список против другого списка (VBA), используя LBound и UBound. Или любым способом, который работает - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь сравнить список заказов с открытым списком заказов и очистить ячейку от Список заказов, если его нет в открытом списке заказов. Я пробовал несколько вариантов кода (ниже), и это дает мне ошибку Несоответствие. Обычно я делаю что-то вроде i = от 0 до 5, но именно тогда я узнаю точную длину списка. Делать это, не зная длины, было проблемой. Любая помощь будет очень высоко ценится.

Sub POCheck()
Dim OpenPO As Worksheet
Set OpenPO = Worksheets("OpenPO")
Dim All As Worksheet
Set All = Worksheets("All")
Dim OpenPOList As Variant
OpenPOList = OpenPO.Range("A2:A" And LastRowPO).Value
Set AllPO = All.Range("B2:B" & LastRow)
Dim i As Long
LastRow = All.Range("AH" & Rows.Count).End(xlUp).Row
LastRowPO = OpenPO.Range("A" & Rows.Count).End(xlUp).Row

For Each cell In AllPO.Cells
For i = LBound(OpenPOList) To UBound(OpenPOList)
Found = False
If Not cell.Find(OpenPOList(i)) Is Nothing Then
Found = True
Exit For
End If
Next i
If Not Found Then cell.Value = ""
Next cell

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вы можете сделать vlookup, чтобы увидеть, существует ли он, и затем очистить значение, если vlookup в соседней ячейке не # N / A?

Или выполнить цикл вниз по первому списку и выполнить указатель в VBA, чтобыпосмотреть, находится ли он в другом списке, очистить его?

Так могут ли способы сделать это и в VBA ...

0 голосов
/ 20 ноября 2018

Очень быстро использовать массивы и Application.Match, чтобы увидеть, находится ли текущее значение в массиве, содержащем значения для сопоставления. Нет зацикливания ячеек и данные считываются и записываются за один раз.

Option Explicit
Public Sub POCheck()
    Dim openPO As Worksheet, all As Worksheet, lastRow As Long, lastRowPO As Long
    Set openPO = ThisWorkbook.Worksheets("OpenPO")
    Set all = ThisWorkbook.Worksheets("All")

    With all
        lastRow = .Range("AH" & .Rows.Count).End(xlUp).Row
    End With
    With openPO
        lastRowPO = .Range("A" & Rows.Count).End(xlUp).Row
    End With

    Dim openPOList(), allPOList(), i As Long
    openPOList = Application.Transpose(openPO.Range("A2:A" & lastRowPO))
    allPOList = Application.Transpose(all.Range("B2:B" & lastRow))

    For i = LBound(allPOList) To UBound(allPOList)
        If IsError(Application.Match(allPOList(i), openPOList, 0)) Then
            allPOList(i) = vbNullString
        End If
    Next
    openPO.Range("A2").Resize(UBound(allPOList), 1) = Application.Transpose(allPOList)
End Sub
0 голосов
/ 20 ноября 2018

Рекомендуется добавлять Option Explicit в начало модулей кода и объявлять переменные с правильными типами данных.

Dim LastRow As Long, LastRowPO As Long

Использовать & неAnd при объединении строк.

OpenPOList = OpenPO.Range("A2:A" And LastRowPO).Value

LastRowPO используется до установки его значения.

LastRowPO = OpenPO.Range("A" & Rows.Count).End(xlUp).row
OpenPOList = OpenPO.Range("A2:A" & LastRowPO).Value

Используйте Range.Find для поискагруппа ячеек, а не одна ячейка.

Если не ячейка. Поиск (OpenPOList (i)) тогда ничто* сопоставление уникальных значений значительно быстрее, чем использование вложенных циклов.Смотреть: Введение в Excel VBA, часть 39 - Словари .

Вы должны загрузить RubberDuck и часто использовать его средство форматирования кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...