首页 > 解决方案 > VBA Range.Offset 问题

问题描述

我在使用以下代码时遇到问题:

Sub UseDictionary()

    ' Get the range of values
    Dim rg As Range
    Set rg = Range("A2:B7")
    
    ' Create the dictionary
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' Fill the dictionary
    Dim cell As Range
    For Each cell In rg
        dict(cell.Value) = cell.Offset(0, 1).Value
    Next
    
    ' Perform the Lookups
    For Each cell In rg
        Debug.Print cell.Value, dict(cell.Value)
    Next

End Sub

问题是,当该行dict(cell.Value) = cell.Offset(0, 1).Value正在处理列上的单元格时B,字典项是使用列B和的值创建的C

这怎么可能,因为我设置 rg 只有两列AB?!我认为 Excel 不会创建该项目,因为当将列作为其列cell.Offset(0, 1).Value时不应该存在。cellB

那么,如何防止字典在cell.Offset(0, 1).Value引用 column时创建项目C,这些项目在我的 rg 对象中不存在?

非常感谢您提供任何线索。

标签: excelvba

解决方案


cell.Offset()是相对于范围对象计算的cell。该对象本身独立于rg您设置为的对象Range("A2:B7")。您正在循环的事实rg并不意味着循环变量cell以某种方式或其他方式是rg. 当它作为该循环的一部分cell引用时和当它直接设置为等于同一个单元格时没有区别。在任何一种情况下,它都只是一个引用的范围变量(因此自然会引用)。B2cellB2Set cell = Range("B2")B2cell.Offset(0,1)C2

在您的情况下,您似乎希望键位于 columnA中,值位于 column 中B。如果是这样,只需将您的更改rgSet rg = Range("A2:A7").


推荐阅读