2016-08-02 10 views
-1

Aus irgendeinem Grund funktioniert mein Code nicht, ich habe diese Art von Code tausend Mal verwendet und aus irgendeinem Grund passt es nicht .. Wenn die Spalte leer ist, scheint es jedoch Spiel? Irgendwelche Vorschläge, wie ich das ändern oder sogar verbessern kann, da ich 140.000 Datensätze realisiere, ist ziemlich viel!Kein Durchschleifen durch Array, um Werte zu entsprechen

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

Warum fügen Sie zuerst die Namen 'name1()' und 'name2()' und dann nach einer Übereinstimmung überprüft? Ist Ihr einziges Ziel zu überprüfen, ob die Namen übereinstimmen? – DragonSamu

+0

Hallo @DragonSamu, aus der zweiten Zeile der Name hinzugefügt werden, wenn die Namen zwischen den beiden Blättern übereinstimmen, dann wird die 13. Spalte anzeigen "Ja" auf der Match-Zeile. – Calum

+0

würde nicht eine Formel im gesamten Bereich einfügen schneller sein? – DragonSamu

Antwort

2

Hallo Dank dafür, das Problem aber die Werte ist verändern, so dass beim nächsten Woche der Name in Blatt 1 könnte sein, in in „A1“, aber dann in Blatt 2 wird in „F12“ und dann könnte in „F14“, so seine nur eine Möglichkeit, den Code der Verwendung entsprechend zu aktualisieren, auch Ihre vba verwendet und noch kein Glück :(- Calum 9 Minuten vor

eine Formel ist der richtige Weg zu gehen Sie. kann COUNTIF verwenden, um nach der Existenz zu suchen.Setzen Sie diese Formel in Zelle M1 und ziehen Sie sie herunter

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

Allerdings, wenn Sie noch Code verwenden möchten, versuchen Sie diese (Ungeprüfte)

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

Hallo danke dafür, das Problem ist, obwohl die Werte ändern, so der Name in Blatt 1 könnte in "A1" sein, aber dann in Blatt 2 in "F12" und dann nächste Woche könnte in "F14" so sein es ist nur eine Möglichkeit, den Code zu verwenden, um entsprechend zu aktualisieren, auch Ihre VBA und immer noch kein Glück :( – Calum

+0

Oh, also wollen Sie überprüfen, ob es irgendwo in der zweiten Spalte ist? –

+0

ja, tut mir leid, keine feste Stelle. – Calum

0

Sie zunächst einen Wert zu answer(i) aus dem Worksheet zuweisen und dann die Zuordnung der Yes Wert, wenn es passt.

Dieser Wert wird jedoch answer() nicht der Cell zugewiesen.

müssen Sie ändern:

answer(i) = "yes" 

zu

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

und entfernen answer() vollständig.


Der bessere Weg sein würde:

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