2011-10-04 135 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列,但我不想讓它過於複雜。