Chia tệp Excel
Xin chào,
Tôi đang sử dụng một macro hoạt động rất tốt ngoại trừ một điều. Tôi cần tách bảng tính Excel thành các tệp riêng biệt dựa trên dữ liệu trong một cột. Macro bên dưới thực hiện điều này rất tốt, tuy nhiên, tôi cũng cần mười hàng cuối cùng được đưa vào mỗi tệp mới. Tệp chứa số dư tài khoản yêu cầu một bản xác nhận có dòng chữ ký xuất hiện ở cuối mỗi tệp. Liệu có thể sửa đổi mã để tách tệp dựa trên một cột, bắt đầu từ hàng mong muốn và bao gồm mười hàng cuối cùng của tài liệu trong mỗi tệp không? Tôi rất cảm ơn bất kỳ sự trợ giúp nào bạn có thể cung cấp. Cảm ơn rất nhiều về thời gian và sự giúp đỡ của bạn.
Public Sub SplitToFiles()
' MACRO SplitToFiles
Cập nhật lần cuối: 28/05/2019
Tác giả: mtone
Phiên bản 1.2
' Sự miêu tả:
' Lặp qua một cột được chỉ định và tách từng giá trị riêng biệt thành một tệp riêng bằng cách tạo bản sao và xóa các hàng bên dưới và bên trên cột đó.
'
Lưu ý: Các giá trị trong cột phải là duy nhất hoặc đã được sắp xếp.
'
'Các ô sau đây sẽ bị bỏ qua khi phân định các phần:'
' - ô trống, hoặc chỉ chứa khoảng trắng
' - cùng một giá trị được lặp lại
' - các ô chứa "tổng cộng"
'
Các tệp được lưu trong thư mục con "Split" từ vị trí của sổ làm việc nguồn và được đặt tên theo tên phần.
Bảng tính Dim osh As ' Bảng tính gốc
Dim iRow As Long ' Cursors
Dim iCol As Long
Dim iFirstRow As Long ' Hằng số
Dim iTotalRows Dài ' Không đổi
Dim iStartRow As Long ' Dấu phân cách phần
Dim iStopRow As Long
Dim sSectionName As String ' Tên phần (và tên tệp)
Dim rCell As Range ' current cell
Dim owb As Workbook ' Original workbook
Dim sFilePath As String ' Hằng số
Dim iCount As Integer ' Số lượng tài liệu đã tạo
iCol = Application.InputBox("Nhập số cột dùng để tách", "Chọn cột", 2, , , , , 1)
iRow = Application.InputBox("Nhập số hàng bắt đầu (để bỏ qua tiêu đề)", "Chọn hàng", 2, , , , , 1)
iFirstRow = iRow
Đặt osh = Application.ActiveSheet
Đặt owb = Application.ActiveWorkbook
iTotalRows = osh.UsedRange.Rows.Count
sFilePath = Application.ActiveWorkbook.Path
Nếu Dir(sFilePath + "\Split", vbDirectory) = "" thì
MkDir sFilePath + "\Split"
Kết thúc nếu
'Tắt sự kiện cập nhật màn hình'
Application.EnableEvents = False
Ứng dụng.Màn hình cập nhật = Sai
LÀM
'Lấy ô tại vị trí con trỏ'
Đặt rCell = osh.Cells(iRow, iCol)
sCell = Replace(rCell.Text, " ", ")
Nếu sCell = "" Hoặc (rCell.Text = sSectionName Và iStartRow <> 0) Hoặc InStr(1, rCell.Text, "total", vbTextCompare) <> 0 Thì
' Điều kiện bỏ qua đã được đáp ứng'
Khác
'Đã tìm thấy phần mới'
Nếu iStartRow = 0 thì
'Dấu phân cách StartRow chưa được thiết lập, nghĩa là bắt đầu một phần mới'
sSectionName = rCell.Text
iStartRow = iRow
Khác
'Dấu phân cách StartRow đã được thiết lập, có nghĩa là chúng ta đã đến cuối một phần.'
iStopRow = iRow - 1
'Truyền các biến cho một hàm con riêng biệt để tạo và lưu bảng tính mới.
CopySheet osh, iFirstRow, iStartRow, iStopRow, iTotalRows, sFilePath, sSectionName, owb.fileFormat
iCount = iCount + 1
'Đặt lại dấu phân cách phần
iStartRow = 0
iStopRow = 0
'Sẵn sàng tiếp tục vòng lặp'
iRow = iRow - 1
Kết thúc nếu
Kết thúc nếu
Tiếp tục cho đến khi đạt đến hàng cuối cùng
Nếu iRow < iTotalRows thì
iRow = iRow + 1
Khác
'Hoàn tất. Lưu phần cuối cùng'
iStopRow = iRow
CopySheet osh, iFirstRow, iStartRow, iStopRow, iTotalRows, sFilePath, sSectionName, owb.fileFormat
iCount = iCount + 1
'Lối ra'
Thoát ra
Kết thúc nếu
Vòng lặp
'Bật cập nhật sự kiện màn hình'
Ứng dụng.Màn hình cập nhật = Đúng
Ứng dụng.ChoPhóngSựKiện = Đúng
MsgBox Str(iCount) + " tài liệu đã lưu trong " + sFilePath
End Sub
Public Sub DeleteRows(targetSheet As Worksheet, RowFrom As Long, RowTo As Long)
Dim rngRange As Range
Set rngRange = Range(targetSheet.Cells(RowFrom, 1), targetSheet.Cells(RowTo, 1)).EntireRow
rngRange.Select
rngRange.Delete
End Sub
Public Sub CopySheet(osh As Worksheet, iFirstRow As Long, iStartRow As Long, iStopRow As Long, iTotalRows As Long, sFilePath As String, sSectionName As String, fileFormat As XlFileFormat)
Bảng tính Dim ash ' Bản sao bảng tính
Dim awb As Workbook ' New workbook
Sổ tay
osh.Copy
Đặt ash = Application.ActiveSheet
'Xóa các hàng sau phần
Nếu iTotalRows > iStopRow thì
DeleteRows ash, iStopRow + 1, iTotalRows
Kết thúc nếu
' Xóa các hàng trước phần
Nếu iStartRow > iFirstRow thì
DeleteRows ash, iFirstRow, iStartRow - 1
Kết thúc nếu
Chọn ô trên cùng bên trái
ash.Cells(1, 1).Select
' Loại bỏ một vài ký tự không hợp lệ để tránh tên tệp không hợp lệ'
sSectionName = Replace(sSectionName, "/", " ")
sSectionName = Replace(sSectionName, "\", " ")
sSectionName = Replace(sSectionName, ":", " ")
sSectionName = Replace(sSectionName, "=", " ")
sSectionName = Replace(sSectionName, "*", " ")
sSectionName = Replace(sSectionName, ".", " ")
sSectionName = Replace(sSectionName, "?", " ")
sSectionName = Strings.Trim(sSectionName)
' Lưu ở định dạng giống với bảng tính gốc
ash.SaveAs sFilePath + "\Split\" + sSectionName + " " + "GL"= " " + "MAFES" , fileFormat
' Đóng
Đặt awb = ash.Parent
awb.Close SaveChanges:=False
End Sub
Trả lời:
Chào M
Tôi là V. Arya, Cố vấn độc lập, sẵn sàng hỗ trợ bạn giải quyết vấn đề này.
Yêu cầu duy nhất có phải là chỉ cần bao gồm 10 dòng cuối cùng trong mỗi tệp Excel được tạo ra không? Vui lòng xác nhận.
Trả lời:
Đúng vậy, nhiệm vụ bổ sung duy nhất tôi cần là thêm mười hàng cuối cùng vào mỗi tệp Excel được tạo ra. Cảm ơn rất nhiều về sự giúp đỡ của bạn.
Trả lời:
Tôi cần một tập tin mẫu để xem macro của bạn hoạt động như thế nào. Khi tôi thử nghiệm, nó chỉ tạo ra một tập tin duy nhất. Nếu bạn có thể đăng tải một tập tin mẫu không chứa dữ liệu bí mật lên OneDrive và chia sẻ liên kết ở đây, tôi có thể kiểm tra kỹ hơn.
Trả lời:
Tôi đã tạo một mẫu bảng tính. Cảm ơn bạn đã giúp đỡ.
https://1drv.ms/x/s!Ans2xKtLCG-9b3cmeFwA4_NMryQ?e=enqPf0
Trả lời:
Tôi đã xem qua mã nguồn và tập tin mẫu của bạn.
Tôi cần làm rõ một điều, liệu macro này có hoạt động đúng cách không khi nó cứ tạo ra một tập tin duy nhất và ghi đè lên tập tin hiện có? Đây có phải là cách nó được thiết kế để hoạt động không?
Trả lời:
Hiện tại, macro sẽ tạo một tệp tin với nội dung của ô. Ví dụ, nếu bạn tách theo cột 1, nó sẽ đặt tên tệp tin là A1 cho phần chứa ô A1, và tệp tin tiếp theo sẽ được đặt tên là A2, v.v. Nếu tên tệp tin đã tồn tại trong thư mục, nó sẽ ghi đè lên tệp tin hiện có. Trong quy trình của chúng tôi, sau khi tệp tin được tách ra, các tệp tin riêng lẻ sẽ được di chuyển vào các thư mục riêng biệt, để lại thư mục gốc trống cho lần chạy báo cáo tiếp theo.
Comments
Post a Comment