0

我有一个用来进行计算的 XLA,我想在名称管理器中创建变量以用于这些计算。我想检查那些名为 ranged 的​​人是否已经存在,如果没有,让用户为它们赋值。我有一个 Sub() 用于设置名称管理器 - 下面的示例 - :

Public Sub SetNames()
On Error Resume Next
   IsRangeName = CheckName("test")

If IsRangeName = Empty Then
   Application.ThisWorkbook.Names.Add Name:="test", RefersTo:=0
End If

End Sub

如果我进入“宏”菜单并运行 SetNames 例程,它将起作用并在名称管理器中设置 test = 0。

但是,我想要做的是通过一个函数运行它,并允许函数使用名称管理器中的变量(如果它们存在),如果它们不存在,那么这些值通过在名称管理器中设置为初始值子程序。

当我尝试运行以下代码时,从未在名称管理器中设置值:

Sub Function1()
   Call SetNames()

   -Do Other Things-

End Function

所有名称都声明为全局变量。

目的是让用户安装插件,并在使用插件的第一个函数调用中设置名称管理器,以初始化名称或允许用户设置初始值。我不希望用户通过宏功能区选项并执行子例程来初始化名称管理器名称。

对此的任何帮助将不胜感激。

4

2 回答 2

0

不确定您的脚本中的“CheckName”是什么 - 您没有提供它..但是,我让它通过以下方式工作:

1) 注释掉 On Error Resume Next - 这允许您看到 CheckNames 失败。

2) 用循环替换 CheckNames 以循环抛出定义的名称,寻找我们的。

3)将您的“功能”定义从“子”更改为“功能”。

测试一下,运行良好。如果不存在,则设置“测试”名称。手动将其更改为另一个值,再次运行,不要触摸它。

  Public Sub SetNames()
  'On Error Resume Next
    For i = 1 To Application.ThisWorkbook.Names.Count
      If Application.ThisWorkbook.Names(i).Name = "test" Then
         IsRangeName = True
         Exit For
      End If
    Next i

  If Not IsRangeName Then
     Application.ThisWorkbook.Names.Add Name:="test", RefersTo:=1
  End If

  End Sub

  Function Function1()
     Call SetNames

     '-Do Other Things-

  End Function
于 2015-02-09T20:42:44.357 回答
0

似乎在我的快速测试中有效,但您应该确保它在您的最终用例中都能执行。这是对 UDF 能够更新工作簿的限制的一种破解,因此它超出了“正常”使用范围。

Sub SetNameIfMissing(swb As String)

    Dim r As Name, wb As Workbook
    Set wb = Workbooks(swb)
    On Error Resume Next
    Set r = wb.Names("test")
    On Error GoTo 0

    If r Is Nothing Then
        Debug.Print "adding name..."
        wb.Names.Add "test", 99
    Else
        Debug.Print "already added"
    End If

End Sub


Function SetIt(v)

    Dim wb
    wb = Application.Caller.Parent.Parent.Name

    'using Evaluate gets around the UDF restriction
    Application.Caller.Parent.Evaluate "SetNameIfMissing(""" & wb & """)"

    SetIt = "OK" 'or whatever return value is useful...

End Function
于 2015-02-09T21:56:01.703 回答