我最近观察到一些让我困惑的事情:
我使用vba在工作表上给出了一个特定名称的范围:
wks.Names.Add name:="databases", RefersTo:="=" & "$F$7:$F$" & j
这对我来说完全没问题,可以在名称管理器中看到正确引用的名称。
在下一行代码中,我想使用添加注释到此名称
ActiveWorkbook.Names("databases").Comment = "created automatically by <sub> on " & Now()
将此注释添加到名称时,将更改名称的引用,并且名称不再起作用。我真的很感兴趣为什么会这样。
我已经能够在Excel 2016中重现该问题。它不会在Excel 2010或2013中发生。这是.Comment实现中的错误。
解决方法:
sRefersTo= "Sheet1!$a$3"
Set MyName = .Names.Add(sName, sRefersTo)
With MyName
.Comment = "created automatically by <sub> on " & Now()
' .RefersTo has been changed to Sheet1!'R3C1' (note the extra '')
.RefersTo= sRefersTo ' This fixes by re-setting
End With
尝试类似下面的代码:
Sub DefandModNames()
'
Dim MyName As Name
Dim wks As Worksheet
Set wks = Worksheets("Sheet1") '<-- modify "Sheet1" to your sheet's name
'j = 10 '<-- for my tests only
With ActiveWorkbook
Set MyName = .Names.Add(Name:="databases", RefersTo:="=" & wks.Name & "!$F$7:$F$" & j)
With MyName
.Comment = "created automatically by <sub> on " & Now()
End With
End With
End Sub
我无法重新创建问题但我建议在声明中更明确以避免歧义。
例如,你的wks
可以引用名为DB_Data
的表,并且命名范围工作正常,但ActiveWorkbook
指的是当时活动的工作簿,它可能不是wks
所在的工作簿。
通过明确表示您确切知道您正在处理什么,即
Public Sub Sample()
Dim WkBk As Excel.Workbook
Dim WkSht As Excel.Worksheet
Dim Nm As Excel.Name
Set WkBk = Application.Workbooks("Book1")
Set WkSht = WkBk.Worksheets("DB_List")
Set Nm = WkSht.Names.Add(Name:="databases", RefersTo:="=" & WkSht.Name & "!$F$7:$F$20")
Nm.Comment = "Created automatically by <sub> on " & Now()
Set Nm = nothng
Set WkSht = Nothing
Set WkBk = Nothing
End Sub