2011-09-14 14 views
1

我有兩張不同的圖紙,其中包含500多個名稱。我需要查看一張紙上的名字是否存在於另一張紙上。如果它在指定的列中確定是或否。使用VBA檢查單元格值是否存在於兩張不同的圖紙中

這個名字在一張紙上就像是ASmith,然後是另一張紙上的ASMITH,因此不需要區分大小寫。

我很困惑的VBA部分。我在java中編程,在java中做這種事對我來說很簡單。但在Excel中,並不是那麼重要。你的幫助表示讚賞。 TIA

+0

你只需要比較一個列表與另一個列表,還是兩者對彼此? –

+0

你有沒有考慮過VLookUp http://office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx? – Fionnuala

+0

應該提及在哪張表和哪張表上指定的列?爲什麼你不解釋它更簡單的方式比我們可以幫助你,而不是做出假設 – niko

回答

1

首先,Visual Basic不關心區分大小寫,所以當比較兩張表時,您需要使用VBA.UCase將所有內容轉換爲大寫。我還包括修剪功能,因爲這個詞本身可能有空格。任何需要創建兩個可比較字符串的文本操作都必須進行研究。我推薦使用expert guidance來處理Excel宏中的文本字符串

因此......假設兩張表都在同一個工作簿中,最好的出發點是從Visual Basic編輯器中獲取兩張表的代號(默認情況下,Sheet1/Sheet2等)。在下面,我假定Sheet1是輸出表格,而Sheet2是您正在搜索的數據。如果你不能罰款代號,你可以在下面的代碼替換表(「SheetName1」)和表(「SheetName2」):

Dim SourceRow as Long 
Dim DestRow as Long 

For DestRow = 1 to 10 
     For SourceRow = 1 to 10 

      If VBA.Trim(VBA.UCase(Sheet1.Cells(DestRow,"DestCol"))) = VBA.Trim(VBA.UCase(Sheet2.Cells(SourceRow,"SourceCol"))) then 
      Sheet1.Cells(DestRow,"OutputCol") = "Yes" 
        Goto NextDestRow 
      End If 
     Next SourceRow 

Sheet1.Cells(DestRow,"OutputCol") = "No" 

NextDestRow: 
Next DestRow 

的代碼假定您在單個列搜索數據在每張紙上以及我寫過「DestCol」和「SourceCol」的地方,你應該簡單地插入該列的數值(其中A = 1,B = 2等)。 「OutputCol」是要將輸出放置在目標工作表上的列

循環假定您對每張工作表上的行1至10感興趣;根據需要調整

+0

非常感謝!這使我無意識地比較了500個參賽作品。 :) – Eric

+0

如果這完全解決了您的問題,如果您可以將其標記爲完整的解決方案,那將是一件好事。乾杯 –

+1

使用Ed的方法,建議使用幾個Mod:(1)一旦YesFlag = 1就立即退出If測試,而不是繼續進行冗餘檢查(ii)運行Find例程或使用變體數組而不是Range循環將顯着減少代碼運行時間 – brettdj

1

嘗試是這樣的:

Sub HTH() 

    With Sheet1.Range("B1", Sheet1.Cells(Rows.Count, "B").End(xlUp)) 
     .FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC[-1],Sheet2!C[-1],1,FALSE)),""NO"",""YES"")" 
     .Value = .Value 
    End With 

End Sub 

注意

假設查找值在Sheet1列A,查找列是Sheet2的A列宿是/否在Sheet1中柱B顯示是否找到值。 Vlookup不區分大小寫。您將需要更改R1C1參考/列以適合您的工作簿。

它會執行得非常快。

相關問題