【问题标题】:Scripting changes to multiple excel workbooks对多个 Excel 工作簿的脚本更改
【发布时间】:2011-06-14 18:09:20
【问题描述】:

我正在尝试对一些 excel 工作簿(超过 20 个)进行较大的更改。每个工作簿包含大约 16 个单独的工作表,我想编写一个脚本,循环遍历每个工作簿,工作表包含内部并编写/修改我需要的单元格。我需要保留所有字符串验证、宏和格式。所有工作簿均为 2007 年格式。

我已经查看了 python excel 库和 PHPexcel,但是宏、按钮、公式、字符串验证和格式设置在编写新工作簿时并未保留。有没有一种简单的方法可以做到这一点,或者我必须单独打开每个工作簿并提交更改。我试图避免在 VBscript 中创建宏并且必须单独打开每个工作簿来提交我需要的更改。

【问题讨论】:

  • 您可能应该考虑自动化 Excel 来执行此操作:如果您对此更满意,可以使用 VBA 或 Python。大多数关于循环遍历目录中文件的示例都将在 VBA 中......
  • 这难道不是 VBA 的吗?
  • 你甚至可以把你需要的大部分宏都记录下来,然后整理一下。

标签: python vba scripting excel


【解决方案1】:

我避免使用像瘟疫这样的多个工作簿,这是一种痛苦,如果这是一个持续的需求,那么我建议您回顾一下您的工作簿设计,看看您是否可以合并回一个工作簿。我经常看到每个月保存的工作簿,当他们应该有一个工作簿和一个带有原始数据的工作表,其中每行代表一个月,然后是另一个用于显示的工作表,它查找用户选择的原始数据。这是一个非常大的概括,你很可能处于完全不同的情况。

如果它是一次性的 - 我知道它不是您想要的,但我认为您最好使用 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

【讨论】:

  • Excel 2007 中没有 Application.Filesearch。您可以使用 Dir() 或 Scripting.FilesystemObject 的实例。
  • 谢谢蒂姆。为 2007+ 年编辑。
【解决方案2】:

当我需要遍历文件时,我会使用来自 thread on 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

【讨论】:

    【解决方案3】:

    您还可以使用 PyWin32 库通过 Python 使用典型的 COM 技术编写脚本。这使您可以使用 Python 进行处理,并且仍然保存其他 Python Excel 库可能无法处理的每个工作簿的所有额外部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多