首页 > 解决方案 > 为什么使用 Range.Resize 属性不会输出预期的 Address 属性值?

问题描述

我正在回答另一个问题,但在使用Range.Resize(1, 1).

如果用户选择了超过 1 个单元格,我正在寻找调整Target属性的大小。Worksheet_SelectionChange具体来说,我打算将范围更改Target为所选范围的左上角单元格。

我注意到在测试这个时,调整大小的Target范围并不总是会产生预期的单元格,通常会导致列或行不在原始选择范围内。

测试代码如下;

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Debug.Print Target.Count & " | " & Target.Address(False, False)
   Debug.Print "Resize Address: " & Target.Resize(1, 1).Address(False, False)
   Set Target = Target.Range(Target.Resize(1, 1).Address(False, False))
   Debug.Print Target.Count & " | " & Target.Address(False, False)
End Sub

旁注:问题的原因是Set Target = Target.Range(Target.Resize(1, 1).Address(False, False))具体Set Target = Target.Range...应该是Set Target = Me.Range...或只是Set Target = Range

考虑在工作表上进行以下选择;

Range("A1:C10)Range(C1:E10")

我希望Debug.Print我的测试代码的方法输出:

30 | A1:C10
Resize Address: A1
1 | A1
30 | C1:E10
Resize Address: C1
1 | C1

我得到的结果是:

30 | A1:C10
Resize Address: A1
1 | A1
30 | C1:E10
Resize Address: C1
1 | E1    '<~~~~~ 

尽管从 resize 属性返回的地址C1是设置的范围,因为E1 我注意到它似乎将新列设置在新目标列的右侧,但新目标列左侧的列数(即,如果我F1:F10在工作表上选择,它将调整为K1.Column F右侧的5 列Column A和.Column K右侧的 5 列Column F

为什么会这样?

标签: excelvba

解决方案


这一行:

Target.Range(Target.Resize(1, 1).Address(False, False))

正在采用现有范围内的范围。当该范围从 A1 开始时,.resize(1, 1)索引为 1,因此不会偏移原始范围。

当您从 C1 开始时,.resize(1, 1)现在的索引为 3,该范围的相对索引为 C - 1、D - 2、E - 3。当您获取范围的范围时,它偏移 3 给您 E1。

Private Sub test()
    Dim r As Range
    Set r = Range("A1:E10")
    Debug.Print r.Address, r.Resize(1, 1).Address, "Normal Resize"
    Debug.Print r.Address, r.Range(r.Resize(1, 1).Address).Address, "Range offset resize"
    Set r = Range("C1:E10")
    Debug.Print r.Address, r.Resize(1, 1).Address, "Normal Resize"
    Debug.Print r.Address, r.Range(r.Resize(1, 1).Address).Address, "Range offset resize"
End Sub

推荐阅读