问题描述
|
我正在尝试对许多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库可能无法处理的每个工作簿的所有额外部分。