【问题标题】:Excel VBA: Unexpected result with Range and CellsExcel VBA:范围和单元格的意外结果
【发布时间】:2016-06-17 23:38:24
【问题描述】:

我使用的是 Excel 2013。在我的代码中,我指的是我必须在 Excel 工作表中操作典型数据。例如:

    **Names**  
       Ann  
       Jim  
       Tom  
       Liz  

在引用数据集中的特定单元格时,我不想在代码中包含 +1

即,要获得“安”,我宁愿使用

Cells(1,1)

Cells (1+1,1)

所以我定义了一个不包括标题的范围:

Set R = Range(Cells(2,1),Cells(5,1)

现在这句话指的是“安”

R.Cells(1,1)

接下来我想引用我范围内的“子范围”R

    R.Range(R.Cells(2,1), R.Cells(3,1))

但令人惊讶的是,现在,我得到的不是预期的“Jim”和“Tom”(我的范围 R 中的第二到第三个单元格),而是“Ann”和“Jim”(第二到第三个Excel 工作表)。

谁能提供一些关于我在这里缺少什么的见解?

谢谢

【问题讨论】:

    标签: excel range cells vba


    【解决方案1】:

    这是不继承血统的经典案例。 R.Range(Cells(2,1), Cells(3,1)) 中的 Cells 不知道它们属于 R,因此它们默认为 ActiveSheet property,这可能是也可能不是 R 所在的工作表(更多问题与 下标超出范围错误)。

    with R
        debug.print .Range(.Cells(2,1), .Cells(3,1)).address
    end with
    

    With ... End With statement 是传递继承血统的最简单方法。请注意,.Cells 而不是 Cells 用于传递引用。也可以写成,

        debug.print R.Range(R.Cells(2,1), R.Cells(3,1)).address
    

    示例子:

    Sub Unexpected_result_with_Range_and_Cells()
        Dim R As Range
    
        Set R = Range(Cells(2, 1), Cells(5, 1))
        Debug.Print R.Address
        Debug.Print R.Cells(1, 1).Value
    
        With R
            Debug.Print .Range(.Cells(2, 1), .Cells(3, 1)).Address
            Debug.Print .Cells(2, 1).Value
            Debug.Print .Cells(3, 1).Value
        End With
    
    End Sub
    

    来自 VBE 的即时窗口的结果:

    $A$2:$A$5
    Ann
    $A$4:$A$5
    Jim
    Tom
    

    【讨论】:

    • 很抱歉,事实并非如此。这是我的第一个想法,但是在包含对“R”的引用之后(我编辑了上面的代码,顺便说一句),行为保持不变
    • 对... $A$4:$A$5TomLizR.Range(R.Cells(2, 1), R.Cells(3, 1)) 应该是 JimTom。顺便说一句,我非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多