2016-06-30 49 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秀 - 在没有看到代码的其余部分的情况下很难猜出什么是最快的,并且知道查找列表的相对大小与查找的项目数量。如果所有的“输出”都在一个连续的范围内,那么基于字典的查找可以给出最佳性能,并且单个回写到表单上。 –