Сценарии изменений для нескольких книг Excel - PullRequest
4 голосов
/ 14 июня 2011

Я пытаюсь внести большие изменения в число книг Excel (более 20). Каждая рабочая книга содержит около 16 отдельных листов, и я хочу написать сценарий, который будет проходить по каждой рабочей книге, и эти листы будут содержать внутри и писать / изменять нужные мне ячейки. Мне нужно сохранить все проверки строк, макросы и форматирование. Все рабочие тетради в формате 2007 года.

Я уже смотрел на библиотеки Python Excel и PHPexcel, но макросы, кнопки, формулы, проверку строк и форматирование не сохранялись при написании новой книги. Есть ли простой способ сделать это, или мне придется открывать каждую книгу по отдельности и фиксировать изменения. Я пытаюсь избежать создания макроса в VBscript и необходимости открывать каждую книгу отдельно, чтобы зафиксировать необходимые мне изменения.

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Я избегаю работы с несколькими книгами, например, с чумой, это больно, если это постоянное требование, я бы посоветовал оглянуться назад на дизайн своей книги и посмотреть, сможете ли вы объединить ее обратно в одну книгу. Я часто вижу рабочие книги, которые сохраняются каждый месяц, когда в них должна быть одна рабочая книга с одним листом с необработанными данными, где каждая строка представляет месяц, а затем другой лист для отображения, который просматривает необработанные данные, выбранные пользователем. Это очень большое обобщение, и вы вполне можете оказаться в совершенно другой ситуации.

Если это один раз - и я знаю, что это не то, что вы хотели, но я думаю, что вам лучше будет просмотреть рабочие книги с помощью 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
1 голос
/ 15 июня 2011

Когда мне нужно перебрать файлы, я использую некоторый код из потока в 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
0 голосов
/ 15 июня 2011

Вы также можете использовать библиотеки PyWin32 для написания сценариев на Python с использованием типичных техник COM.Это позволяет вам использовать Python для выполнения обработки и сохранять все дополнительные части каждой книги, которые другие библиотеки Python Excel могут не обрабатывать.

...