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”.

ArrowFilesSource

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ể đó.

ArrowRawFile

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.

ArrowMain

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.

ArrowAfterRunningSingleColumnMacro

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.

ArrowOutputAfterRunningSingleMacro

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.

ArrowRunningSecondMacro

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ể đó.

ArrowFileAfterRunningSecondMacro

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]