VBA lưu file, in, và mở lại file gốc ban đầu (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

Emyeuexcel

Thành viên thường trực
Tham gia
9/6/16
Bài viết
323
Được thích
35
Chào các anh chị,

VBA mình mới mò mẫm đang học.
Mình có file đính kèm, có code VBA (mình cóp nhặt lồng ghép code trên mạng). Chân thành cảm ơn các tác giả những code này!
Giờ mình muốn in hàng loạt theo số thứ tự bên sheet Lot, nhưng code này không thực hiện được, chỉ in đúng 1 số nào nhập đầu tiên (vd: 2-5, thì chỉ in số 2)
Nếu mình chịu khó in từng số thì vẫn được. Hiện code này sau khi lưu ra file mới theo ý mình và in xong cho 1 số thứ tự thì ok.
Tuy nhiên nó không mở lại được file gốc ban đầu để in tiếp.
Mong các anh chị vui lòng giúp mình sửa code sao cho nó mở lại file gốc. Và nếu tuyệt vời hơn thì sửa code lưu file, in hàng loạt theo những số thự tự đã nhập vào.
Xin chân thành cảm ơn các anh chị!
 

File đính kèm

For i = LBound(aPrint) To UBound(aPrint)
Filename = Application.WorksheetFunction.VLookup(aPrint(i), Sheets("Lot").Range("A1:C" & lastRow), 3, False)
ActiveWorkbook.SaveAs Filename:="D:\TAM\" & Filename & ".xlsm"
Sheets("in").Range("H1").Value = aPrint(i)
With Range("A7:K105")
.AutoFilter Field:=10, Criteria1:="0"
.SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
ActiveSheet.AutoFilterMode = False
Sheets("in").Range("H1").Value = aPrint(i)
Sheets("in").PrintOut Copies:=1, Preview:=False, PrintToFile:=False
Set wb = Workbooks.Open("D:\TAM\EPR Tempalte.xlsm")
Workbooks(Filename).Close Savechanges:=True
Mình vừa đổi như vậy thì save as theo tên file, in xong, open được file gốc.
Nhưng chưa in hàng loạt file.
Mong các anh chị diễn đàn chỉ giúp mình ah!
 
Upvote 0
Chào các anh chị,

VBA mình mới mò mẫm đang học.
Mình có file đính kèm, có code VBA (mình cóp nhặt lồng ghép code trên mạng). Chân thành cảm ơn các tác giả những code này!
Giờ mình muốn in hàng loạt theo số thứ tự bên sheet Lot, nhưng code này không thực hiện được, chỉ in đúng 1 số nào nhập đầu tiên (vd: 2-5, thì chỉ in số 2)
Nếu mình chịu khó in từng số thì vẫn được. Hiện code này sau khi lưu ra file mới theo ý mình và in xong cho 1 số thứ tự thì ok.
Tuy nhiên nó không mở lại được file gốc ban đầu để in tiếp.
Mong các anh chị vui lòng giúp mình sửa code sao cho nó mở lại file gốc. Và nếu tuyệt vời hơn thì sửa code lưu file, in hàng loạt theo những số thự tự đã nhập vào.
Xin chân thành cảm ơn các anh chị!
Có lẽ bạn nêu kết quả mong muốn và điều kiện thực hiện các bước (ví dụ điều kiện lọc, in, xóa, tạo file mới có những sheet nào, định dạng ra sao ...) để thành viên nào có thời gian viết code mới giúp bạn sẽ nhanh hơn, chứ đi mò mẫm để hiểu và sửa code này chắc mất khá nhiều thời gian và khả năng dài dòng hơn code mới.
 
Upvote 0
Có lẽ bạn nêu kết quả mong muốn và điều kiện thực hiện các bước (ví dụ điều kiện lọc, in, xóa, tạo file mới có những sheet nào, định dạng ra sao ...) để thành viên nào có thời gian viết code mới giúp bạn sẽ nhanh hơn, chứ đi mò mẫm để hiểu và sửa code này chắc mất khá nhiều thời gian và khả năng dài dòng hơn code mới.
Cảm ơn bạn góp ý!
Mình muốn in hàng loạt theo số thứ tự bên sheet Lot (có thể in 1 số, 2 hay nhiều số liên tục, hay không liên tục)
Trước khi in, save file vào thư mục tùy ý do mình chỉ định theo tên file cột C, sheet Lot, tương ứng từng số thứ tự, và xóa các dòng bằng 0 ở cột J, bên sheet In.
 
Upvote 0
Cảm ơn bạn góp ý!
Mình muốn in hàng loạt theo số thứ tự bên sheet Lot (có thể in 1 số, 2 hay nhiều số liên tục, hay không liên tục)
Trước khi in, save file vào thư mục tùy ý do mình chỉ định theo tên file cột C, sheet Lot, tương ứng từng số thứ tự, và xóa các dòng bằng 0 ở cột J, bên sheet In.
Vậy file kết quả đâu cần đến 2 sheets như file gốc, chỉ cần 1 sheet in không có các dòng có giá trị bằng không ở cột J là được rồi chứ nhỉ.
 
Upvote 0
Vậy file kết quả đâu cần đến 2 sheets như file gốc, chỉ cần 1 sheet in không có các dòng có giá trị bằng không ở cột J là được rồi chứ nhỉ.
Đúng rồi bạn. File save as ra đặt tên file theo cột C sheet Lot, xóa dòng = 0 cột J và in, xong đóng file này lại luôn thì không cần sheet Lot nữa cũng được, mà để cũng không sao.
Còn file gốc thì bắt buộc phải có.
Mong bạn và các cao thủ VBA giúp mình với!
Xin cảm ơn nhiều!
 
Upvote 0
Đúng rồi bạn. File save as ra đặt tên file theo cột C sheet Lot, xóa dòng = 0 cột J và in, xong đóng file này lại luôn thì không cần sheet Lot nữa cũng được, mà để cũng không sao.
Còn file gốc thì bắt buộc phải có.
Mong bạn và các cao thủ VBA giúp mình với!
Xin cảm ơn nhiều!
Không dùng từ bôi đậm nhé.
 
Upvote 0
Mong các anh chị vui lòng giúp mình sửa code sao cho nó mở lại file gốc. Và nếu tuyệt vời hơn thì sửa code lưu file, in hàng loạt theo những số thự tự đã nhập vào.
Chưa thử hết các trường hợp, bạn chạy thử xem thế nào.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mong các anh chị vui lòng giúp mình sửa code sao cho nó mở lại file gốc. Và nếu tuyệt vời hơn thì sửa code lưu file, in hàng loạt theo những số thự tự đã nhập vào.
Tham khảo thêm một cách lựa chọn các dòng cần in và xuất file trong InputBox.
 

File đính kèm

Upvote 0
Chưa thử hết các trường hợp, bạn chạy thử xem thế nào.
Cảm ơn bạn nhiệt tình giúp mình.
Code của bạn lưu được file theo đúng tên, nhưng nội dung các file giống y nhau vì nó nhân ra từ file được lưu ban đầu nên số lô hàng thì đúng, nhưng sản phẩm bên dưới sai.
Bạn giúp mình làm sao nó phải quay lại save as ra từ file gốc thì nó sẽ đúng cả sản phẩm và tên lô hàng.
Mình rất biết ơn bạn!
Bài đã được tự động gộp:

Tham khảo thêm một cách lựa chọn các dòng cần in và xuất file trong InputBox.
Bạn ơi, code này thì nhập vào nó không chạy.
 
Upvote 0
số lô hàng thì đúng, nhưng sản phẩm bên dưới sai.
Bạn giúp mình làm sao nó phải quay lại save as ra từ file gốc thì nó sẽ đúng cả sản phẩm và tên lô hàng.
Không có vài file kết quả mong muốn nên khó hình dung.
Bạn ơi, code này thì nhập vào nó không chạy.
Chịu khó đọc hướng dẫn trên InputBox đã.
 
Upvote 0
Các anh chị GPE ơi,

Mình đang nghĩ sang 1 cách khác là copy ra sheet mới giữ định dạng theo sheet gốc (để in), đặt tên theo số thứ tự của trong sheet Lot, xóa dòng bằng 0 các sheet mới tạo, in sheet mới tạo, rồi lưu ra 1 file theo tên cột C của sheet Lot. Xóa sheet mới tạo đi.
Vậy nó sẽ chạy code trên file gốc đang mở. Nhưng mình không biết làm thế nào cho các bước trên.
Mong các anh chị giúp mình code với ạ.
 

File đính kèm

Upvote 0
Không có vài file kết quả mong muốn nên khó hình dung.

Chịu khó đọc hướng dẫn trên InputBox đã.
Ôi, mình ko hiểu nên làm sai, tuy nhiên khi mình chọn dòng cột A đúng như Input thì nó cho ra kết quả cũng như trường hợp file template 1. Tức nội dung sản phẩm không đúng như số lô hàng.
 
Upvote 0
Ôi, mình ko hiểu nên làm sai, tuy nhiên khi mình chọn dòng cột A đúng như Input thì nó cho ra kết quả cũng như trường hợp file template 1. Tức nội dung sản phẩm không đúng như số lô hàng.
Vì lý do này đó: "Không có vài file kết quả mong muốn nên khó hình dung".
 
Upvote 0
Mỗi lúc một kiểu thế này thì mọi người chạy hết mất thôi.
Mong bạn thông cảm, vì cách ban đầu nó khó lưu hàng loạt mà quay về file gốc để lưu ra nên mình nghĩ cách copy sheet để các anh chị có thể giúp mình được không.
Bài đã được tự động gộp:

Vì lý do này đó: "Không có vài file kết quả mong muốn nên khó hình dung".
Mình up 3 file kết quả, mình thử in dòng thứ tự cột A là 4,5,6 tức Táo, Việt Quất và Nho. Nhưng nó ra Dâu tây, nghĩa là nó chỉ lấy theo sản phẩm của lô số thứ tự 1 là STEG_6024_KR
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mong bạn thông cảm, vì cách ban đầu nó khó lưu hàng loạt mà quay về file gốc để lưu ra nên mình nghĩ cách copy sheet để các anh chị có thể giúp mình được không.
Bài đã được tự động gộp:


Mình up 3 file kết quả, mình thử in dòng thứ tự cột A là 4,5,6 tức Táo, Việt Quất và Nho. Nhưng nó ra Dâu tây, nghĩa là nó chỉ lấy theo sản phẩm của lô số thứ tự 1 là STEG_6024_KR
Đó là hậu quả của việc không đưa ví dụ kết quả mong muốn lên ngay từ bài đầu đó bạn.
 
Upvote 0
Mong bạn thông cảm vì mình không kinh nghiệm và giúp mình với nhé!
Trong cột J, sheet "In" file gốc của bạn không có công thức gì và duy nhất chỉ có hai dòng có dữ liệu khác không thì làm sao có thể nhảy sang số liệu khác được, mình đoán một số cột của sheet "in" file gốc của bạn thiếu công thức lấy dữ liệu từ sheet "DATA" nên mới bị như vậy, bạn kiểm tra lại xem thế nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong cột J, sheet "In" file gốc của bạn không có công thức gì và duy nhất chỉ có hai dòng có dữ liệu khác không thì làm sao có thể nhảy sang số lệu khác được, mình đoán một sô cột của sheet "in" file gốc của bạn thiếu công thức lấy dữ liệu từ sheet "DATA" nên mới bị như vậy, bạn kiểm tra lại xem thế nào.
Cột J sheet In có công thức lấy dữ liệu từ 1 file data khác:
IFERROR(XLOOKUP($A7&"-"&$D$3,'[2023_TRACKTO FOOD IMPORT__UPDATE.xlsx]FRESH FRUITS'!$BJ:$BJ,'[2023_TRACKTO FOOD IMPORT__UPDATE.xlsx]FRESH FRUITS'!$AE:$AE),0)
1714965116367.png
Nó tham chiếu theo ô D3 và cột A.
mà D3 sheet In thì phụ thuộc vào H1 sheet In, H1 chính là số thứ tự bên sheet Lot.
Khi H1 thay đổi thì D3 thay đổi, mà D3 thay đổi thì các dòng khác 0 cột J bên dưới thay đổi theo (tức sản phẩm khác theo lô hàng tương ứng)
Cái data có chữ TRACKTO hơi lớn, không biết sao gởi cho bạn xem.
 
Upvote 0
Cột J sheet In có công thức lấy dữ liệu từ 1 file data khác:
IFERROR(XLOOKUP($A7&"-"&$D$3,'[2023_TRACKTO FOOD IMPORT__UPDATE.xlsx]FRESH FRUITS'!$BJ:$BJ,'[2023_TRACKTO FOOD IMPORT__UPDATE.xlsx]FRESH FRUITS'!$AE:$AE),0)
View attachment 300719
Nó tham chiếu theo ô D3 và cột A.
mà D3 sheet In thì phụ thuộc vào H1 sheet In, H1 chính là số thứ tự bên sheet Lot.
Khi H1 thay đổi thì D3 thay đổi, mà D3 thay đổi thì các dòng khác 0 cột J bên dưới thay đổi theo (tức sản phẩm khác theo lô hàng tương ứng)
Cái data có chữ TRACKTO hơi lớn, không biết sao gởi cho bạn xem.
Bạn thử kiểm tra lại, để có thể chọn các dòng rời rạc thì nhớ giữ phím Ctrl khi chọn các dòng cần lấy tại cột A.
 

File đính kèm

Upvote 0
Bạn thử kiểm tra lại, để có thể chọn các dòng rời rạc thì nhớ giữ phím Ctrl khi chọn các dòng cần lấy tại cột A.
Bạn Tuấn ơi, cho mình hỏi, vì sao mình so sánh với File Template 2 bạn gởi lần đầu thì thấy code không khác gì mà sao lúc đầu chạy chưa đúng, còn lần sau thì chạy OK nhỉ?
 
Upvote 0
Bạn Tuấn ơi, cho mình hỏi, vì sao mình so sánh với File Template 2 bạn gởi lần đầu thì thấy code không khác gì mà sao lúc đầu chạy chưa đúng, còn lần sau thì chạy OK nhỉ?
Vì file đầu không biết vì lý do gì mà cột J lại mất hết công thức, sau đó mình tải lại file có công thức ở cột J rồi đưa code vào là xong.
 
Upvote 0
À thì ra do cột J chứ không phải do code.
Như vậy là khi tải file về bạn không kiểm tra lại gì cả mà cứ thế chạy luôn, khi thấy sai kết quả mong muốn cũng không kiểm tra lại mà cứ hô lên là sai thôi. Lần sau thì đầu tiên bạn nên kiểm tra file gốc xem có bị thay đổi gì không đã, sau đó mới đến các thứ khác. Làm công việc phải dùng Excel và vào diễn đàn từ 2016 rồi mà vẫn vậy thì hơi bị chán.
 
Upvote 0
Như vậy là khi tải file về bạn không kiểm tra lại gì cả mà cứ thế chạy luôn, khi thấy sai kết quả mong muốn cũng không kiểm tra lại mà cứ hô lên là sai thôi. Lần sau thì đầu tiên bạn nên kiểm tra file gốc xem có bị thay đổi gì không đã, sau đó mới đến các thứ khác. Làm công việc phải dùng Excel và vào diễn đàn từ 2016 rồi mà vẫn vậy thì hơi bị chán.
Cảm ơn bạn góp ý! Mình cứ đinh ninh là file gốc không bị đổi. Mình sẽ chú ý!

Cho mình hỏi thêm chút, nếu muốn các file save as ra value giá trị (không còn công thức) thì mình thêm câu lệnh như thế nào nhỉ?
 
Upvote 0
Cảm ơn bạn góp ý! Mình cứ đinh ninh là file gốc không bị đổi. Mình sẽ chú ý!

Cho mình hỏi thêm chút, nếu muốn các file save as ra value giá trị (không còn công thức) thì mình thêm câu lệnh như thế nào nhỉ?
Cái này trên diễn đàn có nhiều mà, hoặc tìm kiếm trên Google thì bạt ngàn, tự tìm kiếm và thử đi thử lại sẽ nhớ lâu hơn là người khác viết hộ từ A đến Z.
 
Upvote 0
Cái này trên diễn đàn có nhiều mà, hoặc tìm kiếm trên Google thì bạt ngàn, tự tìm kiếm và thử đi thử lại sẽ nhớ lâu hơn là người khác viết hộ từ A đến Z.
Mình làm được rồi.
Trước close, mình thêm sn.UsedRange.Value=sn.UsedRange.Value
Cảm ơn bạn giúp mình nhiều lắm!
 
Upvote 0
Cái này trên diễn đàn có nhiều mà, hoặc tìm kiếm trên Google thì bạt ngàn, tự tìm kiếm và thử đi thử lại sẽ nhớ lâu hơn là người khác viết hộ từ A đến Z.
Bạn ơi, cho mình hỏi thêm về Code hôm trước, nếu Vùng Range này cập nhật thêm, không dừng lại ở dòng 105 thì mình sửa code sao cho nó tự động lấy đến cuối cùng, mỗi khi mình có thêm dòng nhỉ?
With sn.Range("A7:K105")
.AutoFilter Field:=10, Criteria1:="0"
.SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
 
Upvote 0
Bạn ơi, cho mình hỏi thêm về Code hôm trước, nếu Vùng Range này cập nhật thêm, không dừng lại ở dòng 105 thì mình sửa code sao cho nó tự động lấy đến cuối cùng, mỗi khi mình có thêm dòng nhỉ?
With sn.Range("A7:K105")
.AutoFilter Field:=10, Criteria1:="0"
.SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
Bạn tìm hiểu code tìm dòng cuối trong vba Excel. Món này còn đơn giản hơn cả món trước bạn đã tìm.
 
Upvote 0
Bạn ơi, cho mình hỏi thêm về Code hôm trước, nếu Vùng Range này cập nhật thêm, không dừng lại ở dòng 105 thì mình sửa code sao cho nó tự động lấy đến cuối cùng, mỗi khi mình có thêm dòng nhỉ?
With sn.Range("A7:K105")
.AutoFilter Field:=10, Criteria1:="0"
.SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
Code lấy dòng cuối có dữ liệu sẽ có thể như sau:
Mã:
Dim iRow As Long
iRow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row
Trong code của bạn có thể bổ sung như sau:
Mã:
Dim iRow as Long
iRow = sn.Cells(Rows.Count, "A").End(xlUp).Row

With sn.Range("A7:A" & iRow)
    .AutoFilter Field:=10, Criteria1:="0"
    .SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
 
Upvote 0
Code lấy dòng cuối có dữ liệu sẽ có thể như sau:
Mã:
Dim iRow As Long
iRow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row
Trong code của bạn có thể bổ sung như sau:
Mã:
Dim iRow as Long
iRow = sn.Cells(Rows.Count, "A").End(xlUp).Row

With sn.Range("A7:A" & iRow)
    .AutoFilter Field:=10, Criteria1:="0"
    .SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
Mình cảm ơn bạn rất nhiều!
 
Upvote 0
Code lấy dòng cuối có dữ liệu sẽ có thể như sau:
Mã:
Dim iRow As Long
iRow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row
Trong code của bạn có thể bổ sung như sau:
Mã:
Dim iRow as Long
iRow = sn.Cells(Rows.Count, "A").End(xlUp).Row

With sn.Range("A7:A" & iRow)
    .AutoFilter Field:=10, Criteria1:="0"
    .SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
Mà bạn ơi, sao mình thử nó chạy sai. Save ra được file, nhưng không đúng yêu cầu. Bạn xem giúp mình câu lệnh đó ở vị trí nào với.
 

File đính kèm

Upvote 0
Ở đây là muốn để tự tìm hiểu, nắm được bản chất và nhớ lâu hơn, chứ cơm bón tận miệng thế này thì lần sau ai muốn tìm gạo để tự nấu.
Bạn ơi, mình cảm ơn những lời khuyên của bạn!
Nhưng mình cũng mới tìm hiểu VBA nên còn mù mờ lắm
Mong bạn thông cảm!
Ngay cả khi dùng như cũ, mình có thêm 1 số dòng sheet In từ 106 tới 119, và sửa code thành
With sn.Range("A7:L119")
.AutoFilter Field:=11, Criteria1:="0"
.SpecialCells(xlCellTypeVisible, 12).EntireRow.Delete
End With
nó vẫn chạy không đúng.
Bạn xem giúp mình lý do với!
 

File đính kèm

Upvote 0
Cảm ơn các bạn! Mình tìm hiểu và biết vì sao rồi.
Mình sửa công thức, chạy OK.
 
Upvote 0
Nghe câu này thấy có vẻ không ổn, trong code này có công thức nào đâu mà sửa nhỉ.
Mình sửa công thức Subtotal cột L sheet In bên ngoài file, do mình ghi chưa rõ.
Mà bạn ơi, có công thức nào tổng quát chỗ công thức subtotal này khi mình chèn dòng, nó vẫn sum đến dòng cuối không, nãy quên sửa nó sai á.
 
Upvote 0
Mình sửa công thức Subtotal cột L sheet In bên ngoài file, do mình ghi chưa rõ.
Mà bạn ơi, có công thức nào tổng quát chỗ công thức subtotal này khi mình chèn dòng, nó vẫn sum đến dòng cuối không, nãy quên sửa nó sai á.
Cụ thể là file nào, sheet nào, cột nào, trường hợp nào và muốn như thế nào vậy.
 
Upvote 0
Phải code mới được hả bạn? mình muốn là 1 công thức có được ko?
Với lại nếu 2 code trong cùng 1 file thì co sao ko?
Muốn là một công thức cũng được, hai code trong cùng một file cũng được. Nhưng thông cảm nhé, do bạn viết tắt nên mình dừng hỗ trợ tại đây.
 
Upvote 0

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

Back
Top Bottom