脚本更改到多个excel工作簿

问题描述

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