2016-06-30 8 views
1

Statt mehrerer If ... Then Anweisungen in Excel VBA können Sie die Struktur Select Case verwenden. Aber wie führt man diese Aufgabe effizient durch, wenn der Fall eine lange Liste ist? Zum Beispiel haben suchen eine folgende Daten:SVERWEIS-ähnliche Funktion: Groß-/Kleinschreibung in VBA Excel auswählen

Code ID Girls Names 
0001 Sophia 
0002 Emma 
0003 Olivia 
0004 Isabella 
0005 Ava 
0006 Lily 
0007 Zoe 
0008 Chloe 
0009 Mia 
0010 Madison 
0011 Emily 
0012 Ella 
0013 Madelyn 
0014 Abigail 
0015 Aubrey 
0016 Addison 
0017 Avery 
0018 Layla 
0019 Hailey 
0020 Amelia 
0021 Hannah 
0022 Charlotte 
0023 Kaitlyn 
0024 Harper 
0025 Kaylee 
0026 Sophie 
0027 Mackenzie 
0028 Peyton 
0029 Riley 
0030 Grace 
0031 Brooklyn 
0032 Sarah 
0033 Aaliyah 
0034 Anna 
0035 Arianna 
0036 Ellie 
0037 Natalie 
0038 Isabelle 
0039 Lillian 
0040 Evelyn 
0041 Elizabeth 
0042 Lyla 
0043 Lucy 
0044 Claire 
0045 Makayla 
0046 Kylie 
0047 Audrey 
0048 Maya 
0049 Leah 
0050 Gabriella 
0051 Annabelle 
0052 Savannah 
0053 Nora 
0054 Reagan 
0055 Scarlett 
0056 Samantha 
0057 Alyssa 
0058 Allison 
0059 Elena 
0060 Stella 
0061 Alexis 
0062 Victoria 
0063 Aria 
0064 Molly 
0065 Maria 
0066 Bailey 
0067 Sydney 
0068 Bella 
0069 Mila 
0070 Taylor 
0071 Kayla 
0072 Eva 
0073 Jasmine 
0074 Gianna 
0075 Alexandra 
0076 Julia 
0077 Eliana 
0078 Kennedy 
0079 Brianna 
0080 Ruby 
0081 Lauren 
0082 Alice 
0083 Violet 
0084 Kendall 
0085 Morgan 
0086 Caroline 
0087 Piper 
0088 Brooke 
0089 Elise 
0090 Alexa 
0091 Sienna 
0092 Reese 
0093 Clara 
0094 Paige 
0095 Kate 
0096 Nevaeh 
0097 Sadie 
0098 Quinn 
0099 Isla 
0100 Eleanor 

Ich habe Liste der -Code ID in Spalte AA und die Liste der Girls' Names in Spalte AB. Es gibt keine Möglichkeit, die obige Liste mit der Select Case-Struktur einzugeben, also verwende ich den folgenden Code, um die gleiche Aufgabe zu erledigen. Es entspricht den Teil Text in Spalte A und das Ergebnis in der Spalte E drucken:

Sub Matching_ID() 
....................................... 
Dim ID As String, j As Integer, k As Integer, List As Integer 
List = Cells(Rows.Count, "AA").End(xlUp).Row 
ID = Mid(Cells(i, "A"), j, 4) 
For k = List To 2 Step -1 
    If ID = Cells(k, "AA").Value Then 
     Cells(j, "E") = Cells(k, "AB").Value 
     Exit For 
    Else 
     Cells(j, "E") = "" 
    End If 
Next k 
....................................... 
End Sub 

Obwohl der obige Code funktioniert gut, aber es ist wirklich zeitaufwendig. Gibt es einen besseren Weg?

Antwort

2

I Spiel wie zu verwenden, wenn eine einzelne Spalte der Suche:

Dim t 
'try to find ID 
t = Application.Match(ID, Range("AA:AA"), 0) 
'if not found t will be an error so we test that 
If Not IsError(t) Then 
    Cells(i, "E") = Cells(t, "AB").Value 
Else 
    Cells(i, "E") = "" 
End If 
+0

Vielen Dank für Ihre Antwort. Danke auch, dass Sie mich über die MATCH-Funktion informiert haben. Ihr Code macht mein Programm 4x schneller (ca. 7s für 3064 Daten). Ich bin neugierig, gibt es einen besseren Weg? –

+1

@ Anastasiya-Romanova 秀 siehe diesen Artikel über Geschwindigkeitstests mit Match vs Finde vs Arrays: https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance -shootout/testet die drei Methoden und stellt fest, dass Application.Match mit der einzigen Spaltenübereinstimmung am schnellsten ist. –

3

Sie können SVERWEIS in VBA verwenden:

Sub Matching_ID() 

    Dim ID As String, j As Long, i As Long, k As Long, List As Range 
    Dim sht As Worksheet, v 

    Set sht = ActiveSheet 
    Set List = sht.Range(sht.Cells(2, "AA"), sht.Cells(Rows.Count, "AB").End(xlUp)) 

    ID = Mid(Cells(i, "A"), j, 4) 

    'returns match or an error value if no match 
    v = Application.VLookup(ID, List, 2, False) 

    sht.Cells(j, "E") = IIf(IsError(v), "", v) 

End Sub 
+0

Danke für deine Antwort. Aber wenn Sie Ihren Code verwenden, läuft mein Programm langsamer (ungefähr 109s für 3064 Daten) als der Code von Scott. Warum hast du die Variable 'v' nicht als' string' deklariert? Du hast es leer gelassen. Obwohl es langsamer ist, lerne ich sehr viel in Ihrer Antwort wie '.End (xlUp)' und 'IIf'. Wie auch immer, in [dieser Antwort] (http://stackoverflow.com/a/18769246/3397819) hast du gesagt, Zitat: "Nach meiner Erfahrung ist Application.Match() bis zu zehn Mal langsamer als das Aufrufen einer Funktion, die eine Schleife verwendet ". Ich frage mich, gibt es einen besseren VBA-Code, um diese Aufgabe ohne Excel-Funktion auszuführen? –

+1

@ Anastasiya-Romanova 秀 Es wurde absichtlich als eine Variante, wie meiner in meinem Code. Wenn der vlookup oder die Übereinstimmung den Wert nicht findet, wird ein Fehler zurückgegeben. Wenn die Variable als String deklariert wurde, würde der Code selbst einen Typenkonfliktfehler auslösen. Also wollen wir, dass es eine Variante ist, so dass es Löcher und Fehler oder eine Zeichenkette geben kann. Dann testet der IIF den Fehler, bevor er den Wert festlegt. –

+0

@ Anastasiya-Romanova it - es ist schwierig zu erraten, was am schnellsten wäre, ohne den Rest Ihres Codes zu sehen und die relative Größe Ihrer Lookup-Liste im Vergleich zur Anzahl der Elemente, die Sie suchen, zu kennen. Wenn die gesamte "Ausgabe" in einem kontinuierlichen Bereich liegt, kann eine wörterbuchbasierte Suche mit einem einzelnen Zurückschreiben auf das Blatt am Ende die beste Leistung erbringen. –