VBA列值比较

时间:2011-10-04 07:10:32

标签: excel vba comparison

我有两张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列。例如,需要针对第二张纸上的列A中的所有行检查第一张纸上的列C的值101-AA-103。如果找到该值,则应显示“可用”;否则,“不可用”。如何编写VBA函数来执行此操作?

2 个答案:

答案 0 :(得分:0)

试试这个:

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整数。

答案 1 :(得分:0)

您可以使用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列,但我不想让它过于复杂。