2015-06-11 472 views
0

我有一些數據,看起來像這樣(在A1開始):Excel VBA - 如何搜索數組和返回值?

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列,並用相應的類型替換這些數據點。我認爲會有一個相對簡單的方法來實質上搜索「蝙蝠俠」的名稱(x,0),然後用名稱(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是蝙蝠俠,發現在索引那個位置,然後發現在同等回報第二個維度。 (對不起,由於缺乏語義,我不知道如何引用這個,所以請讓我知道,如果我可以澄清)。

回答

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 
+0

是的!這真是太好了。完美的工作,並會幫助我與其他一些宏,我有一些令人費解的陣列使用。萬分感謝!! – BruceWayne

0

我想如果你想使用工作表函數,你必須把數據放入工作表(例如一列或一列)而不是數組。但是,這很容易實現,而且您可以使用不同的工作表或者其他工作簿,並且有解決方案可以隱藏這些工作簿,因此您的用戶不必看到數據混亂的其他工作表。

+0

我曾經想過(把東西到一個單獨的工作表,使用常規VLOOKUP從那裏),但我很好奇的陣列,因爲如果我把這個一些外部的工作表,我必須有表在我的代碼中引用,打開它,運行查找。如果我的一個數據點(在列A中)不在陣列中,我會寫出提示將它添加到外部表格,保存等等,這樣會產生更大的痛苦。我可以這樣做,但是好奇的是,如果有辦法做這個繞過外部的東西,只是使用一個數組。 – BruceWayne

+0

您可以在同一工作簿中創建一個隱藏和臨時工作表,使用數組內容填充它,然後運行工作表函數,然後刪除隱藏的臨時工作表(或將其隱藏起來並讓其與其他工作表一起保存)。 –

+0

是的,我已經用其他宏的想法,但我想了解更多關於VBA的地方,我可以A)削減代碼,B)減少這種表的需要,和C)宏運行更快。謝謝你的幫忙! – BruceWayne