Nhờ hướng dẫn tạo macro in hàng loạt phiếu xuất hàng

Quảng cáo

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
Mình tìm được file này trên mạng. Công việc của mình cần in 1 lần nhiều phiếu xuất hàng nên ko tiện ngồi chọn từng phiếu rồi bấm lệnh in được. Nhờ mọi người giúp mình cách tạo macro để có thể in tự động hàng loạt phiếu theo danh sách đã chọn. Ví dụ mình muốn in từ phiếu 1 - 20 hoặc bất cứ số phiếu nào cũng được. Hoặc là tự động in toàn bộ phiếu từ 1 đến hết cũng được.
Ngoài ra để tiết kiệm mình muốn chỉnh trang in này thành 2 phiếu để in gọn 2 phiếu trong 1 trang a4 thì ngoài cách copy xuống 1 phiếu bên dưới thì mọi người có cách nào hay hơn thì chỉ mình mới.
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
10,981
Được thích
13,053
Điểm
5,168
1/ File bạn đính kèm có 2 macro: Một để in phiếu bán hàng sau khi nhập nội dung trực tiếp vào Form phiếu bán hàng.
Một macro để ghi dữ liệu đã nhập từ Form phiếu bán hàng sang bảng "LỊCH SỬ BÁN HÀNG" ở sheet "Chi tiet PBH".
2/ Công việc của bạn cần:
In phiếu xuất hàng (01 hoặc nhiều phiếu cùng lúc) dựa trên một cơ sở dữ liệu đã có (danh sách các phiếu).
3/ Việc viết macro cho yêu cầu của bạn thì phải cần file cụ thể, form cụ thể (File dữ liệu thật của bạn).
Ngoài ra, yêu cầu in 2 phiếu/ trang A4 thì đơn giản nhất là bạn tạo 2 Form phiếu xuất hàng trên 1 trang A4 là được.
Vậy nên, trước hết bạn gửi file của bạn lên để mọi người xem giúp bạn. Còn file bạn đã đính kèm ở bài #1 thì để tham khảo.
 

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
1/ File bạn đính kèm có 2 macro: Một để in phiếu bán hàng sau khi nhập nội dung trực tiếp vào Form phiếu bán hàng.
Một macro để ghi dữ liệu đã nhập từ Form phiếu bán hàng sang bảng "LỊCH SỬ BÁN HÀNG" ở sheet "Chi tiet PBH".
2/ Công việc của bạn cần:
In phiếu xuất hàng (01 hoặc nhiều phiếu cùng lúc) dựa trên một cơ sở dữ liệu đã có (danh sách các phiếu).
3/ Việc viết macro cho yêu cầu của bạn thì phải cần file cụ thể, form cụ thể (File dữ liệu thật của bạn).
Ngoài ra, yêu cầu in 2 phiếu/ trang A4 thì đơn giản nhất là bạn tạo 2 Form phiếu xuất hàng trên 1 trang A4 là được.
Vậy nên, trước hết bạn gửi file của bạn lên để mọi người xem giúp bạn. Còn file bạn đã đính kèm ở bài #1 thì để tham khảo.
Đây là file của mình, bạn giúp mình nhé. Ban đầu mình úp file kia lên vì muốn nhờ hướng dẫn cách tạo macro, sau đó mình học theo đó tự làm macro, nếu sau này có cần thay đổi gì thì mình tự làm cũng được, vì mình ko rành về macro cho lắm nên muốn học. Nhờ bạn giúp đỡ. Ko biết sao mình ko úp file lên đc nữa. Mình sgare link bạn xem giúp mình nha
https://drive.google.com/file/d/0B0L1He2tzg9LMjJVRGNBUTlyUHM/view?usp=drivesdk
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
10,981
Được thích
13,053
Điểm
5,168
Đây là file của mình, bạn giúp mình nhé. Ban đầu mình úp file kia lên vì muốn nhờ hướng dẫn cách tạo macro, sau đó mình học theo đó tự làm macro, nếu sau này có cần thay đổi gì thì mình tự làm cũng được, vì mình ko rành về macro cho lắm nên muốn học. Nhờ bạn giúp đỡ. Ko biết sao mình ko úp file lên đc nữa. Mình sgare link bạn xem giúp mình nha
https://drive.google.com/file/d/0B0L1He2tzg9LMjJVRGNBUTlyUHM/view?usp=drivesdk
Tại [K5] và [K6] của sheet "in PN" bạn nhập số phiếu cầu in (tương ứng với STT cột C của sheet "PNK")
Xem hình:
printt.jpg

Và thử đoạn sau:
PHP:
Sub InPNK()
Dim i As Long, p1, p2
p1 = Sheet2.Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2
    'Sheet2.Range("B4").Value = i 'Không rõ tai cell [B4] lam gì?
    Sheet2.Range("J2").Value = i
    'Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1
Next
End Sub
p/s: Tôi thấy bạn sử dụng rất nhiều name (chắc có những cái không cần thiết) làm bảng tính chậm hơn và tăng dung lượng.
 

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
Tại [K5] và [K6] của sheet "in PN" bạn nhập số phiếu cầu in (tương ứng với STT cột C của sheet "PNK")
Xem hình:
View attachment 165884

Và thử đoạn sau:
PHP:
Sub InPNK()
Dim i As Long, p1, p2
p1 = Sheet2.Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2
    'Sheet2.Range("B4").Value = i 'Không rõ tai cell [B4] lam gì?
    Sheet2.Range("J2").Value = i
    'Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1
Next
End Sub
p/s: Tôi thấy bạn sử dụng rất nhiều name (chắc có những cái không cần thiết) làm bảng tính chậm hơn và tăng dung lượng.
Bạn ơi mình ko rành về macro lắm, chỉ mới làm thử lần đầu, mình chạy thử trên file mẫu mình gửi lên thì ok, nhưng khi áp dụng trên file gốc của mình thì ko được. Bạn cho minh hỏi, nếu bây giờ file mình có nhiều sheet thì đoạn code trên mình sẽ thay đổi như thế nào? Giả sử như mình muốn dùng đoạn code này để in phiếu xuất kho (nằm trên 1 sheet khác thì mình phải sửa chỗ nào hả bạn? mình thử đổi sheet2 trong đoạn code trên thành sheet7 thì ko được (sheet mình cần in nằm ở vị trí thứ 7). Đồng thời mình vừa chỉnh lại file thành 2 phiếu nhập kho trên 1 trang, nhưng nó chỉ chạy được phiếu đầu tiên, còn phiếu sau nó ra y chang như phiếu 1, nhờ bạn giúp mình chỉnh công thức lại được ko? Ko hẳn là mình ko muốn up file lên mà mình muốn hiểu đoạn code để vận dụng vào những trường hợp khác nhau. Bạn giúp mình nhé. Cảm ơn bạn nhiều.
https://drive.google.com/file/d/0B0L1He2tzg9LQjZ4ZS00YjUwYjg/view?usp=drivesdk
 

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
Tại [K5] và [K6] của sheet "in PN" bạn nhập số phiếu cầu in (tương ứng với STT cột C của sheet "PNK")
Xem hình:
View attachment 165884

Và thử đoạn sau:
PHP:
Sub InPNK()
Dim i As Long, p1, p2
p1 = Sheet2.Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2
    'Sheet2.Range("B4").Value = i 'Không rõ tai cell [B4] lam gì?
    Sheet2.Range("J2").Value = i
    'Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1
Next
End Sub
p/s: Tôi thấy bạn sử dụng rất nhiều name (chắc có những cái không cần thiết) làm bảng tính chậm hơn và tăng dung lượng.
Bạn ơi mình ko rành về macro lắm, chỉ mới làm thử lần đầu, mình chạy thử trên file mẫu mình gửi lên thì ok, nhưng khi áp dụng trên file gốc của mình thì ko được. Bạn cho minh hỏi, nếu bây giờ file mình có nhiều sheet thì đoạn code trên mình sẽ thay đổi như thế nào? Giả sử như mình muốn dùng đoạn code này để in phiếu xuất kho (nằm trên 1 sheet khác thì mình phải sửa chỗ nào hả bạn? mình thử đổi sheet2 trong đoạn code trên thành sheet7 thì ko được (sheet mình cần in nằm ở vị trí thứ 7). Đồng thời mình vừa chỉnh lại file thành 2 phiếu nhập kho trên 1 trang, nhưng nó chỉ chạy được phiếu đầu tiên, còn phiếu sau nó ra y chang như phiếu 1, nhờ bạn giúp mình chỉnh công thức lại được ko? Ko hẳn là mình ko muốn up file lên mà mình muốn hiểu đoạn code để vận dụng vào những trường hợp khác nhau. Bạn giúp mình nhé. Cảm ơn bạn nhiều.
https://drive.google.com/file/d/0B0L1He2tzg9LQjZ4ZS00YjUwYjg/view?usp=drivesdk
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
10,981
Được thích
13,053
Điểm
5,168
@kimusd:
Bạn xem file đính kèm nhé.
PHP:
Sub InPNK()
Dim i As Long, p1, p2
'Sheet2 là name cua worksheet trong vba, còn "in PN" là tên cua sheet nhìn thây trên tab sheet.
'MsgBox Sheet2.Name 'Tra vê "in PN"
'02 cách viêt: Sheet2 = sheets("in PN")
p1 = Sheet2.Range("K5").Value
'Hoac viêt là:
'p1 = Sheets("in PN").Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2 Step 2 'Step = 2 vì in 02 phiêu, [B58]=[B4]+1
    Sheet2.Range("B4").Value = i 'Truyên STT vao [B4]
    Sheet2.PrintPreview 'To preview
'    Sheet2.PrintOut From:=1, To:=1
Next
End Sub

sheet2.jpg

p/s: Bạn chú ý mục số 3 tôi viết ở bài #2.
Tôi sắp hết dung lượng cho phép đính kèm file rồi. Ưu tiên lắm mới up file lại cho bạn đó.
 

File đính kèm

  • file mau-0.xls
    157 KB · Đọc: 179

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
@kimusd:
Bạn xem file đính kèm nhé.
PHP:
Sub InPNK()
Dim i As Long, p1, p2
'Sheet2 là name cua worksheet trong vba, còn "in PN" là tên cua sheet nhìn thây trên tab sheet.
'MsgBox Sheet2.Name 'Tra vê "in PN"
'02 cách viêt: Sheet2 = sheets("in PN")
p1 = Sheet2.Range("K5").Value
'Hoac viêt là:
'p1 = Sheets("in PN").Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2 Step 2 'Step = 2 vì in 02 phiêu, [B58]=[B4]+1
    Sheet2.Range("B4").Value = i 'Truyên STT vao [B4]
    Sheet2.PrintPreview 'To preview
'    Sheet2.PrintOut From:=1, To:=1
Next
End Sub

View attachment 166015

p/s: Bạn chú ý mục số 3 tôi viết ở bài #2.
Tôi sắp hết dung lượng cho phép đính kèm file rồi. Ưu tiên lắm mới up file lại cho bạn đó.
Tôi sắp hết dung lượng cho phép đính kèm file rồi. Ưu tiên lắm mới up file lại cho bạn đó.[/QUOTE]
Yeah, mình sửa tên sheet trong macro vào file của mình chạy được ngon lành luôn rồi bạn ơi. Vui quá. Cảm ơn bạn nhiều lắm lắm nha
 

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
@kimusd:
Bạn xem file đính kèm nhé.
PHP:
Sub InPNK()
Dim i As Long, p1, p2
'Sheet2 là name cua worksheet trong vba, còn "in PN" là tên cua sheet nhìn thây trên tab sheet.
'MsgBox Sheet2.Name 'Tra vê "in PN"
'02 cách viêt: Sheet2 = sheets("in PN")
p1 = Sheet2.Range("K5").Value
'Hoac viêt là:
'p1 = Sheets("in PN").Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2 Step 2 'Step = 2 vì in 02 phiêu, [B58]=[B4]+1
    Sheet2.Range("B4").Value = i 'Truyên STT vao [B4]
    Sheet2.PrintPreview 'To preview
'    Sheet2.PrintOut From:=1, To:=1
Next
End Sub

View attachment 166015

p/s: Bạn chú ý mục số 3 tôi viết ở bài #2.
Tôi sắp hết dung lượng cho phép đính kèm file rồi. Ưu tiên lắm mới up file lại cho bạn đó.
Bạn ơi, nhờ bạn giúp mình thêm 1 cái nữa là bỏ luôn bước print preview mà in luôn được ko bạn, hiện giờ khi bấm vào nút in thì nó hiện ra cửa số print preview, bấm vào print thì ra tiếp hộp thoại in OK tiếp nữa mới in được. Cứ thế 100 phiếu thì phải bấm chuột 200 lần thì mới xong, ko bỏ máy làm việc khác được. Bạn giúp mình thêm cái này nữa nha. Cảm ơn bạn nhiều lắm.
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
10,981
Được thích
13,053
Điểm
5,168
Bạn ơi, nhờ bạn giúp mình thêm 1 cái nữa là bỏ luôn bước print preview mà in luôn được ko bạn, hiện giờ khi bấm vào nút in thì nó hiện ra cửa số print preview, bấm vào print thì ra tiếp hộp thoại in OK tiếp nữa mới in được. Cứ thế 100 phiếu thì phải bấm chuột 200 lần thì mới xong, ko bỏ máy làm việc khác được. Bạn giúp mình thêm cái này nữa nha. Cảm ơn bạn nhiều lắm.
Bạn nên mua sách, tìm tài liệu để học, tích lũy một chút căn bản về cốt két...
Khi thêm dấu nháy ' trước dòng lệnh thì sẽ chuyển dòng lệnh đó thành dạng ghi chú (comment block).
Vậy, ở phía cuối có 2 dòng:
PHP:
    Sheet2.PrintPreview 'To preview
'    Sheet2.PrintOut From:=1, To:=1
Ta sửa lại như bên dưới:
PHP:
Sub InPNK()
Dim i As Long, p1, p2
'Sheet2 là name cua worksheet trong vba, còn "in PN" là tên cua sheet nhìn thây trên tab sheet.
'MsgBox Sheet2.Name 'Tra vê "in PN"
'02 cách viêt: Sheet2 = sheets("in PN")
p1 = Sheet2.Range("K5").Value
'Hoac viêt là:
'p1 = Sheets("in PN").Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2 Step 2 'Step = 2 vì in 02 phiêu, [B58]=[B4]+1
    Sheet2.Range("B4").Value = i 'Truyên STT vao [B4]
'    Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1
Next
End Sub
 

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
Bạn nên mua sách, tìm tài liệu để học, tích lũy một chút căn bản về cốt két...
Khi thêm dấu nháy ' trước dòng lệnh thì sẽ chuyển dòng lệnh đó thành dạng ghi chú (comment block).
Vậy, ở phía cuối có 2 dòng:
PHP:
    Sheet2.PrintPreview 'To preview
'    Sheet2.PrintOut From:=1, To:=1
Ta sửa lại như bên dưới:
PHP:
Sub InPNK()
Dim i As Long, p1, p2
'Sheet2 là name cua worksheet trong vba, còn "in PN" là tên cua sheet nhìn thây trên tab sheet.
'MsgBox Sheet2.Name 'Tra vê "in PN"
'02 cách viêt: Sheet2 = sheets("in PN")
p1 = Sheet2.Range("K5").Value
'Hoac viêt là:
'p1 = Sheets("in PN").Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2 Step 2 'Step = 2 vì in 02 phiêu, [B58]=[B4]+1
    Sheet2.Range("B4").Value = i 'Truyên STT vao [B4]
'    Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1
Next
End Sub
Cảm ơn bạn nhiều lắm luôn. Mình làm được rồi. Giờ mình bấm in là là làm việc khác ngon lành chẳng phải ngồi bấm từng phiếu nữa. Mấy cái macro làm mình thấy chuyên nghiệp hẳn lên. Cảm ơn bạn nhiều nha
 

kimusd

Thành viên mới
Tham gia ngày
5 Tháng tám 2012
Bài viết
37
Được thích
2
Điểm
0
Tại [K5] và [K6] của sheet "in PN" bạn nhập số phiếu cầu in (tương ứng với STT cột C của sheet "PNK")
Xem hình:
View attachment 165884

Và thử đoạn sau:
PHP:
Sub InPNK()
Dim i As Long, p1, p2
p1 = Sheet2.Range("K5").Value
p2 = Sheet2.Range("K6").Value
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
For i = p1 To p2
    'Sheet2.Range("B4").Value = i 'Không rõ tai cell [B4] lam gì?
    Sheet2.Range("J2").Value = i
    'Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1
Next
End Sub
p/s: Tôi thấy bạn sử dụng rất nhiều name (chắc có những cái không cần thiết) làm bảng tính chậm hơn và tăng dung lượng.

Bạn ơi, thật ngại quá lại lên đây phiền bạn lần nữa. nếu muốn in thành 2 bản (hoặc có thể tùy chọn số lượng bản cần in) thì thêm đoạn code như nào hả bạn. Bạn giúp mình thêm lần này nữa nha.
 

nttcntn

Thành viên chính thức
Tham gia ngày
21 Tháng một 2010
Bài viết
85
Được thích
28
Điểm
0
Nếu in 2 bản bạn thay đoạn code này
Mã:
Sheet2.PrintOut From:=1, To:=1
thành
Mã:
Sheet2.PrintOut From:=1, To:=1, Copies:=2

Còn muốn nhập số trang in thì bạn phải nhập qua inputbox thông qua 1 biến là ok thôi
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
10,981
Được thích
13,053
Điểm
5,168
Bạn ơi, thật ngại quá lại lên đây phiền bạn lần nữa. nếu muốn in thành 2 bản (hoặc có thể tùy chọn số lượng bản cần in) thì thêm đoạn code như nào hả bạn. Bạn giúp mình thêm lần này nữa nha.
Bạn hỏi thì cứ hỏi thôi. Không có gì ái ngại.
Bạn thử đoạn dưới nhé.
Mã:
Sub InPNK()
Dim i As Long, p1, p2, cp
p1 = Sheet2.Range("K5").Value
p2 = Sheet2.Range("K6").Value
cp = Sheet2.Range("K7").Value 'Nhập số bản cần in vào cell [K7] của sheets "in PN"
If IsNumeric(p1) = False Or IsNumeric(p2) = False Then Exit Sub
If p1 > p2 Then Exit Sub
If cp = "" Or IsNumeric(cp) = False Then cp = 1
For i = p1 To p2 Step 2
    Sheet2.Range("B4").Value = i
'    Sheet2.PrintPreview 'To preview
    Sheet2.PrintOut From:=1, To:=1, Copies:=cp
Next
End Sub
 

lamlan91

Thành viên mới
Tham gia ngày
4 Tháng mười một 2020
Bài viết
2
Được thích
0
Điểm
0
Tuổi
29
các cao thủ giúp mình với, như bạn trên cần in phiếu nhập kho hàng loạt đỡ phải chọn, mình cũng muốn in hàng loạt, cũng thử học áp dụng macro trên youtube để áp dụng cho file của mình nhưng k thành công, vì vậy nhờ các bạn giúp mình tao macro cho file như đính kèm với ạ????
mình cảm ơn nhiều
 

File đính kèm

  • grn VOUCHER.xlsx
    1.5 MB · Đọc: 1

lamlan91

Thành viên mới
Tham gia ngày
4 Tháng mười một 2020
Bài viết
2
Được thích
0
Điểm
0
Tuổi
29
Hi các cao thủ, mình gửi lại file sau khi mình đã sửa nhưng vẫn không thể tự tạo macro khi dựa vào file của bạn trên hướng dẫn, vì vậy mong các bạn giúp em nhé
 

File đính kèm

  • GRN voucher update.xlsx
    1.5 MB · Đọc: 5
Quảng cáo
Top Bottom