跳至主要内容

如何在Excel的所有工作簿中保存并使用您的VBA宏?

Author: Zhoumandy Last Modified: 2025-07-21

在许多情况下,您可能需要在不同的Excel工作簿中重复使用相同的VBA宏来完成任务,例如自动化重复计算、数据格式化或自定义函数(如将数字转换为大写金额)。一个常见的挑战是,默认情况下,宏仅存储在创建它们的工作簿中,这意味着您无法轻松地在新文档中访问或重用它们。然而,Excel提供了几种灵活的方法,使VBA宏可以全局使用,从而无需每次启动新工作簿时都重新复制代码。本教程提供各种方法的全面指导,以确保您的VBA宏能够轻松地在所有工作簿中访问,提高您的生产力和工作流程效率。

A screenshot showing the Add-ins dialog in Excel

在所有工作簿中保存并使用VBA代码
个人宏工作簿方法


在所有工作簿中保存并使用VBA代码

例如,假设您希望使用自定义的VBA代码将数字转换为等效的英文单词,并确保无论在哪一个工作簿中操作,此功能始终可用。通过正确的方法,您可以保存VBA模块,以便在Excel中随时重用它们。这在您希望每次都能访问自定义函数或自动化时特别有帮助,而无需在多个文件中重复代码。

为此,您可以将VBA代码打包为自定义的Excel加载项。此加载项可以在Excel中启用,并将您的自定义功能作为全局可用的函数暴露出来。

请按照以下步骤操作:

1. 在Excel中按 Alt + F11 打开“Microsoft Visual Basic for Applications”窗口。

2. 在VBA编辑器中,点击 插入 > 模块 并将以下宏粘贴到新创建的模块窗口中。

VBA代码:将数字转换为大写

Function NumberstoWords(ByVal MyNumber)
'Update by ExtendofficeDim xStr As StringDim xFNum As IntegerDim xStrPointDim xStrNumberDim xPoint As StringDim xNumber As StringDim xP() As VariantDim xDPDim xCnt As IntegerDim xResult, xT As StringDim xLen As IntegerOn Error Resume NextxP = Array("", "Thousand ", "Million ", "Billion ", "Trillion ", " ", " ", " ", " ")
xNumber = Trim(Str(MyNumber))
xDP = InStr(xNumber, ".")
xPoint = ""
xStrNumber = ""
If xDP >0 ThenxPoint = " point "
xStr = Mid(xNumber, xDP +1)
xStrPoint = Left(xStr, Len(xNumber) - xDP)
For xFNum =1 To Len(xStrPoint)
xStr = Mid(xStrPoint, xFNum,1)
xPoint = xPoint & GetDigits(xStr) & " "
Next xFNumxNumber = Trim(Left(xNumber, xDP -1))
End IfxCnt =0xResult = ""
xT = ""
xLen =0xLen = Int(Len(Str(xNumber)) /3)
If (Len(Str(xNumber)) Mod3) =0 Then xLen = xLen -1Do While xNumber <> ""
If xLen = xCnt ThenxT = GetHundredsDigits(Right(xNumber,3), False)
ElseIf xCnt =0 ThenxT = GetHundredsDigits(Right(xNumber,3), True)
ElsexT = GetHundredsDigits(Right(xNumber,3), False)
End IfEnd IfIf xT <> "" ThenxResult = xT & xP(xCnt) & xResultEnd IfIf Len(xNumber) >3 ThenxNumber = Left(xNumber, Len(xNumber) -3)
ElsexNumber = ""
End IfxCnt = xCnt +1LoopxResult = xResult & xPointNumberstoWords = xResultEnd FunctionFunction GetHundredsDigits(xHDgt, xB As Boolean)
Dim xRStr As StringDim xStrNum As StringDim xStr As StringDim xI As IntegerDim xBB As BooleanxStrNum = xHDgtxRStr = ""
On Error Resume NextxBB = TrueIf Val(xStrNum) =0 Then Exit FunctionxStrNum = Right("000" & xStrNum,3)
xStr = Mid(xStrNum,1,1)
If xStr <> "0" ThenxRStr = GetDigits(Mid(xStrNum,1,1)) & "Hundred "
ElseIf xB ThenxRStr = "and "
xBB = FalseElsexRStr = " "
xBB = FalseEnd IfEnd IfIf Mid(xStrNum,2,2) <> "00" ThenxRStr = xRStr & GetTenDigits(Mid(xStrNum,2,2), xBB)
End IfGetHundredsDigits = xRStrEnd FunctionFunction GetTenDigits(xTDgt, xB As Boolean)
Dim xStr As StringDim xI As IntegerDim xArr_1() As VariantDim xArr_2() As VariantDim xT As BooleanxArr_1 = Array("Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen ")
xArr_2 = Array("", "", "Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety ")
xStr = ""
xT = TrueOn Error Resume NextIf Val(Left(xTDgt,1)) =1 ThenxI = Val(Right(xTDgt,1))
If xB Then xStr = "and "
xStr = xStr & xArr_1(xI)
ElsexI = Val(Left(xTDgt,1))
If Val(Left(xTDgt,1)) >1 ThenIf xB Then xStr = "and "
xStr = xStr & xArr_2(Val(Left(xTDgt,1)))
xT = FalseEnd IfIf xStr = "" ThenIf xB ThenxStr = "and "
End IfEnd IfIf Right(xTDgt,1) <> "0" ThenxStr = xStr & GetDigits(Right(xTDgt,1))
End IfEnd IfGetTenDigits = xStrEnd FunctionFunction GetDigits(xDgt)
Dim xStr As StringDim xArr_1() As VariantxArr_1 = Array("Zero ", "One ", "Two ", "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ")
xStr = ""
On Error Resume NextxStr = xArr_1(Val(xDgt))
GetDigits = xStrEnd Function

3. 现在,点击窗口左上角的“保存”图标,或者直接按 Ctrl + S 打开“另存为”对话框。
A screenshot showing the Save option in the VBA window

4. 在“另存为”窗口中,在“文件名”字段中输入所需的文件名。对于“保存类型”下拉菜单,请务必选择 Excel加载项 (*.xlam).
A screenshot showing the Save As dialog box with the selection of Excel Add-in (*.xlam) as the save type

5. 点击“保存”按钮,将您的工作簿保存为Excel加载项文件。这样就创建了一个可随时在任何工作簿中启用的可重复使用的加载项。
A screenshot showing the workbook saved as an Excel Add-in

6. 保存后,返回Excel并关闭刚刚转换为加载项的工作簿。

7. 打开一个新的或现有的工作簿,在其中想要使用您的宏。在适当的单元格中输入自定义公式(例如,在B2单元格中):

=NumberstoWords(A2)
注意:此时可能会出现“#NAME?”错误。这是预期的结果,因为包含宏功能的加载项尚未在Excel中全局加载。请按照以下步骤启用您的宏,使其在所有工作簿中可用。
A screenshot of the #NAME? error before applying the saved VBA macro

8. 转到 开发工具 选项卡,然后点击 Excel加载项 按钮,位于加载项组中。
A screenshot showing the Add-ins option under the Developer tab in Excel

9. 在出现的加载项对话框中,选择 浏览.
A screenshot of the Add-ins dialog box in Excel

10. 找到并选择之前保存的加载项文件,然后点击 确定.
A screenshot showing the selection of a custom Add-in file in Excel

11. 您的自定义加载项(如“数字转文字加载项”)现在应该出现在加载项列表中。确保它已被勾选,然后点击 确定 以启用它。
A screenshot showing the custom add-in the Add-ins dialog box in Excel

12. 现在,在目标单元格(如B2)中再次输入自定义函数并按 Enter 键。您应该会看到公式返回正确的英文单词表示该数字。

=NumberstoWords(A2)

13. 若要快速将转换公式应用于多个数字,向下拖动单元格的自动填充手柄,将函数复制到其他单元格。

A screenshot showing the final result of the converted numbers to words

提示与注意事项:

  • 将您的宏保存为加载项可以让您在所有工作簿中使用相同的自定义函数、代码或自动化功能,节省时间并提高一致性。
  • 如果Excel关闭或稍后禁用了加载项,则从加载项中的函数可能会暂时显示“#NAME?”,直到再次加载加载项为止。为避免混淆,请在需要时确保加载项始终在加载项管理器中启用。
  • 某些用户默认可能看不到“开发工具”选项卡。要启用它,请右键单击功能区,选择“自定义功能区”,然后勾选“开发工具”选项。
  • 最好将加载项存储在永久文件夹中,以免移动或重命名文件导致引用丢失。

如果您更喜欢手动运行代码,这也是可行的,并且有时在调试或临时使用时很有帮助:

  1. 您可以将宏分配给快速访问工具栏,以便在任何可见工作簿中一键执行。要做到这一点,请右键单击快速访问工具栏,选择“自定义快速访问工具栏”,然后添加您的宏。
    A screenshot showing how to add the VBA macro to the Quick Access Toolbar
  2. 您还可以按 Alt + F11 打开VBA编辑器,手动选择您的宏,然后按 F5 键根据需要运行代码。

优点: 此解决方案允许您创建和共享丰富、可重用的宏功能,只要加载项启用,这些功能始终有效。
缺点: 用户必须记住加载加载项,并且在共享工作簿时,还必须共享加载项文件和功能详情。此外,加载项不能用于Excel Online。


个人宏工作簿方法

另一种非常实用的方法是使用个人宏工作簿(PERSONAL.XLSB),以确保您最喜爱或最常用的宏在每个Excel会话中都可用,无论哪个工作簿处于打开状态。这是一个特殊的隐藏Excel文件,每次启动Excel时都会自动加载,允许存储在其中的任何宏在所有打开的工作簿中均可访问。

适用场景:适用于个人自动化、日常格式化脚本或不需要作为正式Excel加载项共享的实用功能。存储在PERSONAL.XLSB中的宏在您的计算机上始终可用,无论打开的是哪个文件。

优点: 宏在全球范围内对您的本地Excel配置文件可用,无需安装加载项或额外文件。
缺点: 以这种方式存储的宏只能在存在PERSONAL.XLSB的计算机和账户上使用。与其他用户共享需要手动导出和导入模块。

  • 要使用这种方法,首先需要录制或创建一个宏,并确保将其保存到个人宏工作簿中。

请按照以下步骤操作:

  1. 打开Excel。在“视图”选项卡上,点击“”,然后选择“录制宏”。
  2. 在对话框中,于“宏保存位置”下选择个人宏工作簿。完成录制(如果不需要,可以立即停止)。
  3. Alt + F11 进入VBA编辑器,您将在其中看到PERSONAL.XLSB项目。在此处插入一个新模块或将您所需的宏代码粘贴进去。
  4. 保存您的更改。Excel会在其启动文件夹中自动创建并维护PERSONAL.XLSB工作簿。
  5. PERSONAL.XLSB中的宏可以通过对话框(Alt + F8)运行,也可以分配给功能区或工具栏按钮,或从VBA调用。

故障排除与维护:如果PERSONAL.XLSB中的宏不可用,请检查Excel是否以安全模式打开,或者宏的安全性设置是否设置为“禁用所有宏”。此外,PERSONAL.XLSB默认是隐藏的;如果您不小心未保存关闭或删除了它,可能需要重新录制宏以重新生成它。

提示: 定期备份您的PERSONAL.XLSB文件。您可以在系统配置文件夹中找到它,通常路径为:
C:\Users\[YourUserName]\AppData\Roaming\Microsoft\Excel\XLSTART\PERSONAL.XLSB

其他操作(文章)

列出Excel中所有加载项的VBA代码
在Excel中,您可能会添加或插入一些加载项以更好地处理数据。我们知道,可以进入“选项”窗口查看所有加载项,但是否有办法将所有加载项列在一个工作表中?现在,本教程提供了一段用于列出Excel中所有加载项的VBA代码。

如何在打开或关闭工作簿时运行VBA宏?
在本文中,我将告诉您如何在每次打开或关闭工作簿时运行VBA代码。

如何在Excel中保护/锁定VBA代码?
就像您可以使用密码保护工作簿和工作表一样,您也可以设置密码来保护Excel中的宏。

如何在Excel中运行VBA宏后延迟时间?
在某些情况下,您可能需要设置一个计时器延迟来触发Excel中的VBA宏。例如,当点击运行指定的宏时,它将在10秒后生效。本文将向您展示一种实现此目的的方法。

最佳办公效率工具

🤖 Kutools AI 助手:基于智能执行生成代码创建自定义公式分析数据并生成图表调用 Kutools 函数等功能,彻底改变数据分析方式…
热门功能查找、高亮或标记重复项 | 删除空行 | 合并不丢失数据的列或单元格 | 四舍五入 ...
高级 LOOKUP多条件 VLookup | 多值 VLookup | 多表查找 | 模糊查找 ....
高级下拉列表快速创建下拉列表 | 从属下拉列表 | 多选下拉列表 ....
列管理器添加指定数量的列 | 移动列 | 切换隐藏列的可见状态 | 比较区域和列 ...
精选功能网格聚焦 | 设计视图 | 增强编辑栏 | 工作簿与工作表管理器 | 资源库(自动文本) | 日期提取 | 合并数据 | 加密/解密单元格 | 按列表发送电子邮件 | 超级筛选 | 特殊筛选(筛选粗体/斜体/删除线...)...
排名前 15 的工具集12 种文本 工具添加文本删除特定字符等) | 50 多 种图表 类型甘特图等) | 40 多种实用 公式基于生日计算年龄等) | 19 种插入 工具插入二维码根据路径插入图片等) | 12 种转换 工具小写金额转大写汇率转换等) | 7 种合并与分割 工具高级合并行分割单元格等) | 还有更多...

使用 Kutools for Excel 提升您的 Excel 技能,体验前所未有的高效。 Kutools for Excel 提供超过 300 种高级功能来提高生产力并节省时间。 单击此处获取您最需要的功能...


Office Tab 将标签式界面引入 Office,让您的工作更加轻松

  • 在 Word、Excel、PowerPoint 中启用标签式编辑和阅读
  • 在同一窗口的新标签页中打开和创建多个文档,而不是在新窗口中进行操作。
  • 将您的生产力提升 50%,每天为您减少数百次鼠标点击!