Excel访问某个范围的元素



vba新手,想知道如何寻址范围内的元素。我将用id索引的单元格(行)范围添加到字典

 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:-)

感谢

bsreekanth

Dictionary对象,如果我没有错的话,早在1996年就作为VB Script 2的一部分出现了,后来被添加到VB Scripting运行库(scrrun.dll)中。要使用Dictionary,必须添加对Microsoft Scripting Runtime的引用。

向字典中添加项目的语法是

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中特定行的值,那么为什么要使用dictionary对象?

您可以使用此代码直接获取值

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-

如果你有任何问题,请告诉我。

Sid

最新更新