excel - 为什么使用 Range.Resize 属性不能输出预期的 Address 属性值?

标签 excel vba

我在回答另一个问题时,在使用 Range.Resize(1, 1) 时遇到了意想不到的结果。

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

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

测试代码如下;

  • 输出到立即窗口,值为 <Target.Count> | <Target.Address>
  • Target.Resize(1, 1).Address(False, False)的结果输出到立即窗口
  • Target.Resize(1, 1).Address(False, False) 的结果赋值给 Target
  • <Target.Count> | <Target.Address>的新结果输出到立即窗口
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

Side note: The cause of the issue is Set Target = Target.Range(Target.Resize(1, 1).Address(False, False)) Specifically Set Target = Target.Range... should be Set Target = Me.Range... or just 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 ,它将调整大小为 K1Column FColumn A 右侧 5 列,Column KColumn F 右侧 5 列。

为什么会发生这种情况?

最佳答案

这一行:

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

关于excel - 为什么使用 Range.Resize 属性不能输出预期的 Address 属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67402986/

相关文章:

excel - 保护形状,以便用户可以修改但不能删除

Excel:我可以根据单元格的颜色创建条件公式吗?

excel - Excel 2010 中的 VBA : Scripting. 函数的字典返回值不会作为参数传递给包装函数调用

Python:openpyxl 将单元格填充更改为 'none' 并将边框更改为 'none'

php - 如何使用 php/mysql 强制将整数到字符串导出到 Excel?

vba - 从 Excel 保存 csv 会丢失小数点精度

vba - 为什么整数变量在 VBA Excel 中存储字符串值

excel - 工作表中最后使用的单元格

excel - 第二次运行 VBA 代码时为 "Run-time error 462 : The remote server machine does not exist or is unavailable"

excel - 比较日期并发送电子邮件