[英]Scripting changes to multiple excel workbooks
我正在嘗試對許多 excel 工作簿(超過 20 個)進行重大更改。 每個工作簿包含大約 16 個單獨的工作表,我想編寫一個腳本,循環遍歷每個工作簿,工作表包含內部並編寫/修改我需要的單元格。 我需要保留所有字符串驗證、宏和格式。 所有工作簿均為 2007 年格式。
我已經查看了 python excel 庫和 PHPexcel,但是宏、按鈕、公式、字符串驗證和格式在編寫新工作簿時並未保留。 有沒有一種簡單的方法可以做到這一點,或者我必須單獨打開每個工作簿並提交更改。 我試圖避免在 VBscript 中創建宏,並且必須分別打開每個工作簿以提交我需要的更改。
我避免使用像瘟疫這樣的多個工作簿,這很痛苦,如果這是一個持續的要求,那么我建議回顧一下您的工作簿設計,看看您是否可以合並回一個工作簿。 我經常看到每個月都保存的工作簿,當他們應該有一個工作簿和一張帶有原始數據的表格時,每行代表一個月,然后是另一個用於顯示的表格,用於查找用戶選擇的原始數據。 這是一個非常大的概括,你很可能處於完全不同的情況。
如果它是一次性的 - 我知道它不是您想要的,但我認為您最好使用 VBA 循環瀏覽工作簿。 類似(未經測試):
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 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 庫通過 Python 使用典型的 COM 技術來編寫腳本。 這使您可以使用 Python 進行處理,並且仍然保存其他 Python Excel 庫可能無法處理的每個工作簿的所有額外部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.