Chỉnh sửa nhiều file excel có cấu trúc giống nhau cùng 1 lúc

Liên hệ QC

tieutuvodanh192

Thành viên thường trực
Tham gia
25/3/19
Bài viết
289
Được thích
322
Chào các Anh/Chị trên GPE

Tình huống của em là phải xử lý nhiều file excel có cấu trúc giống nhau, ví dụ như: xóa và thay thế, chỉnh định dạng, xóa công thức, lấy thông tin ..v...v..
Hiện tại em thấy sử dụng tính năng record marco khá ổn, tuy nhiên em phải mở từng file lên để chạy, mất khá nhiều thời gian và nặng máy.
Nhờ các Anh/Chị code giúp em đoạn code mở danh sách file và run mã marco cho từng file đã chỉ định trong 1 thao tác thôi được không ạ.

Ví dụ: em có nhu cầu xóa công thức ở các sheet 1 2 3 như bên dưới, muốn chạy code này ở nhiều file excel cùng 1 lúc.

Sub test()
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
Sheets("Sheet1").Activate
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
ActiveWorkbook.Save
End Sub


Cảm ơn các Anh/Chị.
 
Lần chỉnh sửa cuối:
Chào các Anh/Chị trên GPE

Tình huống của em là phải xử lý nhiều file excel có cấu trúc giống nhau, ví dụ như: xóa và thay thế, chỉnh định dạng, xóa công thức, lấy thông tin ..v...v..
Hiện tại em thấy sử dụng tính năng record marco khá ổn, tuy nhiên em phải mở từng file lên để chạy, mất khá nhiều thời gian và nặng máy.
Nhờ các Anh/Chị code giúp em đoạn code mở danh sách file và run mã marco cho từng file đã chỉ định trong 1 thao tác thôi được không ạ.

Ví dụ: em có nhu cầu xóa công thức ở các sheet 1 2 3 như bên dưới, muốn chạy code này ở nhiều file excel cùng 1 lúc.

Sub test()
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
Sheets("Sheet1").Activate
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
ActiveWorkbook.Save
End Sub
Bạn nên đưa file ví dụ lên và diễn giải cụ thể để các thành viên xem và viết code hoặc tư vấn cho bạn nên làm như thế nào thì hợp lý hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Em có ví dụ 3 file 1 2 3, có cùng 1 cấu trúc như ở file đính kèm.

Hiện tại em muốn xóa bỏ công thức ở sheet pivot, sau đó qua sheet data và loại bỏ sản phẩm A ra khỏi dữ liệu:

Sub Macro1()
Sheets("Pivot").Select
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Data").Select
ActiveSheet.Range("$A$1:$E$15").AutoFilter Field:=4, Criteria1:="Product A"
Range("D2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.EntireRow.Delete
ActiveSheet.Range("$A$1:$E$10").AutoFilter Field:=4
ActiveWorkbook.Save
End Sub

Nhờ anh chị code giúp em để có thể chọn nhiều file chỉ định và run ví dụ mã code macro trên cả 3 file cùng 1 lúc, thay vì như hiện tại em phải mở từng file lên để chạy. Số lượng file thực tế em làm việc khá nhiều nên làm thủ công mất nhiều thời gian và máy chạy rất nặng.
 

File đính kèm

  • Example.rar
    35.9 KB · Đọc: 28
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • File 1.xlsb
    19 KB · Đọc: 70
Lần chỉnh sửa cuối:
Upvote 0
Đã dùng code Record Macro chính hiệu rồi mà còn On Error Resume Next chạy lèo lèo trên nhiều file thì nguy hiểm quá.
Giả dụ chọn nhầm một file quan trọng nào đó thì hết cứu luôn nhé.
 
Upvote 0
Đã dùng code Record Macro chính hiệu rồi mà còn On Error Resume Next chạy lèo lèo trên nhiều file thì nguy hiểm quá.
Giả dụ chọn nhầm một file quan trọng nào đó thì hết cứu luôn nhé.
Đã sợ "mất nhiều thời gian" và "nặng máy" rồi thì bắt buộc phải chịu "hết cứu" thôi.
Làm quái gì có thời gian kiểm soát, làm gì rảnh máy để phục hồi.

Người chơi "batch update" ngay từ đầu phải tính đến chuyện kiểm soát lỗi. Đợi phải nhắc nhở là trễ rồi.
 
Upvote 0
Đã dùng code Record Macro chính hiệu rồi mà còn On Error Resume Next chạy lèo lèo trên nhiều file thì nguy hiểm quá.
Giả dụ chọn nhầm một file quan trọng nào đó thì hết cứu luôn nhé.
Tôi không hiểu ý lắm. Chuyện chọn nhầm tập tin "Không mở, nguy hiểm chết người" thì có On Error Resume Next hay không là như nhau. On Error Resume Next được dùng ở đây chỉ để kiểm tra xem người dùng có chọn tập tin nào hay không. Nếu bỏ On Error Resume Next mà người dùng cố tình mở tài liệu "tuyệt mật" thì vẫn mở được. Có hay không có On Error Resume Next là như nhau.

Tuy nhiên dùng On Error Resume Next là không cần thiết, cả cụm
Mã:
On Error Resume Next
...
On Error GoTo 0
thay bằng một dòng duy nhất là
Mã:
If Not IsArray(chonfile) Then Exit Sub.
Không có code nào có thể ngăn người dùng chọn "tài liệu mật", đơn giản vì code không thể biết đâu là tài liệu mật còn đâu là không mật. Tuy nhiên người biết lo xa mà lại có "tài liệu quan trọng cấp 0" thì nên tạo thói quen lưu lại. Mọi thao tác bằng tay hay bằng code đều có thể gây thiệt hại. Con người cũng chỉ là con người, có lúc lơ đãng, mệt mỏi, nhầm lẫn. Vì thế nên lường trước các sự cố và xử lý. Nếu là tôi và nếu code không chỉ đọc mà còn xóa dữ liệu, và trong các tập tin có cả những tập tin mà nếu mất thì chỉ còn "nước mắt và đau khổ" thì LUÔN phải lưu tập tin với một tên khác, tốt nhất là vào thư mục khác TRƯỚC KHI chỉnh sửa và lưu với tên cũ. Khi gặp sự cố luôn có bản sao.
 
Upvote 0
Tôi không hiểu ý lắm. Chuyện chọn nhầm tập tin "Không mở, nguy hiểm chết người" thì có On Error Resume Next hay không là như nhau. On Error Resume Next được dùng ở đây chỉ để kiểm tra xem người dùng có chọn tập tin nào hay không. Nếu bỏ On Error Resume Next mà người dùng cố tình mở tài liệu "tuyệt mật" thì vẫn mở được. Có hay không có On Error Resume Next là như nhau.
Vấn đề là ở đoạn code xử lý dữ liệu. Giả sử code thực hiện như sau:
  • Chọn sheet A
  • Sửa, xóa dữ liệu ở sheet hiện hành
  • Chọn sheet B
  • Sửa, xóa dữ liệu ở sheet hiện hành
  • Chọn sheet C
  • Sửa, xóa dữ liệu ở sheet hiện hành
Nếu chọn nhầm file thì file được chọn sẽ có cấu trúc khác. Trường hợp không bỏ qua lỗi, chỉ cần thiếu một trong 3 sheet A, B, C là code sẽ lỗi (hoặc có thông báo nếu code có xử lý lỗi), lúc này file chưa được lưu, người dùng sẽ phát hiện và can thiệp kịp thời.
Trường hợp bỏ qua lỗi, code sẽ xóa không theo chủ đích của người dùng (do chọn nhầm file) trên sheet hiện hành lúc mở file và các sheet A, B, C (tùy vào file chọn nhầm có tồn tại sheet nào trong các sheet A, B, C) và lưu file lại.
 
Upvote 0
Vấn đề là ở đoạn code xử lý dữ liệu. Giả sử code thực hiện như sau:
  • Chọn sheet A
  • Sửa, xóa dữ liệu ở sheet hiện hành
  • Chọn sheet B
  • Sửa, xóa dữ liệu ở sheet hiện hành
  • Chọn sheet C
  • Sửa, xóa dữ liệu ở sheet hiện hành
Nếu chọn nhầm file thì file được chọn sẽ có cấu trúc khác. Trường hợp không bỏ qua lỗi, chỉ cần thiếu một trong 3 sheet A, B, C là code sẽ lỗi (hoặc có thông báo nếu code có xử lý lỗi), lúc này file chưa được lưu, người dùng sẽ phát hiện và can thiệp kịp thời.
Trường hợp bỏ qua lỗi, code sẽ xóa không theo chủ đích của người dùng (do chọn nhầm file) trên sheet hiện hành lúc mở file và các sheet A, B, C (tùy vào file chọn nhầm có tồn tại sheet nào trong các sheet A, B, C) và lưu file lại.
Chắc bạn không hiểu. Tôi góp ý cho bài của bạn, tôi không khen code của bài #4. Hai chuyện rạch ròi. Bạn nói nguy hiểm đi kèm với On Error Resume Next. Tôi nói là có hay không có On Error Resume Next không liên quan. Vì có hay không thì vẫn chọn được tập tin "tối mật", "nguy hiểm. Nếu bài #9 là nội dung bài #6 thì tôi không có ý kiến đâu. Nhưng trong bài 6 bạn lại nói về On Error Resume Next.

Mà bạn không đọc kỹ code của người ta rồi. Người ta dùng On Error Resume Next chỉ để kiểm tra xem người dùng có chọn tập tin nào hay không. Ngay sau đó có On Error GoTo 0. Vậy bạn đừng viết: "Trường hợp bỏ qua lỗi, code sẽ xóa không theo chủ đích của người dùng (do chọn nhầm file) trên sheet hiện hành lúc mở file và các sheet A, B, C (tùy vào file chọn nhầm có tồn tại sheet nào trong các sheet A, B, C) và lưu file lại.".

Code KHÔNG BỎ QUA LỖI.

Trong code ban đầu trước dòng For i = 1 To UBound(chonfile) người ta có On Error GoTo 0 bạn ạ. Bạn vẫn cho là code thao tác chỉnh sửa của người ta BỎ QUA LỖI?
 
Lần chỉnh sửa cuối:
Upvote 0
Mà bạn không đọc kỹ code của người ta rồi
Anh xem lại thời gian trả lời của bài #6 và thời gian sửa bài của bài #4 nhé.
Bài #6 nói về phương án đến thời điểm đó, cụ thể là bài #4 tại thời điểm gửi bài #6. Dùng On Error Resume Next xuyên suốt từ đầu đến cuối code mới nguy hiểm chứ kiểm soát được thì không có gì phải bàn cãi nữa.
 
Upvote 0
Anh xem lại thời gian trả lời của bài #6 và thời gian sửa bài của bài #4 nhé.
Bài #6 nói về phương án đến thời điểm đó, cụ thể là bài #4 tại thời điểm gửi bài #6. Dùng On Error Resume Next xuyên suốt từ đầu đến cuối code mới nguy hiểm chứ kiểm soát được thì không có gì phải bàn cãi nữa.
Tôi đọc bài #6 nên tò mò tải về tập tin ở bài #4. Ở thời điểm tôi tải bài #4, tức sau nhận xét ở bài #6 thì cụm

On Error Resume Next
...
On Error GoTo 0


nằm trước dòng

For i = 1 To UBound(chonfile)

và từ đó tới cuối không có On Error Resume Next ***

Nếu trong khoảng từ sau bài #6 tới trước thời điểm tôi tải bài #4 code đã được sửa để xóa On Error Resume Next thì chỉ cần nói một câu: Bài anh đọc đã được sửa và xóa On Error Resume Next ở một chỗ khác (hoặc thêm On Error GoTo 0). Bạn lại không viết thế mà viết bài #9, như thể tôi đọc code mà không hiểu tí gì.

Tóm lại nếu bài tôi đọc đã được sửa và xóa On Error ResumeNext (hoặc thêm On Error GoTo 0) sau khi có ý kiến của bài #6 thì không còn gì để bàn.
------------
Về thời gian chỉnh sửa thì rất lạ. Sau khi đọc bài #9 tôi kiểm tra lại bài #4. Rõ ràng ở chỗ tôi khuyên thay cả cụm

On Error Resume Next
...
On Error GoTo 0


bằng

If Not IsArray(chonfile) Then Exit Sub

thì bây giờ chỉ còn If Not IsArray(chonfile) Then Exit Sub. Vậy có thể hiểu là bài #4 đã được sửa sau bài của tôi ở 17:11 giờ. Trong khi đó GPE lại ghi là Lần chỉnh sửa cuối: 09:38. Thế là thế nào? Người ta chỉnh sửa sau khi đọc bài của tôi mà thời gian chỉnh sửa lại trước khi tôi viết bài hơn 7 tiếng?
-------------
***

Bài #4 mà tôi tải về trước khi viết bài #8
Sub Macro1()
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim chonfile As Variant, i As Long, openfile
If MsgBox("Ban chon file can lay du lieu", vbYesNo) = vbYes Then
chonfile = Application.GetOpenFilename(Title:="Chon file du lieu can lay", filefilter:="exel file(*.xls*),*.xls*", MultiSelect:=True)
On Error Resume Next
If UBound(chonfile) < 1 Then
Exit Sub
End If

On Error GoTo 0
For i = 1 To UBound(chonfile)
Set openfile = Workbooks.Open(chonfile(i))

Sheets("Pivot").Select
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Data").Select
ActiveSheet.Range("$A$1:$E$15").AutoFilter Field:=4, Criteria1:="Product A"
Range("D2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.EntireRow.Delete
ActiveSheet.Range("$A$1:$E$10").AutoFilter Field:=4
ActiveWorkbook.Save

openfile.Close
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom