VBA Excel 2010中意外的自主更改A1 / R1C1表示法

时间:2018-12-30 10:50:10

标签: excel vba excel-vba

我有一个excel / vba问题,该问题似乎发生在excel2010中,但没有在excel2016中发生。对我来说,这是a1和r1c1表示法之间不可理解的转换。

我的范围是动态的

Dim rng As Range
rng = Application.Range("worksheet!A4:A" & _
      Worksheets("worksheet").Range("A" & rows.Count).End(xlUp).Row

我还有一个名称变量(称为“标准”),我在单元格中用作下拉选项,并希望根据动态范围使用它来更新

With Application.Names("Norm")
    .Name = "Norm"
    .RefersTo = rng.Address
    .Comment = ""
End With

两者都在Workbook_BeforeSave上运行。

在vba编辑模式下保存时,所有内容均按预期方式工作,名称变量的a1表示法的范围正确,并且Norm的内容取决于该范围。

但是以纯Excel模式保存会导致r1c1表示法中的范围,名称变量无法对其进行处理,将其保留为空。不幸的是,我找不到任何解释或解决方案。这是excel2010问题还是我该怎么办?

3 个答案:

答案 0 :(得分:1)

Name具有两个属性RefersToRefersToR1C1,这意味着您应该分配适当的地址样式。如果您想确保获得正确的符号,则应使用ReferenceStyle参数:

Names("Norm").RefersTo = "=" & Range("A1").Address(ReferenceStyle:=xlA1)
Names("Norm").RefersToR1C1 = "=" & Range("A1").Address(ReferenceStyle:=xlR1C1)

答案 1 :(得分:1)

  1. 范围是工作表的成员。
  2. 命名我们为工作簿的成员。
  3. 您设置范围对象。
  4. RefersTo应该指向范围对象,而不是其地址。

修改后的代码:

Dim rng As Range

WITH THISWORKBOOK.WORKSHEETS("worksheet")
    SET rng = .Range(.cells(4, "a"), .cells(.rows.count, "a").end(xlup))
end with

With thisworkbook.Names("Norm")
    .Name = "Norm"    'totally redundant, it already has a name identified in the line above
    .RefersTo = rng   'no address, just rng
    .Comment = ""
End With

答案 2 :(得分:1)

首先,您没有正确设置rng对象:

rng = Application.Range("worksheet!A4:A" & _
      Worksheets("worksheet").Range("A" & rows.Count).End(xlUp).Row

应该给您一个错误,您需要Set对象rng,请参见下面的代码:

Dim Sht As Worksheet
Dim Rng As Range, LastRow As Long

' set the worksheet object
Set Sht = ThisWorkbook.Worksheets("worksheet")

With Sht
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row ' get last row with data in column A

    ' set the Range object
    Set Rng = .Range("A4:A" & LastRow)
End With

' updating the range that "Norm" refres to
With ThisWorkbook.Names("Norm")
    .RefersTo = Rng
End With