我有一个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问题还是我该怎么办?
答案 0 :(得分:1)
Name
具有两个属性RefersTo
和RefersToR1C1
,这意味着您应该分配适当的地址样式。如果您想确保获得正确的符号,则应使用ReferenceStyle
参数:
Names("Norm").RefersTo = "=" & Range("A1").Address(ReferenceStyle:=xlA1)
Names("Norm").RefersToR1C1 = "=" & Range("A1").Address(ReferenceStyle:=xlR1C1)
答案 1 :(得分:1)
修改后的代码:
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