2016-08-02 105 views
-1

由於某種原因,我的代碼不工作,我已經使用這種類型的代碼一千次,無論出於何種原因它不匹配..當列是空白但它似乎比賽?任何關於我如何改變這一點甚至改善這一點的建議,我都意識到140,000條記錄非常多!沒有通過數組循環來匹配值

Dim name1(140000) As String, name2(140000) As String, answer(140000) As String 

For i = 1 To 140000 
    name1(i) = ActiveWorkbook.Worksheets("Sheet0").Cells(i, 1).value 
    name2(i) = ActiveWorkbook.Worksheets("Sheet1").Cells(i, 6).value 
    answer(i) = ActiveWorkbook.Worksheets("Sheet0").Cells(i, 13).value 

    If name1(i) = name2(i) Then 

     answer(i) = "yes" 

    End If 
Next 
+0

爲什麼你第一次添加名字'名1()'和'名2()',然後檢查是否匹配?你唯一的目標是檢查名字是否匹配? – DragonSamu

+0

Hi @DragonSamu,從第二行開始添加名稱,如果兩張表之間的名稱匹配,則第13列在匹配行上顯示「yes」。 – Calum

+0

不會在整個範圍內粘貼公式會更快? – DragonSamu

回答

2

感謝,嗨,問題是雖然觀念正在轉變,所以在表1中的名稱可能是在「A1」,但隨後在表2是「F12」,然後下週可以在「F14」,所以它只是使用代碼的方式進行相應的更新,也用你的VBA和仍然沒有運氣:( - Calum 9分鐘前

公式是去你的正確方法。可以用COUNTIF來檢查是否存在,把這個公式放在M1單元格中並將其拉下來,

=IF(COUNTIF($F$1:$F$14000,A1)>0,"Yes","No") 

不過,如果你仍然想使用代碼,試試這個(未經測試

Sub Sample() 
    Dim name1 As Variant, name2 As Variant, answer(1 To 14000) As String 
    Dim ws As Worksheet 
    Dim i As Long 

    With ThisWorkbook 
     name1 = .Worksheets("Sheet0").Range("A1:A14000").Value 
     name2 = .Worksheets("Sheet1").Range("F1:F14000").Value 

     For i = 1 To 14000 
      If IsInArray(name1(i, 1), name2) Then answer(i) = "Yes" Else answer(i) = "No" 
     Next i 

     .Worksheets("Sheet1").Range("M1").Resize(UBound(answer), 1).Value = _ 
     Application.WorksheetFunction.Transpose(answer) 
    End With 
End Sub 

Function IsInArray(stringToBeFound As Variant, arr As Variant) As Boolean 
    Dim bDimen As Byte, i As Long 

    On Error Resume Next 
    If IsError(UBound(arr, 2)) Then bDimen = 1 Else bDimen = 2 
    On Error GoTo 0 

    Select Case bDimen 
    Case 1 
     On Error Resume Next 
     IsInArray = Application.Match(stringToBeFound, arr, 0) 
     On Error GoTo 0 
    Case 2 
     For i = 1 To UBound(arr, 2) 
      On Error Resume Next 
      IsInArray = Application.Match(stringToBeFound, Application.Index(arr, , i), 0) 
      On Error GoTo 0 
      If IsInArray = True Then Exit For 
     Next 
    End Select 
End Function 
+0

嗨,感謝這個, 雖然值正在改變的問題,所以表1中的名稱可能在「A1」,但然後在表2中的「F12」,然後下週可以在「F14」如此它只是一種使用代碼來相應更新,也使用你的vba,仍然沒有運氣:( – Calum

+0

哦,所以你想檢查它是否在任何地方在第二列? –

+0

是的,對不起,沒有設置的地方。 – Calum

0

你是第一個從Worksheet值分配給answer(i),然後分配Yes值是否匹配。

但是,該值分配給answer()而不是Cell

你需要改變:

answer(i) = "yes" 

ActiveWorkbook.Worksheets("Sheet0").Cells(i, 13).Value = "yes" 

,並徹底清除answer()


的更好的方式是這樣的:

=IF(A1=F1;"Yes";"No")