获取没有范围的名称的值

Getting the value of a Name with no range

我有一个工作簿 UserFileBook,其中包含名称 'Version',它只是指代一个数字(它不指代任何范围,在名称管理器中它只是 'Refers to =5')。我正在尝试将此数字与不同工作簿的版本号进行比较。当我将 UserFileBook 的 'Version' 作为实际命名范围(它指的是单元格 C1,其中的值为 5)时,一切正常。但是 IdiotUser 可以直接在 sheet 上编辑该值或将其删除,所以我让它只引用一个数字,这样它只能通过管理器进行编辑。 我现在有没有办法获取该名称的值并从另一个 WB 更改它?目前我正在尝试这个:

Sub CheckVersionNumber(Vers As Long)

'Checks to see if this version is compatible with the UW version
Dim wb As Workbook
Set wb = UserFileBook

Dim UWVers As Long
UWVers = wb.Names("Version").Value 'Breaks here

'Version information is in the range "Version" on UW
If UWVers < Vers Then
    GoTo LowerVersion
    
Else
    If wb.Names("Version") > Vers Then  'tried this originally and also breaks, also if .Value is added
        GoTo UpperVersion
    End If
End If

Exit Sub

我也尝试与 wb.Range("Version"),甚至 wb.Worksheets("Sheet 1").Range("Version) 进行比较,但这些也不起作用。如果 USerFileBook 中的“Version”不引用范围,我如何引用(和更改)该值?

您不能使用 .Range,因为 Version 不是一个范围。这是一个命名公式。

不过你可以评价一下:

UWVers = wb.Worksheets(1).Evaluate("Version")

要用不同的值更新命名公式,请说 999:

wb.Names.Add "Version", 999

要使命名公式在名称管理器中不可见:

wb.Names.Add "Version", 999, True

顺便说一句...由于您在用户更改您的解决方案设置时遇到困难,您可能希望探索利用 CustomXMLParts.Add 来存储您的 Version。 CustomXMLPart 没有用户界面,但它们存储在工作簿中。访问它们的唯一方法是通过代码。普通用户永远不会看到您以这种方式存储的版本号。事实上,大多数高级开发人员也永远找不到它。

您可以使用 wb.Names("Version").Value,但它 returns 是一个字符串 >> =999。因此,您必须在分配给长值之前省略 equal-sign。

如果您想对普通用户隐藏名称,您可以将名称的可见性(在第一次添加时)设置为 false。然后名称管理器中没有显示名称。

我会创建一个函数和一个子函数。


'---> get current version
Public Function getVersion(wb As Workbook, Optional throwError As Boolean = False) As Long
    
    On Error Resume Next    'in case version does not exist function will return 0
        
    'remove =-sign as from returned value to return a long value
    getVersion = Replace(wb.Names("Version").Value, "=", vbNullString)
    
    'if useful you could throw an error here
    If Err <> 0 And throwError = True Then
        Err.Clear: On Error GoTo 0
        Err.Raise vbObjectError, , "Version hasn't been set for this workbook"
    End If
    
    On Error GoTo 0
End Function


'--->> set version
Public Sub setVersion(wb As Workbook, newVersion As Long)

    On Error Resume Next    'in case version doesn't yet exists
    wb.Names("Version").Value = newVersion
    
    If Error > 0 Then
        Err.Clear: On Error GoTo 0
        'Version name does not yet exist --> add as invisible name
        wb.Names.Add "Version", "=" & newVersion, Visible:=False
    Else
        On Error GoTo 0
    End If

End Sub

你是这样使用它们的:

Sub testVersionAsNameConstant()

    Debug.Print getVersion(ThisWorkbook, False)
    
    'comment this out if you don't want to see the error
    Debug.Print getVersion(ThisWorkbook, True)

    setVersion ThisWorkbook, 1
    Debug.Print getVersion(ThisWorkbook), "should be 1"
    
    setVersion ThisWorkbook, 2
    
    Dim checkValue As Long
    checkValue = 1
    Debug.Print getVersion(ThisWorkbook) > checkValue, "should be true"
    Debug.Print getVersion(ThisWorkbook) = checkValue, "should be false"
    
End Sub