2012-02-22 66 views
0

vba新增功能,以及如何解決某個範圍內的元素。 我添加具有id索引的細胞(行)範圍內的字典Excel vba - 範圍訪問元素

Set spRange = import.Range("A2:" & spRange.End(xlDown).Address) 
    For Each cell In spRange 
     dict.Add cell.Offset(0, 2).Text, cell.Row 

Next cell 

以後,我檢索該行,並且需要訪問第一個元素的值。

For Each x In dict 
     Set spRange = dict.Item(x) 
     'how to get value of first element of spRange 
Next 

這可能是ü很容易,但我不熟悉的API :-)

感謝

+1

'Row'只是行號:如果你想存儲的全部行,然後使用'cell.EntireRow' – 2012-02-22 21:28:07

+1

如果你想獲取存儲在字典中的值,只需使用'字典。項目(x)'其中'x'是行號。如果要檢索存儲在另一列中的值,請使用'Cells(x,y).Value',其中'x'是行號,'y'是列號。 – Cutter 2012-02-22 22:25:56

回答

3

bsreekanth

Dictionary對象,如果我沒看錯的第一次作爲VB腳本2的一部分在1996年退出,後來被添加到VB Scripting運行時庫(scrrun.dll)中。要使用Dictionary對象,您必須添加對Microsoft腳本運行時的引用。

添加項目到字典的語法是

DictObject.Add **<Unique key>**,Value 

的關鍵必須是唯一否則你會得到一個錯誤。讓我們介紹不同的場景以瞭解它的工作原理。

讓我們舉個例子

我們存儲行(而不是單元格文本),然後檢索行號

Sub Sample() 
    Dim spRange As Range 
    Dim Dict As Dictionary 
    Dim j as long 

    Set spRange = Range("A1:A10") 
    Set Dict = New Dictionary 

    j = 1 

    For Each cell In spRange 
     Dict.Add j, cell.Row 
     j = j + 1 
    Next cell 

    Dim x As Variant 

    For Each x In Dict 
     Debug.Print Dict(x) 
    Next 
End Sub 

如果您發現我使用變量「j」創建唯一鍵,然後存儲行值。

要檢索存儲的行值,我然後遍歷Dictionary對象。

現在回到你的問題。

後來,我檢索行,需要訪問第一個元素的值。

這是我有點困惑的一部分。原因在於,如果您想要獲得spRange範圍內特定行的值,那麼爲什麼您要使用字典對象?

您可以使用此代碼

Debug.print spRange.Cells(1, 1).Value 

直接獲得的價值。如果你仍然想使用字典對象,那麼你可以使用下面的代碼

Sub Sample() 
    Dim spRange As Range 
    Dim Dict As Dictionary 

    Set spRange = Range("A1:A3") 
    Set Dict = New Dictionary 

    j = 1 

    For Each cell In spRange 
     Dict.Add j, cell.Row 
     j = j + 1 
    Next cell 

    Dim x As Variant 

    For Each x In Dict 
     Debug.Print spRange.Cells(Dict(x), 1).Value 
    Next 
End Sub 

,如果你的目的是要將範圍值存儲在字典中,然後基於特定鍵(行號)檢索該值,然後您可以使用此代碼

Sub Sample() 
    Dim spRange As Range 
    Dim Dict As Dictionary 

    Set spRange = Range("A1:A3") 
    Set Dict = New Dictionary 

    For Each cell In spRange 
     '~~> See how I reversed it? 
     Dict.Add cell.Row, cell.Text 
    Next cell 

    Dim x As Variant 

    For Each x In Dict 
     Debug.Print Dict(x) 
    Next 

    'OR 

    'Debug.Print Dict(2) 
End Sub 

現在最後一點。如果你不打算循環Dictionary對象來檢索值,但打算使用類似「Debug.Print Dict(2)」的東西,那麼我會建議使用額外的一段代碼,它首先檢查元素是否存在或不,然後顯示它。例如

If Dict.Exists(2) Then Debug.Print Dict(2) 

HTH

讓我知道如果您有任何問題。

希德