Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 是否在新工作簿中使用Personal.xlsb函数?_Vba_Excel - Fatal编程技术网

Vba 是否在新工作簿中使用Personal.xlsb函数?

Vba 是否在新工作簿中使用Personal.xlsb函数?,vba,excel,Vba,Excel,我四处搜索过,知道如何从VB宏调用Personal.xlsb中的函数,但如何调用新工作簿中使用的函数 这是我的函数,保存在我的Personal.xlsb中的'Module1'中: Public Function GetColumnLetter(colNum As Integer) As String Dim d As Integer Dim m As Integer Dim name As String d = colNum name = "" D

我四处搜索过,知道如何从VB宏调用Personal.xlsb中的函数,但如何调用新工作簿中使用的函数

这是我的函数,保存在我的
Personal.xlsb中的'Module1'中:

Public Function GetColumnLetter(colNum As Integer) As String
    Dim d As Integer
    Dim m As Integer
    Dim name As String
    d = colNum
    name = ""
    Do While (d > 0)
        m = (d - 1) Mod 26
        name = Chr(65 + m) + name
        d = Int((d - m) / 26)
    Loop
    GetColumnLetter= name
End Function
我已经创建了一个新的工作簿,我想我可以通过
=getcolumnletter(1)
调用它,但是当我开始键入
=…
时,函数不会“填充”

我是不是忽略了什么??在没有VBA的情况下,如何在其他工作簿中使用此功能


谢谢你的建议

啊,这比我想象的要简单。只需在宏之前使用工作簿名称-so

=Personal.xlsb![macroname]  

所以在我的例子中,我只是把它放进单元格:
=Personal.xlsb!GetColumnLetter(2)
要返回“B”。

正如您已经发现的,您可以在函数前面加上文件名
Personal.xlsb。但也请注意,如果要避免在函数前加前缀,有两个选项可用:

选项1
在每个调用函数的工作簿中创建一个引用。打开要使用该函数的工作簿并转到VBA编辑器。在菜单上,单击
Tools-->References…
。在出现的对话框中,勾选
Personal.xlsb
的VBA项目框。请注意,它将与其项目名称(“VBAproject”,除非您更改了默认名称)而不是文件名一起列出;如果其他工作簿处于打开状态,则可能有多个默认名称为“VBAproject”的条目,因此您可能需要先对其进行重命名。更多详细信息可在本文中找到,这篇文章在OP之后发表:

选项2
如果您想要一个真正通用的UDF,它始终不带前缀或引用,您可以将其作为一个加载项安装。这是通过将带有UDF的文件保存为
.xlam
文件(这显然是一个独立的文件,而不是
personal.xlsb
)来实现的。在同一来源的另一篇文章中提供更多详细信息:

选项3(扩展了上面@Egalth的答案): 我认为这可能是避免在函数前面加上文件名
Personal.xlsb的最佳解决方案在外部工作表调用中

在VBA属性窗口中,将Personal.xlsb This工作簿的“IsAddin”属性设置为True。现在您不必键入
Personal.xlsb在外部图纸上使用其功能时的前缀。这种行为没有记录在案

神奇的是,前缀将在对其工作表函数的现有表内调用中消失。当您在True和False之间切换IsAddin时,现有的工作表调用不会中断

优势

  • 您不必将文件另存为加载项,这样就不会同时打开加载项和原始Personal.xlsb
  • 您不必设置对它的引用
注意事项

  • 如果在工作簿打开时进行了更改,则不会提示您保存工作簿。因此,请确保手动保存更改
  • 重新打开Excel时,IsAddin将重置为False,Personal.xlsb的工作表将可见。请执行以下操作以解决此问题:
  • 将以下代码添加到此工作簿模块:
  • 专用子工作簿\u Open()

    thiswoolk.IsAddin=True

    End Sub

  • 将IsAddin设置为FALSE,转到Excel前端,确保查看的是Personal.xlsb工作表(而不是其他工作簿),然后单击“查看功能区>隐藏”。当您关闭Excel时,接受提示“将更改保存到Personal.xlsb?”现在它的外观和行为与普通的Personal.xlsb类似

  • 要保存对Personal.xlsb的未来编辑,请执行以下操作:

    • 如果处于编辑会话中,请确保在VBA项目资源管理器中选择了Personal.xlsb,然后单击“保存”
    • 如果关闭Excel,请执行上述步骤2

    是的,excel是一件不幸的事情,除非你在函数书中或者你创建了一个奇怪的add-Int,否则你将无法获得填充,因为在我看来,Personal.xlsb将是你创建/存储宏的地方,你将使用“excel范围”。这难道不是微软用于Personal.xlsb的目的吗?(尤其是在Personal.xlsb中,如果你有一个
    公共函数
    ,我自然会认为它可以在所有的工作簿中使用,而不必特别用
    =Personal.xlsb![随便什么]
    。这是一个存储子程序和函数的好地方,但不是公共函数。嗯,然后我需要阅读一下
    public
    对于函数的含义-我想这只是意味着可以在宏列表中看到a)与
    Private…相反,
    ,和B)我指的是可以从工作表中调用的函数,而不是在宏中返回某些内容的函数。我的措辞很糟糕。这太棒了!我一直都知道第二个选项,但没有意识到我也可以创建一个对我个人项目的引用。非常感谢你的回答!这里真是太棒了。正如@BruceWayne所说,选项1非常方便。我总是根据需要将我的个人功能复制并粘贴到当前项目中。请注意,这些选项仅在以下情况下有效:1)您是唯一的用户2)您始终使用同一台计算机。