Sao chép một Phạm vi từ mỗi sổ làm việc trong một thư mục bằng VBA trong Microsoft Excel
Trong bài viết này, chúng tôi sẽ tạo một macro để sao chép dữ liệu từ nhiều sổ làm việc trong một thư mục sang một sổ làm việc mới.
Chúng tôi sẽ tạo hai macro; một macro sẽ chỉ sao chép các bản ghi từ cột đầu tiên sang sổ làm việc mới và macro thứ hai sẽ sao chép tất cả dữ liệu vào đó.
Dữ liệu thô cho ví dụ này bao gồm hồ sơ chấm công của nhân viên.
Trong TestFolder, chúng tôi có nhiều tệp Excel. Tên tệp của tệp Excel đại diện cho một ngày cụ thể ở định dạng “ddmmyyyy”.
Mỗi tệp Excel chứa ngày, id nhân viên và tên nhân viên của những nhân viên có mặt vào ngày cụ thể đó.
Chúng tôi đã tạo hai macro; “CopyingSingleColumnData” và “CopyingMultipleColumnData”. Macro “CopyingSingleColumnData” sẽ chỉ sao chép các bản ghi từ cột đầu tiên của tất cả các tệp trong thư mục vào sổ làm việc mới. Macro “CopyingMultipleColumnData” sẽ sao chép tất cả dữ liệu từ tất cả các tệp trong thư mục vào sổ làm việc mới.
Macro “CopyingSingleColumnData” có thể được thực thi bằng cách nhấp vào nút “Sao chép một cột”. Macro “CopyingMultipleColumnData” có thể được thực thi bằng cách nhấp vào nút “Sao chép Nhiều Cột”.
Trước khi chạy macro, người ta phải chỉ định đường dẫn của thư mục trong hộp văn bản, nơi các tệp Excel được đặt.
Khi nhấp vào nút “Sao chép một cột”, một sổ làm việc mới “Tập tin hợp nhất” sẽ được tạo trong thư mục đã xác định. Sổ làm việc này sẽ chứa dữ liệu tổng hợp từ cột đầu tiên của tất cả các tệp trong thư mục.
chỉ chứa các bản ghi trong cột đầu tiên. Sau khi có dữ liệu tổng hợp, chúng tôi có thể tìm ra số lượng nhân viên có mặt vào một ngày cụ thể bằng cách đếm số ngày. Số lượng của một ngày cụ thể sẽ bằng số lượng nhân viên có mặt trong ngày cụ thể đó ngày.
Khi nhấp vào nút “Sao chép Nhiều Cột”, nó sẽ tạo ra sổ làm việc mới “Tổng hợp các Cột” trong thư mục đã xác định. Sổ làm việc này sẽ chứa dữ liệu tổng hợp từ tất cả các bản ghi của tất cả các tệp trong thư mục.
Sổ làm việc mới được tạo sẽ chứa tất cả các bản ghi từ tất cả các tệp trong thư mục. Khi chúng tôi có dữ liệu tổng hợp, chúng tôi có tất cả các chi tiết tham dự trong một tệp duy nhất. Chúng tôi có thể dễ dàng tìm thấy số lượng nhân viên có mặt trong ngày cụ thể đó và cũng có được tên của những nhân viên đã có mặt trong ngày cụ thể đó.
Giải thích mã
Sheet1.TextBox1.Value Đoạn mã trên được sử dụng để lấy giá trị được chèn vào hộp văn bản “TextBox1” từ trang tính “Sheet1”.
Dir (FolderPath & “* .xlsx”)
Đoạn mã trên được sử dụng để lấy tên của tệp, có phần mở rộng tệp là “.xlsx”. Chúng tôi đã sử dụng ký tự đại diện * cho tên tệp nhiều ký tự.
Trong khi Tên tệp <> “”
Count1 = Count1 + 1 ReDim Bảo quản FileArray (1 đến đếm1)
FileArray (Count1) = FileName FileName = Dir ()
Mã Wend Above được sử dụng để lấy tên tệp của tất cả các tệp trong thư mục.
Đối với i = 1 Tới UBound (FileArray)
Tiếp theo Mã trên được sử dụng để lặp qua tất cả các tệp trong thư mục.
Phạm vi (“A1”, Ô (LastRow, 1)). Sao chép DestWB.ActiveSheet.Cells (LastDesRow, 1)
Đoạn mã trên được sử dụng để sao chép bản ghi từ cột đầu tiên vào sổ làm việc đích.
Phạm vi (“A1”, ActiveCell.SpecialCells (xlCellTypeLastCell)). Sao chép DestWB.ActiveSheet.Cells (LastDesRow, 1)
Mã trên được sử dụng để sao chép tất cả bản ghi từ sổ làm việc hiện hoạt sang sổ làm việc đích.
Vui lòng theo dõi bên dưới để biết mã
Option Explicit Sub CopyingSingleColumnData() 'Declaring variables Dim FileName, FolderPath, FileArray(), FileName1 As String Dim LastRow, LastDesRow, Count1, i As Integer Dim SourceWB, DestWB As Workbook Application.ScreenUpdating = False FolderPath = Sheet1.TextBox1.Value 'Inserting backslash in the folder path if backslash(\) is missing If Right(FolderPath, 1) <> "\" Then FolderPath = FolderPath & "\" End If 'Searching for Excel files FileName = Dir(FolderPath & "*.xlsx") Count1 = 0 'Looping through all the Excel files in the folder While FileName <> "" Count1 = Count1 + 1 ReDim Preserve FileArray(1 To Count1) FileArray(Count1) = FileName FileName = Dir() Wend 'Creating a new workbook Set DestWB = Workbooks.Add For i = 1 To UBound(FileArray) 'Finding the last row in the workbook LastDesRow = DestWB.ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row 'Opening the Excel workbook Set SourceWB = Workbooks.Open(FolderPath & FileArray(i)) LastRow = ActiveCell.SpecialCells(xlCellTypeLastCell).Row 'Pasting the copied data to last row in the destination workbook If LastDesRow = 1 Then 'Copying the first column to last row in the destination workbook Range("A1", Cells(LastRow, 1)).Copy DestWB.ActiveSheet.Cells(LastDesRow, 1) Else Range("A1", Cells(LastRow, 1)).Copy DestWB.ActiveSheet.Cells(LastDesRow + 1, 1) End If SourceWB.Close False Next 'Saving and closing a new Excel workbook DestWB.SaveAs FileName:=FolderPath & "ConsolidatedFile.xlsx" DestWB.Close Set DestWB = Nothing Set SourceWB = Nothing End Sub Sub CopyingMultipleColumnData() 'Declaring variables Dim FileName, FolderPath, FileArray(), FileName1 As String Dim LastRow, LastDesRow, Count1, i As Integer Dim SourceWB, DestWB As Workbook Application.ScreenUpdating = False FolderPath = Sheet1.TextBox1.Value 'Inserting backslash in the folder path if backslash(\) is missing If Right(FolderPath, 1) <> "\" Then FolderPath = FolderPath & "\" End If 'Searching for Excel files FileName = Dir(FolderPath & "*.xlsx") Count1 = 0 'Looping through all the Excel files in the folder While FileName <> "" Count1 = Count1 + 1 ReDim Preserve FileArray(1 To Count1) FileArray(Count1) = FileName FileName = Dir() Wend 'Creating a new workbook Set DestWB = Workbooks.Add For i = 1 To UBound(FileArray) 'Finding the last row in the workbook LastDesRow = DestWB.ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row 'Opening the Excel workbook Set SourceWB = Workbooks.Open(FolderPath & FileArray(i)) 'Pasting the copied data to last row in the destination workbook If LastDesRow = 1 Then 'Copying all data in the worksheet to last row in the destination workbook Range("A1", ActiveCell.SpecialCells(xlCellTypeLastCell)).Copy DestWB.ActiveSheet.Cells(LastDesRow, 1) Else Range("A1", ActiveCell.SpecialCells(xlCellTypeLastCell)).Copy DestWB.ActiveSheet.Cells(LastDesRow + 1, 1) End If SourceWB.Close False Next 'Saving and closing a new Excel workbook DestWB.SaveAs FileName:=FolderPath & "ConsolidatedAllColumns.xlsx" DestWB.Close Set DestWB = Nothing Set SourceWB = Nothing End Sub
Nếu bạn thích blog này, hãy chia sẻ nó với bạn bè của bạn trên Facebook và Facebook.
Chúng tôi rất muốn nghe ý kiến từ bạn, hãy cho chúng tôi biết cách chúng tôi có thể cải thiện công việc của mình và làm cho nó tốt hơn cho bạn. Viết thư cho chúng tôi [email protected]