如何转换VBA模块为字符串?批量更新Excel的ThisWorkbook模块
批量更新Excel文件的ThisWorkbook模块方案
方案一:自动将VBA代码转换为AddFromString所需格式
如果必须用AddFromString方法,可以用以下VBA工具自动将目标代码转换成带转义引号和换行拼接的字符串,无需手动修改163行代码:
Sub ConvertVBACodeToString() Dim sourceCode As String Dim convertedCode As String Dim fileNum As Integer ' 读取保存好的ThisWorkbook代码文件(.bas格式) fileNum = FreeFile Open "C:\YourPath\ThisWorkbook_Code.bas" For Input As #fileNum sourceCode = Input$(LOF(fileNum), fileNum) Close #fileNum ' 转义双引号(VBA字符串中需用两个双引号表示一个) convertedCode = Replace(sourceCode, """", """""") ' 按换行拼接成目标格式 convertedCode = """" & Replace(convertedCode, vbCrLf, """" & vbCr & " & vbCr & """") & """" ' 将结果复制到剪贴板 Dim dataObj As Object Set dataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") dataObj.SetText convertedCode dataObj.PutInClipboard MsgBox "转换完成,结果已复制到剪贴板" End Sub
运行后,剪贴板中的内容可直接粘贴到AddFromString的参数位置。
方案二:直接替换ThisWorkbook代码(更简便)
无需转换字符串,直接操作VBA工程对象清空原有代码并写入新内容,完美解决导入.bas生成类模块的问题:
Sub BatchUpdateThisWorkbook() Dim targetPath As String Dim targetFile As String Dim wb As Workbook Dim vbComp As VBComponent Dim newCode As String Dim fileNum As Integer ' 设置批量处理的文件夹路径 targetPath = "C:\YourExcelFiles\" targetFile = Dir(targetPath & "*.xlsm") ' 根据你的文件类型调整(.xlsx/.xls等) ' 读取要替换的新ThisWorkbook代码 fileNum = FreeFile Open "C:\YourPath\ThisWorkbook_Code.bas" For Input As #fileNum newCode = Input$(LOF(fileNum), fileNum) Close #fileNum ' 遍历文件夹内的Excel文件 Do While targetFile <> "" Set wb = Workbooks.Open(targetPath & targetFile, ReadOnly:=False) Set vbComp = wb.VBProject.VBComponents("ThisWorkbook") ' 清空原有代码 vbComp.CodeModule.DeleteLines 1, vbComp.CodeModule.CountOfLines ' 写入新代码 vbComp.CodeModule.AddFromString newCode ' 保存并关闭文件 wb.Save wb.Close targetFile = Dir Loop MsgBox "批量更新完成" End Sub
注意事项
需要提前开启Excel的「信任对VBA工程对象模型的访问」:
文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置 → 勾选「信任对VBA工程对象模型的访问」
内容的提问来源于stack exchange,提问作者Ben Perner
相关产品推荐
相关产品推荐

