vba excel 2010中意外自动更改a1/r1c1符号

vba excel 2010中意外自动更改a1/r1c1符号,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 此外,我还有一个名称变量(称为“Norm”),我在单元格中用

我有一个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
此外,我还有一个名称变量(称为“Norm”),我在单元格中用作下拉选项,并希望使用

With Application.Names("Norm")
    .Name = "Norm"
    .RefersTo = rng.Address
    .Comment = ""
End With
在保存之前,两者都在工作簿上运行

在vba编辑模式下保存时,一切正常,名称变量在a1表示法中具有正确的范围,规范内容根据范围


但在纯excel模式下保存会导致r1c1表示法中的范围,名称变量无法处理该范围而将其保留为空。不幸的是,我找不到任何解释或解决办法。这是excel2010版还是我能做些什么?

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

Names("Norm").RefersTo = "=" & Range("A1").Address(ReferenceStyle:=xlA1)
Names("Norm").RefersToR1C1 = "=" & Range("A1").Address(ReferenceStyle:=xlR1C1)
  • 范围是工作表的成员
  • 指定我们为工作簿的成员
  • 您可以设置一个范围对象
  • referesto应指向范围对象,而不是其地址
  • 修订守则:

    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
    

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

    rng = Application.Range("worksheet!A4:A" & _
          Worksheets("worksheet").Range("A" & rows.Count).End(xlUp).Row
    
    如果给您一个错误,您需要设置
    您的
    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
    

    非常感谢。我也试过了,但没有影响问题。但是有用的信息!非常感谢。我不知道如何正确地处理范围对象。我选择了@user10847676的答案,因为它更紧凑。但如果允许的话,我也会投你的一票。