用vba打开另一个包含所有macros的工作簿

我们希望将所有macros存储在每个工作簿中,而不是将它们存储在一个全局macros中。 我们尝试使用Personal.xlsb文件,但每次Excel崩溃或系统pipe理员强制重新启动与Excel打开它创buildpersonal.v.01 …. v.100文件,并他们互相干扰,得到损坏等。相反,我们试图在我们制作的每个excel工作簿中添加一个小macros,然后用全部macros打开一个全局excel工作簿,但是它并不打开它(normal.xlsb),问题在哪里? 如果我手动运行它工作正常,它只是不autorun ..

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 

你创build你的插件,只是一个空的工作簿,除了代码以外什么都没有

喜欢这个

在这里输入图像说明

然后在VBA中添加一个对你想使用的工作簿的引用,像这样。 我的文档,是一个networking驱动器上的文件夹,而不是“我的文档”本地。

在这里输入图像说明

然后你可以这样打电话。

在这里输入图像说明

所以基于来自@Nathan_Sav和@Ralph的input,我得到了一个很好的解决scheme:

我已经叫我的addinn正常,并保存在Z:Dokumenstyring \ Normal.xlam

然后,我删除了正常的Thisworkbook中的所有代码:

 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的新工作簿中

我编辑了所有的蝙蝠文件(以前使用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表格中的形状似乎只与程序中的macros名称一起工作,但如果两个程序具有相同的名称,但位于不同的程序中,则可能会有冲突。 所以我也改变了这个

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

然而,每次点击都会启动一个插件的新实例,如何避免这种情况? 在这里输入图像说明