2016-06-30 82 views
1

而不是Excel VBA中的多個If ... Then語句,您可以使用Select Case結構。但是如果案件是一個長長的清單,那麼如何有效地執行這項任務呢?例如,看看以下數據:類似於VLOOKUP的功能:在VBA Excel中選擇長列表大小寫Excel

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 

我在列AA放碼ID列表,列表女子在列AB名稱的。我不會使用Select Case結構鍵入上面的列表,所以我使用下面的代碼來完成相同的任務。它與列A中的部分文本匹配並在列E中打印結果:

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 

儘管上面的代碼工作正常,但它非常耗時。有沒有更好的辦法?

回答

2

搜索一列時,我喜歡用比賽:

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

謝謝您的回答。也感謝你讓我知道MATCH功能。您的代碼使我的程序速度提高了4倍(對於3064數據大約爲7s)。我很好奇,有沒有更好的方法? –

+1

@ Anastasiya-Romanova秀看到這篇文章的速度測試與匹配VS找到與陣列:https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance -shootout /它測試了三種方法,發現使用單列匹配Application.Match的結果最快。 –

3

可以在VBA使用VLOOKUP:

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

感謝您的回答。但是使用你的代碼使得我的程序比Scott的代碼運行速度更慢(對於3064數據大約是109s)。你爲什麼不把變量'v'聲明爲'string'什麼的?你留空了。儘管速度較慢,但​​我確實在諸如'.End(xlUp)'和'IIf'等答案中學到了很多東西。無論如何,在[這個答案](http://stackoverflow.com/a/18769246/3397819)你說,引用:「根據我的經驗,Application.Match()比調用一個使用循環的函數慢十倍」。我想知道,是否有更好的VBA代碼來執行此任務而不使用Excel函數? –

+1

@ Anastasiya-Romanova秀它是作爲一個變體而存在的,就像我的代碼一樣。如果vlookup或match找不到該值,它將返回一個錯誤。如果變量被聲明爲字符串,則代碼本身會引發類型不匹配錯誤。所以我們希望它是一個變體,以便它可以漏洞和錯誤或字符串。然後,IIF在提交值之前測試錯誤。 –

+0

@ Anastasiya-Romanova秀 - 在沒有看到代碼的其餘部分的情況下很難猜出什麼是最快的,並且知道查找列表的相對大小與查找的項目數量。如果所有的「輸出」都在一個連續的範圍內,那麼基於字典的查找可以給出最佳性能,並且單個回寫到表單上。 –