VBA列表引用

时间:2014-08-18 16:05:40

标签: excel vba lookup

我想在excel VBA中将多维列表存储到内存中以执行查找功能。使用可以是字母数字的供应商ID,返回与该供应商关联的其他三个值。以邮寄地址为例。我列出了与我做生意的所有供应商以及他们的邮寄地址。在为这些供应商创建发票时,我希望能够根据其名称查找/引用其邮寄地址第1行,第2行,邮政编码等。

数据存储为

"Abc Corportation", 123 main st, New York, New York, 12345  
"My Company", 456 not here, Buffalo , Newy York, 12367  
etc.  

创建帐单时,我有"Abc Corportation",我想要返回123 Main st, new york new york.

每次我想查找供应商地址时,我宁愿不必创建一个循环来扫描列表。

2 个答案:

答案 0 :(得分:0)

向David Zemens提出回答/问题的道具,只要数据的格式与最左列中的索引一致,vlookup即可。

 aValue = "ABC Company"

 answer = ""

 Dim myRange As Range
 On Error Resume Next
 Set myRange = Worksheets("Vendor Lookup").Range("A1:D99")
 answer = Application.WorksheetFunction.VLookup(aValue, myRange, 2, False)
 If answer <> "" Then MsgBox (answer)

感谢所有人的快速回复。

答案 1 :(得分:0)

凯文 - 第一:恭喜找到自己的解决方案!我希望你不介意我在这里根据你原来的解决方案向你展示一些东西。

有了类似这样的问题,有很多方法可以做到这一点。我只是想向您展示一些改进现有解决方案的方法,而不是向您展示其他方式。

首先,声明所有变量,然后像允许一样强烈地输入它们。这有助于避免难以发现的错误。在相关的说明中,使用每个模块顶部的Option Explicit将有助于强制执行此操作。虽然有时似乎是PITA声明所有,但花费小时调试简单的印刷错误会更加不方便。

注意:在某些其他语言(如python)中,这样的行意味着answer的类型为string

answer = ""

但是,在vba中,任何未声明的变量都是Variant类型,它基本上可以是任何东西。以下两行将引发VBA中的任何错误:

answer = "hello, world!"
Set answer = CreateObject("Wscript.Shell")

如果您必须使用On Error Resume Next,请确保您尽早执行On Error Goto 0以恢复正常的错误处理,但通常最好在预期/已知错误情况下捕获并编程。

我将answer声明为Variant(而非String),以便使用与Application.Vlookup略有不同的WorksheetFunction.Vlookup函数。如果找不到值,后者将引发错误1004错误,而Application.Vlookup将返回错误类型值,与使用笨重的On Error Resume Next相比,这可能更适合测试。

Dim answer as Variant
Dim aValue as String
Dim myRange as Range

aValue = "ABC Company"
Set myRange = Worksheets("Vendor Lookup").Range("A1:D99")
answer = Application.Vlookup(aValue, myRange, 2, False)
If Not IsError(answer) Then MsgBox answer