python - 如何更新多个启用宏的 Excel 文件中的 VBA 代码?

标签 python excel vba

我有一堆 Excel 文件,其中所有文件都具有相同的 VBA 代码。它们是从单个文件(模板文件)创建/克隆的,然后与一些数据一起存储在其中。所以我想更新所有Excel文件中的VBA代码,包括模板文件(一个空的Excel文件,其中没有数据)。有没有办法使用 python 脚本或其他东西一次性完成相同的操作。

最佳答案

当可能的时候,我尝试使用单独的.xlsx文件用于数据输入,并使用单独的.xlsm程序文件来操作输入的数据,但最近当我需要不断更新代码时,我需要解决与此问题类似的问题模板和此代码必须通过许多数据输入步骤来更新,以从该空数据模板创建多个文件。要求是该文件可以在用户的​​ PC 上运行而无需任何其他文件。

当将模板复制到单独的文件夹中并将包含加载数据的工作簿中的工作表复制到此模板中时,我们使用了该解决方案,但在这种情况下,在某些工作表公式和带有指定宏的按钮中留下了指向旧工作簿的链接。从头开始将数据输入到更新的模板中也不是一个好的解决方案。

我决定使用将更新的模块从模板文件复制到所选文件中的程序来解决问题。我的代码如下:

Sub ControlSelectedWorkbookModulesUpdatingFromSourceWorkbook()

Dim sourceWorkbook As Workbook, destinationWorkbook As Workbook
Dim pathToSourceWorkbook As String
Dim fileDialog As Office.fileDialog, pathToDestinationWorkbook As String

Set fileDialog = Application.fileDialog(msoFileDialogFilePicker)
With fileDialog
  .AllowMultiSelect = False
  .Title = "Please select the file."
  .Filters.Clear
  .Filters.Add "Excel", "*.xlsm"
  If .Show = True Then
    pathToDestinationWorkbook = fileDialog.SelectedItems(1)
  End If
End With

Application.ScreenUpdating = False

Set destinationWorkbook = Workbooks.Open(pathToDestinationWorkbook)

Call RemoveModules.RemoveAllVBA_ModulesFromDestinationWorkbook(destinationWorkbook)

pathToSourceWorkbook = "C:\Users\SourceFolder\SourceFileName.xlsm"
Set sourceWorkbook = Workbooks.Open(pathToSourceWorkbook)

Call CopyModules.CopyAllVBA_ModulesFromSourceWorkbookToDestinationWorkbook(sourceWorkbook, destinationWorkbook)

sourceWorkbook.Close SaveChanges:=False
destinationWorkbook.Close SaveChanges:=True

Application.ScreenUpdating = True

MsgBox "The end of program", vbInformation, ThisWorkbook.Name

End Sub

模块RemoveModules中的代码:

Sub RemoveAllVBA_ModulesFromDestinationWorkbook(destinationWorkbook As Workbook)

'This will remove all modules including ClassModules and UserForms but keep all 
'object modules (sheets, workbook).

Dim module As Object

On Error Resume Next
For Each module In destinationWorkbook.VBProject.VBComponents
    destinationWorkbook.VBProject.VBComponents.Remove module
Next
On Error GoTo 0

End Sub

模块 CopyModules 中的代码:

Sub CopyAllVBA_ModulesFromSourceWorkbookToDestinationWorkbook(sourceWorkbook As Workbook, destinationWorkbook As Workbook)

'This will copy from source workbook all modules except sheets, workbook.
'As direct copy is not allowed it is accomplished by 2 steps
'1 module from sourceWorkbook is exported into temporary file
'2 temporary file is imported into destinationWorkbook and then temporary file is deleted

Dim module As Object, pathToTemporaryFilesFolder As String, pathToTemporaryFile As String

pathToTemporaryFilesFolder = "C:\Users\OtherPartOfYourPath"

On Error Resume Next
For Each module In sourceWorkbook.VBProject.VBComponents
    If InStr(module.Name, "ThisWorkbook") = 0 And InStr(module.Name, "Sheet") = 0 Then
        pathToTemporaryFile = pathToTemporaryFilesFolder & "\" & module.Name & ".bas"
        module.Export (pathToTemporaryFile)
        destinationWorkbook.VBProject.VBComponents.Import (pathToTemporaryFile)
        Kill pathToTemporaryFile
    End If
Next
On Error GoTo 0

End Sub

只有设置了 PC Excel 的用户才能更新代码 - 信任对 VBA 项目对象模型的访问,有权访问模板文件和此程序文件,但随后可以将包含数据和更新代码的文件发送到其他用户并将独立工作。

关于python - 如何更新多个启用宏的 Excel 文件中的 VBA 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47649553/

相关文章:

python - 在 Python 中解压字节值

python - 使用 pd.Series() 从现有列添加新列会创建 NaN 值

python - 如何调整数据框的大小? Pandas

vba - 我可以/如何以 excel 形式显示网页?

sql - VBA - 执行 ADODB.CommandText

vba - 遍历已发送邮件文件夹-点击非邮件项目时出错

python - Pandas 中提到的按时间帧对数据帧进行分组

python xlrd 字符串匹配

javascript - 使用 Node 解析 XLSX 并创建 json

javascript - 无法在 IE11 中使用 SheetJS 在 AngularJS UI Grid 中上传 excel