脚本更改为多个Excel工作簿

我试图对一些excel工作簿(超过20)进行大的修改。 每个工作簿包含大约16个单独的工作表,我想写一个脚本,将循环通过每个工作簿,工作表包含里面,并编写/修改我需要的单元格。 我需要保持所有的stringvalidation,macros和格式。 所有的工作簿都是2007年的格式。

我已经看过python excel库和PHPexcel,但是macros,button,公式,stringvalidation和格式化,并且在写入新的工作簿时不会保留。 有没有一个简单的方法来做到这一点,或者我将不得不单独打开每个工作簿并提交更改。 我试图避免在VBscript中创build一个macros,并不得不单独打开每个工作簿来提交我需要的更改。

我避免使用像鼠疫这样的多个工作簿,这是一个痛苦,如果这是一个持续的需求,那么我会build议回头看看你的工作簿devise,看看如果你可以合并回到一个工作簿。 我经常看到每个工作簿每个月都保存一个工作簿,每个工作簿应该有一张工作簿,每张工作表的原始数据(每行代表一个月份),然后是另一张工作表,用于查看用户select的原始数据。 这是一个非常大的概括,你可能会完全不同的情况。

如果它的一次性 – 我知道它不是你想要的,但我认为你最好是循环使用VBA的工作簿。 像(未经testing的):

Excel 2003:

Sub AdjustMultipleFiles() Dim lCount As Long Dim wbLoopBook As Workbook Dim wsLoopSheet As Worksheet With Application .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False End With With Application.FileSearch .NewSearch '// Change path to suit .LookIn = "C:\MyDocuments" '// ALL Excel files .FileType = msoFileTypeExcelWorkbooks '// Uncomment if file naming convention needed '.Filename = "Book*.xls" '// Check for workbooks If .Execute > 0 Then '// Loop through all. For lCount = 1 To .FoundFiles.Count '// Open Workbook x and Set a Workbook variable to it Set wbLoopBook = Workbooks.Open(Filename:=.FoundFiles(lCount), UpdateLinks:=0) '// Loop through all worksheets For Each wsLoopSheet In wbLoopBook.Worksheets '//Update your worksheets here... Next wsLoopSheet '// Close Workbook & Save wbLoopBook.Close SaveChanges:=True '// Release object variable Set wbLoopBook = Nothing Next lCount End If End With With Application .ScreenUpdating = True: .DisplayAlerts = True: .EnableEvents = True End With End Sub 

对于EXCEL 2007+:

 Sub AdjustMultipleFiles() Dim sFileName As String Dim wbLoopBook As Workbook Dim wsLoopSheet As Worksheet With Application .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False End With '// Change path to suit ChDir "C:\Documents" '// ALL Excel 2007 files sFileName = Dir("*.xlsx") Do While sFileName <> "" '// Open Workbook x and Set a Workbook variable to it Set wbLoopBook = Workbooks.Open(Filename:=sFileName, UpdateLinks:=0) '// Loop through all worksheets For Each wsLoopSheet In wbLoopBook.Worksheets '//Update your worksheets here... Next wsLoopSheet '// Close Workbook & Save wbLoopBook.Close SaveChanges:=True '// Release object variable Set wbLoopBook = Nothing '//Next File sFileName = Dir '//End Loop Loop With Application .ScreenUpdating = True: .DisplayAlerts = True: .EnableEvents = True End With End Sub 

Excel 2007 +(FileSystemObject – LateBinding)

 Sub AdjustMultipleFiles() Dim wbLoopBook As Workbook Dim wsLoopSheet As Worksheet With Application .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False End With With CreateObject("Scripting.FileSystemObject") '// Change path to suit For Each File In .GetFolder("C:\Documents").Files '// ALL Excel 2007 files If .GetExtensionName(File) = "xlsx" Then '// Open Workbook x and Set a Workbook variable to it Set wbLoopBook = Workbooks.Open(Filename:=File.Path, UpdateLinks:=0) '// Loop through all worksheets For Each wsLoopSheet In wbLoopBook.Worksheets '//Update your worksheets here... Next wsLoopSheet '// Close Workbook & Save wbLoopBook.Close SaveChanges:=True '// Release object variable Set wbLoopBook = Nothing End If Next File End With With Application .ScreenUpdating = True: .DisplayAlerts = True: .EnableEvents = True End With End Sub 

当我需要遍历文件时,我使用ozgrid上的一个线程的一些代码,它使用了Dir命令,绕过了版本问题,同时保留了使用通配符过滤文件名的function。

 Function FileList(fldr As String, Optional fltr As String = "*.*") As Variant Dim sTemp As String, sHldr As String If Right$(fldr, 1) <> "\" Then fldr = fldr & "\" 'append backslash if not already supplied sTemp = Dir(fldr & fltr) If sTemp = "" Then FileList = False Exit Function End If Do sHldr = Dir If sHldr = "" Then Exit Do sTemp = sTemp & "|" & sHldr 'ensures an array is returned Loop FileList = Split(sTemp, "|") End Function 

连同我的一些代码来利用它:

 Sub MySub() Dim vList As Variant Dim myWB As Workbook Dim targetDir As String targetDir = "C:\path\to\folder\" If Right$(targetDir, 1) <> "\" Then targetDir = targetDir & "\" vList = FileList(targetDir, "*.xl*") 'all file extensions starting with xl (xls, xlsx, xlsm, xla, xlsb, etc.) For n = LBound(vList) To UBound(vList) Set myWB = Workbooks.Open(targetDir & vList(n)) 'your code for each workbook here myWB.Close Next n End Sub 

你也可以使用PyWin32库来使用典型的COM技术用Python来编写脚本。 这可以让你使用Python来完成你的处理过程,并且仍然保存其他Python Excel库可能无法处理的每个工作簿的所有额外部分。