excel - 将多个工作表复制到 VBA 工作簿本身

标签 excel vba

下面的代码可以完美地将数据从指定工作簿的事件工作表复制到新的未命名工作簿中。它从第一个文件复制第一行,并将除第一(标题)行之外的其他文件中的数据与其组合。

但是,我正在学习,我想知道如何以相同的方式将数据组合到宏工作簿本身中(而不是新的工作簿中)。我打算将数据合并到同一宏书中后进行一些宏录制。

请帮助我如何做到这一点。我尝试将新工作簿(运行以下代码后生成的工作簿)中的组合工作表移动/复制到宏工作簿中,然后关闭新工作簿而不保存它,但到目前为止没有成功。请帮忙。

Option Explicit
Sub CombineDataFiles()

Dim DataBook As Workbook, OutBook As Workbook
Dim DataSheet As Worksheet, OutSheet As Worksheet
Dim TargetFiles As FileDialog
Dim MaxNumberFiles As Long, FileIdx As Long, _
    LastDataRow As Long, LastDataCol As Long, _
    HeaderRow As Long, LastOutRow As Long
Dim DataRng As Range, OutRng As Range

'initialize constants
MaxNumberFiles = 2001
HeaderRow = 1 'assume headers are always in row 1
LastOutRow = 1

'prompt user to select files
Set TargetFiles = Application.FileDialog(msoFileDialogOpen)
With TargetFiles
    .AllowMultiSelect = True
    .Title = "Multi-select target data files:"
    .ButtonName = ""
    .Filters.Clear
    .Filters.Add ".xlsx files", "*.xlsx"
    .Show
End With

'error trap - don't allow user to pick more than 2000 files
If TargetFiles.SelectedItems.Count > MaxNumberFiles Then
    MsgBox ("Too many files selected, please pick more than " &     MaxNumberFiles & ". Exiting sub...")
    Exit Sub
End If

'set up the output workbook
Set OutBook = Workbooks.Add
Set OutSheet = OutBook.Sheets(1)

'loop through all files
For FileIdx = 1 To TargetFiles.SelectedItems.Count

    'open the file and assign the workbook/worksheet
    Set DataBook = Workbooks.Open(TargetFiles.SelectedItems(FileIdx))
    Set DataSheet = DataBook.ActiveSheet

    'identify row/column boundaries
    LastDataRow = DataSheet.Cells.Find("*", SearchOrder:=xlByRows,     SearchDirection:=xlPrevious).Row
    LastDataCol = DataSheet.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    'if this is the first go-round, include the header
    If FileIdx = 1 Then
        Set DataRng = Range(DataSheet.Cells(HeaderRow, 1),                     DataSheet.Cells(LastDataRow, LastDataCol))
        Set OutRng = Range(OutSheet.Cells(HeaderRow, 1),     OutSheet.Cells(LastDataRow, LastDataCol))
    'if this is NOT the first go-round, then skip the header
    Else
        Set DataRng = Range(DataSheet.Cells(HeaderRow + 1, 1), DataSheet.Cells(LastDataRow, LastDataCol))
        Set OutRng = Range(OutSheet.Cells(LastOutRow + 1, 1), OutSheet.Cells(LastOutRow + 1 + LastDataRow, LastDataCol))
    End If

    'copy the data to the outbook
    DataRng.Copy OutRng

    'close the data book without saving
    DataBook.Close False

    'update the last outbook row
    LastOutRow = OutSheet.Cells.Find("*", SearchOrder:=xlByRows,     SearchDirection:=xlPrevious).Row

Next FileIdx

'let the user know we're done!
MsgBox ("Combined " & TargetFiles.SelectedItems.Count & " files!")

End Sub

最佳答案

OutBook 变量更改为引用 ThisWorkbook ,并将 OutSheet 更改为此工作簿中的工作表。

'set up the output workbook
Set OutBook = ThisWorkbook `Workbooks.Add

您可能想要添加一个新工作表:

Set OutSheet = OutBook.Sheets.Add
OutSheet.Name = "CombineDataFilesOutput"

如果您经常这样做,您可能需要为工作表指定一个唯一的 ID,以便您可以添加多个工作表,而不必担心重复的工作表名称。我通常使用某种格式的 Now() 来创建唯一标识符:

OutSheet.Name = Format(Now(),"YYYYMMDDhhmmss")
<小时/>

我还注意到您对所选文件限制的评论似乎误导了用户。您告诉他们“请选择超过 2000 个文件”,但应该说“请选择不超过 2000 个文件”,甚至更好“请选择少于 2000 个文件”。

'error trap - don't allow user to pick more than 2000 files
If TargetFiles.SelectedItems.Count > MaxNumberFiles Then
    MsgBox ("Too many files selected, please pick less than " &     MaxNumberFiles & ". Exiting sub...")
Exit Sub
End If

关于excel - 将多个工作表复制到 VBA 工作簿本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689663/

相关文章:

ms-access - 在 ms-access 中使用 vba 以编程方式复制表单

vba - Excel VBA将值与列进行比较

python - 在 Python 中循环 excel 工作表和行

vba - 使用 VBA 的方差协方差矩阵

excel - 在 Excel 中创建未知大小的向量

excel - 如何搜索列并返回具有特定值的下一列中的值

vba - 将 Excel 工作簿保存在新创建的同名文件夹中

vba - 如何在 PowerPoint 中添加点击时被光标替换的文本?

excel - 使用 Spreadsheet::ParseExcel 时出错

vba - 将数据从 SQL Server 加载到 Excel 的最快方法