我有两张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函数来执行此操作?
答案 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,这里就是一个能够做到这一点的功能,利用字典对象和变量数组提高效率和速度。
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列,但我不想让它过于复杂。