Сравнение значений столбца VBA - PullRequest
0 голосов
/ 04 октября 2011

У меня есть два листа Excel.Первый лист содержит следующие данные:

Column C
--------
101-AA-103  
101-AA-104  
101-AA-105  
101-BB-101  

Второй лист содержит следующие данные:

Column A
--------
101-AA-100  
101-AA-101  
101-AA-102  
101-AA-103  

Я хочу сравнить столбец C первого листа со столбцом A второго листа.Например, значение 101-AA-103 из столбца C на первом листе необходимо проверить по всем строкам в столбце A на втором листе.Если значение найдено, оно должно сказать «Доступен»;в противном случае «Нет в наличии».Как я могу написать функцию VBA для этого?

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Вы можете действительно легко сделать это, используя Vlookup:

=IF(ISERROR(VLOOKUP(C1,Sheet2!A:A,1,FALSE)),"Not Available","Available")

Но поскольку вы запросили VBA, вот функция, которая сделает это, используя объект словаря и вариантные массивы для эффективности и скорости.

  • Дамп столбца C и столбца A в вариантный массив
  • Создание словаря значений столбца A
  • Поиск в записях столбца C, чтобы увидеть, существуют ли они в A
  • Переменная i также является номером строки, поэтому довольно просто поместить текст в столбец D.
Sub TestAvailability()

Application.ScreenUpdating = False
Dim varrayC As Variant, varrayA As Variant
Dim lastRow As Long
Dim dict As Object
Set dict = CreateObject("scripting.dictionary")

lastRow = Sheets(2).range("A" & Rows.count).End(xlUp).Row
varrayA = Sheets(2).range("A1:A" & lastRow).Value

lastRow = Sheets(1).range("C" & Rows.count).End(xlUp).Row
varrayC = Sheets(1).range("C1:C" & lastRow).Value

On Error Resume Next
For i = 1 To UBound(varrayA, 1)
    dict.Add varrayA(i, 1), 1
Next

For i = 1 To UBound(varrayC, 1)
    If dict.exists(varrayC(i, 1)) = True Then
        Sheets(1).cells(i, 4).Value = "Available"
    Else
        Sheets(1).cells(i, 4).Value = "Not Available"
    End If
Next

Application.ScreenUpdating = True
End Sub

Технически вы можете создать новый массив доступности и транспонировать его.в колонке D, но я не хотел делать это слишком сложным.

0 голосов
/ 04 октября 2011

Попробуйте это:

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim strToFind As String
Dim res As Range
dim maxrows as Integer

Set sh1 = ThisWorkbook.Sheets("Sheet1")
Set sh2 = ThisWorkbook.Sheets("Sheet2")
maxrows = 500

For i = 1 To maxrows
    strToFind = sh2.Cells(i, "A")
    With sh1
        Set res = .Columns("C").Find(What:=strToFind, After:=.Cells(1, "C"), LookIn:=xlValues, _
            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)
        If res Is Not Nothing Then
          'Do here what you please
        End If
    End With
Next

Обратите внимание, что вы должны вычислять maxrows и не использовать const integer.

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