【问题标题】:Open another workbook with vba that contains all the macros使用包含所有宏的 vba 打开另一个工作簿
【发布时间】:2016-11-16 21:40:52
【问题描述】:

我们希望将它们存储在一个全局工作簿中,而不是将所有宏存储在每个工作簿中。我们尝试使用 Personal.xlsb 文件,但是每次 excel 崩溃或系统管理员使用 excel 打开时强制重新启动它都会创建个人.v.01 ....v.100 文件,并且它们相互干扰,被损坏等等。所以相反,我们正在尝试向我们制作的每个 excel 工作簿添加一个小宏,然后应该打开一个包含所有宏的全局 excel 工作簿,但是它没有打开它(normal.xlsb),问题出在哪里?如果我手动运行它工作正常,它只是不会自动运行..

Option Explicit
Public Sub Workbook_Open()
Dim sFullName As String
Dim xlApp As Excel.Application
Dim wbReturn As Workbook
sFullName = "Z:\Dokumentstyring\normal.xlsb"
Set xlApp = GetObject(, "Excel.Application") 'need to do so to open it in same instance otherwise the global macros can not be called.
Set wbReturn = xlApp.Workbooks.Open(filename:=sFullName, ReadOnly:=True)
If wbReturn Is Nothing Then
MsgBox "Failed to open workbook, maybe z drive is down?"
Else
ThisWorkbook.Activate'Dont know how to pass object to modules, so instead activate it and in createbutton set wb= activeworkbook..
Application.Run ("normal.xlsb!CreateButtons")
End If
End Sub
Public Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wb As Workbook
For Each wb In Application.Workbooks
If InStr(UCase(wb.Name), "PARTSLIST") > 0 And wb.Name <> ThisWorkbook.Name Then Exit Sub
Next wb
On Error Resume Next
Workbooks("normal.xlsb").Close
Workbooks("filter.xlsx").Close
End Sub

【问题讨论】:

  • 您是否尝试过使用AddIn?那里的所有宏,然后引用它,然后MYAddInName.MyFunctionName(x,y,z)
  • 您是唯一会打开/使用个人 Excel 文件的人吗?
  • @Nathan_Sav 如何在网络驱动器上发布新版本的插件,而无需用户打开他们的 Excel 并链接到新版本?不,我们有 50 个人在使用 personal.xlsb 文件,因此移至我们以只读方式打开的 normal.xlsb 文件
  • 通过在网络位置使用插件自然会发生。有时要获得更强大的解决方案,需要付出一些努力。
  • @Nathan_Sav 这正在成为关于集中提供的 Master-Excel 文件的插件的无休止讨论,这并不是 StackOverflow 真正追求的目标:stackoverflow.com/tour 我实际上也支持这些集中提供主 Excel 文件。它们在企业环境中更容易维护(如果您在全球本地管理的 LAN 中安装了 Excel)。然而,我们将所有必要的数据导入到 Master-Excel 文件中,而不是将宏导入到其他文件中。然而,这是另一个网站的问题。让我们尝试帮助 OP 解决所提出的问题

标签: vba excel macros


【解决方案1】:

你创建你的插件,就像一个空的工作簿,只包含代码

这样

然后您在您希望使用的工作簿中添加对它的引用,在 VBA 中,像这样。我的文档是网络驱动器上的文件夹,而不是本地的“我的文档”。

然后你就可以这样调用了。

【讨论】:

    【解决方案2】:

    因此,根据@Nathan_Sav 和@Ralph 的意见,我得出了一个部分不错的解决方案:

    我已调用我的插件 Normal 并将其保存在 Z:Dokumenstyring\Normal.xlam

    然后我删除了Thisworkbook of Normal中的所有代码:

    Private Sub Workbook_Open()
    
        Dim ExcelArgs As String
        Dim arg As String
        ExcelArgs = Environ("ExcelArgs")
    
        'Call deleteMacros.deletePersonalFiles
        'MsgBox ExcelArgs
        If InStr(UCase(ExcelArgs), "CREO,") > 0 Then
            Application.DisplayAlerts = False
            If Len(ExcelArgs) > Len("CREO,") Then
                arg = Split(ExcelArgs, ",")(1)
                Call Creo.addNewPartToPartslist(arg)
            End If
            Application.DisplayAlerts = True
        End If
    
        If InStr(UCase(ExcelArgs), "DOKLIST,") > 0 Then
            Application.DisplayAlerts = False
            If Len(ExcelArgs) > Len("DOKLIST,") Then
                arg = Split(ExcelArgs, ",")(1)
                Call ProsjektListen.dbDumpDocOut(arg)
            End If
            Application.DisplayAlerts = True
        End If
    

    并将其放入名为 Z:Dokumenstyring\Creo.xlsm 的新工作簿中

    我已经编辑了我所有的 bat 文件(以前使用的是personal.xlsb):

    echo "Launch excel"
    Set ExcelArgs=CREO,ADDPART
    
    "C:\Program Files (x86)\Microsoft Office\OFFICE16\Excel.exe" /x /r "z:\Dokumentstyring\Creo.xlsm"
    

    因此,当我运行 bat 文件时,它会向环境添加一个参数,启动 creo.xlsm,然后启动启动我的用户窗体的插件。

    因此,如果我现在想通过修改 Z:Dokumenstyring\NormalDebug.xlam 来更新该用户窗体的外观,然后我保存一份我在 Z:Dokumenstyring\Normal.xlam 上写入的副本,我还告诉了每个用户不要将插件复制到 excel 中的默认位置,而是将其保存在 Z:Dokumenstyring\Normal.xlam 中。

    我的 Excel 表格中的形状似乎只使用过程中的宏名称,但是如果两个过程具有相同的名称但位于不同的过程中,则可能会发生冲突。所以我也把它改成了

    ws1.Shapes(tempName).OnAction = "Normal.xlam!Custom_Button_Click" 
    

    但是每次点击都会启动一个新的插件实例,如何避免这种情况?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2016-05-15
      相关资源
      最近更新 更多