Excel vba - 范围的访问元素

时间:2012-02-22 21:18:11

标签: excel vba excel-vba

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

感谢

1 个答案:

答案 0 :(得分:3)

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 Objects。

现在回到你的问题。

  
    
      

稍后,我检索该行,并需要访问第一个元素的值。

    
  

这是我有点困惑的部分。原因是,如果您只想获取范围 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

如果您有任何问题,请与我们联系。

西特