2011-10-04 102 views
-2

我有两个excel表。所述第一片材具有这样的数据:VBA列值比较

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列从第二片材相比较。例如,第一张纸上C列的值101-AA-103需要与第二张纸张的A列中的所有行进行核对。如果找到该值,则应该说“可用”;否则,“不可用”。我如何编写一个VBA函数来执行此操作?

+0

嘿,我刚刚回答了你的问题,然后我怀疑你的问题是以错误的方式写的:事实上你没有拆分行,所以我认为它是一个单一的字符串。太糟糕了:( – Marco

+0

不,这是多个字,我想分割确切的单词,然后比较。A列(第1张) - > 009-AB-001-XL。 – user899902

回答

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

+0

@ user899902:不要把我的代码作为_perfect_,这只是一个想法,你可以/应该做什么 – Marco

+0

@ user899902:看看我编辑过的帖子:这段代码应该可以满足你的需求 – Marco

+0

感谢您的帮助 – user899902

0

你能做到这一点真的很容易使用VLOOKUP:

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

但既然你问了VBA,这里是一个将做到这一点,利用效率和速度的字典对象和变量数组功能。

  • 转储列C和列A分成变量数组
  • 使列A的字典值
  • 搜索通过柱C的条目,看他们是否在甲
  • 存在的变量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列,但我不想让它过于复杂。