AppleScript将多个Excel文件合并到一个工作表中

AppleScript将多个Excel文件合并到一个工作表中,excel,vba,macos,applescript,Excel,Vba,Macos,Applescript,我不是AppleScript方面的专家,因此我试图找到一个AppleScript代码示例,它可以成功地处理一批Excel文件(每个文件都有一个工作表),将每个文件的内容复制到一个目标工作表中 这是我想到的伪代码: pick source folder with Excel files; pick destination Excel file; for each file within the source folder: copy data from default sheet

我不是AppleScript方面的专家,因此我试图找到一个AppleScript代码示例,它可以成功地处理一批Excel文件(每个文件都有一个工作表),将每个文件的内容复制到一个目标工作表中

这是我想到的伪代码:

pick source folder with Excel files;
pick destination Excel file;

for each file within the source folder:
        copy data from default sheet;
        paste data into destination sheet's first unused row
end
这是我想出的密码。它确实正确地打开了每个文件,但是复制/过去操作没有发生。知道如何让它工作吗


set main_folder to choose folder with prompt "Please select the folder containing the Excel files:"

set target_excel to choose file with prompt "Please select target Excel file:"

set excel_extension_list to {"xls", "xlsx", "csv"}

tell application "Finder"
    set excel_files to (files of main_folder whose name extension is in excel_extension_list) as alias list
end tell

tell application "Microsoft Excel"
    open target_excel

    repeat with a_file in excel_files
        open a_file
        activate a_file
        tell sheet 1 of workbook a_file
            set the_range to value of used range
            set number_of_source_rows to count of rows of the_range
        end tell

        activate target_excel
        tell sheet 1 of workbook target_excel
            set new_range to value of used range
            set number_of_destination_rows to count of rows of new_range
            set destination_range to range "A" & (number_of_destination_rows + 1) & ":E" & (number_of_destination_rows + 1 + number_of_source_rows)
            set value of destination_range to the_range
            close workbook a_file saving no
        end tell
    end repeat
end tell

在Excel 2011中试用和测试

我的假设

  • 目标文件有一个名为
    Sheet1
  • 我正在从所有文件的第一页检索信息。如适用,进行更改
  • 代码

    我已经对代码进行了注释,因此您在理解代码时不会有任何问题。:)


    快速提问。我相信你是在MAC上做的?如果是的,如果你有Office 2011,那么你也可以使用Excel宏来实现你想要的。嗨,Siddarth,是的,我在Mac上使用Office 2011。我会很好地使用宏,只要它可以做批处理(加载每个文件)为我。。。我要处理35个文件,我每周都要制作这份报告:/所以如果这样做有效,欢迎宏观想法;)我添加了新标签。实际上,大多数Excel VBA也可以与Excel 2011 VBA一起使用。:)如果我给你一个静态路径的例子,你能改变代码以满足你的需要吗?我不熟悉宏或VBScript,所以如果它不是AppleScript,我需要知道如何选择一个文件夹,并让代码在其中的每个文件中运行,而不管文件名如何。挑战在于我无法控制将接收的文件数量或文件名。
    Sub Sample()
        Dim wbI As Workbook, wbO As Workbook
        Dim lRowO As Long
        Dim lRowI As Long, lColI As Long
        Dim DestFile As Variant
        Dim RootFldr As String, FilesFolder As String, strFile As String
    
        '~~> Get the Root Folder
        RootFldr = MacScript("return (path to desktop folder) as String")
    
        '~~> Show the Folder Browser to select the folder which has the files
        FilesFolder = MacScript("(choose folder with prompt ""Please select the folder which has excel files""" & _
        "default location alias """ & RootFldr & """) as string")
    
        '~~> If user doesn't select anything then exit
        If FilesFolder = "" Then Exit Sub
    
        '~~> Show the File Select dialog for the output file
        DestFile = Application.GetOpenFilename("XLS8,XLS4")
    
        '~~> Open output file
        Set wbO = Workbooks.Open(DestFile)
    
        '~~> Get the next available row for writing
        lRowO = wbO.Sheets("Sheet1").Cells.Find(What:="*", _
                After:=wbO.Sheets("Sheet1").Range("A1"), _
                Lookat:=xlPart, _
                LookIn:=xlFormulas).Row + 1
    
        '~~> Loop through each file in the folder
        strFile = Dir(FilesFolder)
    
        Do While Len(strFile) > 0
            '~~> Check for the file if it is csv,xls or xlsx
            If Right(strFile, 3) = "csv" Or _
            Right(strFile, 3) = "xls" Or _
            Right(strFile, 4) = "xlsx" Then
                '~~> Open the file from the folder
                Set wbI = Workbooks.Open(FilesFolder & strFile)
    
                With wbI
                    '~~> Get the last row in the file from sheet #1
                    lRowI = .Sheets(1).Cells.Find(What:="*", _
                            After:=.Sheets(1).Range("A1"), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Row
    
                    '~~> Get the last column in the file from sheet #1
                    lColI = .Sheets(1).Cells.Find(What:="*", _
                            After:=.Sheets(1).Range("A1"), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByColumns, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Column
    
                    With .Sheets(1)
                        '~~> Copy the selected range
                        .Range(.Cells(1, 1), .Cells(lRowI, lColI)).Copy
    
                        '~~> Paste in destination file
                        wbO.Sheets("Sheet1").Range("A" & lRowO).PasteSpecial xlValues
    
                        '~~> Get the next available row for writing
                        lRowO = wbO.Sheets("Sheet1").Cells.Find(What:="*", _
                                After:=wbO.Sheets("Sheet1").Range("A1"), _
                                Lookat:=xlPart, _
                                LookIn:=xlFormulas, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious, _
                                MatchCase:=False).Row + 1
                    End With
                End With
                '~~> Close the file after copying from it
                wbI.Close SaveChanges:=False
            End If
            strFile = Dir
        Loop
    
        MsgBox "Done"
    End Sub