【问题标题】:Excel VBA - How to search array and return value?Excel VBA - 如何搜索数组并返回值?
【发布时间】:2015-08-27 15:28:17
【问题描述】:

我有一些看起来像这样的数据(从 A1 开始):

Batman
Carl Reiner
Ford
Sushi

但我有一个二维数组,存储这些名称及其类型:

Dim Names()
ReDim Names(4,1)
Names(0,0) = "Batman"
Names(0,1) = "Superhero"
Names(1,0) = "Carl Reiner"
Names(1,1) = "Comedian"
Names(2,0) = "Ford"
Names(2,1) = "Car Manufacturer"
Names(3,0) = "Sushi"
Names(3,1) = "Food"

现在,我想遍历 A 列并将这些数据点替换为它们的等效类型。我认为有一种相对简单的方法可以从本质上搜索 Names(x,0) 中的“Batman”,然后将其替换为 Names(x,1)。最好的方法是什么?

我在某个地方找到了可以使用 Vlookup 的地方,所以我尝试了这个,但无济于事:

Evaluate(WorksheetFunction.Vlookup("A1",Names,1,False)

我的想法是它会寻找“蝙蝠侠”并返回“1”维度中名称中的值......但这一直给我一个错误(类型 13 不匹配)。

感谢您的任何想法/帮助!

编辑:我找到了this 的帖子,并且似乎正在使用Application.Match("A1",Application.Index(Names,0,1),0) 返回数组中“A1”的位置。现在我只需要返回偏移量并获得它的“1”位置...

编辑 2:我想我明白了。使用 MATCH 找到“A1”的位置,然后使用数组找到它:

Names(Application.Match("A1",Application.Index(Names,0,1),0),1)

所以,当 A1 是蝙蝠侠时,它在索引中找到那个位置,然后在第二维中找到等效的返回。 (对不起,缺乏语义,我不太清楚如何引用这个,所以如果我能澄清,请告诉我)。

【问题讨论】:

    标签: arrays vba excel


    【解决方案1】:

    使用字典似乎会更容易。

    Sub testing()
        Dim dic As Object
        Set dic = CreateObject("scripting.dictionary")
    
        With dic
            .Add "Batman", "Superhero"
            .Add "Carl Reiner", "Comedian"
            .Add "Ford", "Car Manufacturer"
        End With
    
        MsgBox "Batman is a " & dic.Item("Batman")
    
    End Sub
    

    【讨论】:

    • 是的!这真是太好了。完美地工作,并且将帮助我处理一些其他宏,其中我对数组有一些复杂的使用。非常感谢!
    【解决方案2】:

    我认为,如果您想使用工作表函数,则必须将数据放入工作表(例如一列或一对列)而不是数组。不过,这很容易做到,您可以使用不同的工作表,甚至是另一个工作簿,并且有隐藏这些工作表的解决方案,因此您的用户不必看到这些数据使其他工作表变得混乱。

    【讨论】:

    • 我已经考虑过了(把这些东西放到一个单独的工作表中,并从那里使用常规的 Vlookup),但我对数组很好奇,因为如果我把它放在一些外部工作表中,我必须有我的代码中引用的工作表,打开它,运行查找。如果我的一个数据点(在 A 列中)不在数组中,则更大的痛苦来自 - 我编写提示以将其添加到该外部工作表、保存等。我可以这样做,但很好奇是否有办法这样做绕过外部的东西,只使用一个数组。
    • 您可以在同一个工作簿中创建一个隐藏的临时工作表,用数组内容填充它,然后运行工作表函数,然后删除隐藏的临时工作表(或将其隐藏并保存以及其他工作表)。
    • 是的,我已经将这个想法与其他宏一起使用,但我正在尝试了解更多关于 VBA 的信息,以便我可以 A) 减少代码,B) 减少对此类工作表的需求,以及 C ) 让宏运行得更快。感谢您的帮助!
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多