【问题标题】:How to Call Subs from an Add-In Directly如何直接从加载项调用 Subs
【发布时间】:2015-09-25 17:36:42
【问题描述】:

因此,通过 VBA 代码编写将调用加载项库中的子/函数的代码显然很容易,只需这样做

call myFunctionOrSub

但是,有没有一种方法可以让用户在加载项中直接调用公共子程序?例如,当用户转到工具 -> 宏并拉出此屏幕时:

我想将包含在与文件链接的加载项中的所有 Subs 添加到该框中的宏列表中。也就是说,我有一个当前工作簿引用的库 (library.xlam)。在这个 library.xlam 文件中,我有 Subs(例如 copyToResults)。我希望 copyToResults 在此列表中显示为可运行的宏。有没有办法做到这一点?

我能想到的唯一解决方案是在我的测试文件中为 library.xlam 中的每个 Sub 创建一个 Sub。测试文件中的这个 Sub 不会通过调用库的 Sub 来执行任何操作。但是,这对于拥有外部库的目的来说很糟糕,而且对于可扩展性来说也很糟糕,所以我们绝对不想走这条路。

【问题讨论】:

  • 这是使用 Personal.xls(m) 工作簿而不是自定义例程的加载项的一种情况。如果它们在个人工作簿中,它们将显示在宏对话框中。
  • 啊,是的,我也找到了该解决方案,但真的希望它能够通过宏对话框起作用。好吧,除非其他人想出奇迹,否则我想我会坚持下去。谢谢。
  • 您可以在“宏”对话框中键入宏的全范围名称并运行它,即使它没有列出。但是,是的,这也不是很好。
  • 最后一件事。您当然可以充实您的加载项工作簿,以包含一个用户表单,该用户表单提供与内置宏对话框基本相同的功能。这将允许您的外接程序的用户以熟悉的方式选择和运行外接程序中的各个例程。要显示用户表单,您可以定义键盘快捷键。 ALT-F8 打开正常的宏对话框。因此,您也许可以将 CONTROL-ALT-F8 用于自定义版本。加载项本身可以包含设置快捷方式的代码。您还可以让它创建一个功能区项目来启动用户窗体。所以还是有选择的。
  • 我会支持 @ExcelHero 并使用自定义功能区 - 更加用户友好和包含。

标签: vba excel


【解决方案1】:
  1. 在您的 xlam 中制作一个带有列表框的表单。
  2. 使用这篇文章中的脚本来填充您的表单。您将不得不更改一些 Excel 设置。 Get a list of the macros of a module in excel, and then call all those macros

这是我表单中的代码:

Private Sub btnCancel_Click()
    Unload Me
End Sub

Private Sub btnExecute_Click()

    Application.Run "macros.xlam!" & lstMacros.Value
    Unload Me
End Sub


Private Sub UserForm_Initialize()

Dim pj As VBProject
Dim vbcomp As VBComponent
Dim curMacro As String, newMacro As String
Dim x As String
Dim y As String
Dim macros As String

On Error Resume Next
curMacro = ""
Documents.Add

For Each pj In Application.VBE.VBProjects

     For Each vbcomp In pj.VBComponents
            If Not vbcomp Is Nothing Then
                If Not vbcomp.CodeModule = "Utilities" Then
                    For i = 1 To vbcomp.CodeModule.CountOfLines
                       newMacro = vbcomp.CodeModule.ProcOfLine(Line:=i, _
                          prockind:=vbext_pk_Proc)

                       If curMacro <> newMacro Then
                          curMacro = newMacro

                            If curMacro <> "" And curMacro <> "app_NewDocument" Then
                                frmMacros.lstMacros.AddItem curMacro
                            End If

                       End If
                    Next
                End If
            End If
     Next

Next
End Sub

最后我的样子是这样的: Macros Form

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2012-02-12
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多