Code "In Nhanh" Nhưng Chẳng Nhanh Chút nào

  • Thread starter Thread starter ALOAN
  • Ngày gửi Ngày gửi
Liên hệ QC

ALOAN

Thành viên chính thức
Tham gia
6/11/07
Bài viết
88
Được thích
29
Nghề nghiệp
PURCHASING
Em có code để " In Nhanh" như sau:
Mã:
 Sub InNhanh()
Mã:
[FONT=Times New Roman]Dim i As Integer, iL As Integer, RgnCp As Range, Rgn As Range, Inra[/FONT]
[FONT=Times New Roman]Inra = MsgBox("Nhan Yes de in, Nhan No de xem qua, Nhan Cancel de huy lenh", vbYesNoCancel)[/FONT]
[FONT=Times New Roman]If Inra = vbCancel Then Exit Sub[/FONT]
[FONT=Times New Roman]Application.ScreenUpdating = False[/FONT]
[FONT=Times New Roman]Sheet2.Select[/FONT]
[FONT=Times New Roman]Range("P2").ClearContents[/FONT]
[FONT=Times New Roman]iL = Range("B2").End(xlDown).Row[/FONT]
[FONT=Times New Roman]Set RgnCp = Range("A2:O" & iL)[/FONT]
[FONT=Times New Roman]Set Rgn = Range("N3:N" & iL)[/FONT]
[FONT=Times New Roman]Range("RgnDk").EntireColumn.Hidden = True[/FONT]
[FONT=Times New Roman]For i = 1 To iL - 2[/FONT]
[FONT=Times New Roman]If Rgn(i) <> Range("P2") Then[/FONT]
[FONT=Times New Roman]Range("P2") = Rgn(i)[/FONT]
[FONT=Times New Roman]If Inra = vbYes Then[/FONT]
[FONT=Times New Roman]RgnCp.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("RgnDk"), Unique:=False[/FONT]
[FONT=Times New Roman]ActiveSheet.PrintOut[/FONT]
[FONT=Times New Roman]Else[/FONT]
[FONT=Times New Roman]RgnCp.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("RgnDk"), Unique:=False[/FONT]
[FONT=Times New Roman]ActiveWindow.SelectedSheets.PrintPreview[/FONT]
[FONT=Times New Roman]End If[/FONT]
[FONT=Times New Roman]End If[/FONT]
[FONT=Times New Roman]Next i[/FONT]
[FONT=Times New Roman]ActiveSheet.ShowAllData[/FONT]
[FONT=Times New Roman]Application.ScreenUpdating = True[/FONT]
[FONT=Times New Roman]End Sub[/FONT]
Nhưng lại chẳng nhanh hơn chút nào cả.
Mọi người giúp em chỉnh code trên với.
 

File đính kèm

Em có code để " In Nhanh" như sau:

Nhưng lại chẳng nhanh hơn chút nào cả.
Mọi người giúp em chỉnh code trên với.
Thuật tóan AdFi là tối ưu rồi, chắc không nhanh hơn nữa. Do thời gian chuyển sang máy in -> in hơi chậm (do máy in).
 
Upvote 0
Em có code để " In Nhanh" như sau:

Nhưng lại chẳng nhanh hơn chút nào cả.

Mọi người giúp em chỉnh code trên với.

Vấn đề NHANH ở đây là gì?

là nhanh k phải chọn trang / vùng in?
hay
là nhanh tốc độ in?

nhanh tốc độ in thì chắc không rùi, vậy thì ALOAN nên nói rõ nhé, tks
.
 
Upvote 0
Vấn đề NHANH ở đây là gì?

là nhanh k phải chọn trang / vùng in?
hay
là nhanh tốc độ in?

nhanh tốc độ in thì chắc không rùi, vậy thì ALOAN nên nói rõ nhé, tks
.
Ý em muốn đề cập ở đây là tốc độ in quá chậm ạ. Mỗi lần ra lệnh in xong mà...số cả ruột. Em nghĩ có thể do câu lệnh mình viết có vần đề nên mới chậm vậy.
Em post lên mong muốn các cao thủ chỉ giúp em cách khác phục.
 
Upvote 0
Ý em muốn đề cập ở đây là tốc độ in quá chậm ạ. Mỗi lần ra lệnh in xong mà...số cả ruột. Em nghĩ có thể do câu lệnh mình viết có vần đề nên mới chậm vậy.
Em post lên mong muốn các cao thủ chỉ giúp em cách khác phục.

Thế thử in bằng tay (manual) hi iiiiiiiii xem có nhanh hơn k
nếu chậm lun thì -> tại việc chuyển ra máy in - nếu k tại CODE (nếu thế thì post file lên chứ code k khó nhìn lém vì nó phải gắn với DL)
.
 
Upvote 0
Em có gởi file lên rồi mà. Anh Hổ con xem lại dùm em phần #1 nha!
 
Upvote 0
Em có gởi file lên rồi mà. Anh Hổ con xem lại dùm em phần #1 nha!

uh, k để ý file kèm hix

nhưng thấy in bình thường đó chứ, vẫn rất nhanh, tuy máy mình k có máy in - hay dữ liệu của bạn nhìu hơn nữa

Nhưng CHẬM ở đoạn nào nhỉ???, tức là chương trình chạy xong 1 lúc thì máy in vấn chưa in (hoặc rất chậm )

Tôi đoán là do quá trình chuyển qua mấy in thôi bạn ah - khi máy in nhận lệnh nếu là 10 trang trên 1 lần in thì nhanh hơn rất nhiều là 10 trang in thành 10 lần (dù liên tục) phải chăng thế, ===> nếu thế thì hướng giải quyết là copy DL ra 1 sheet tạm (temp) khác rồi sort theo trường CMOD (N3:N...) (mà hình như Dữ liệu được sort rùi thì phải) -> rùi phân dàn trang theo trường này -> xong in 1 loạt cả sheet lun == đó chỉ là ý tưởng (tuy nhiên khi đó số tt trang sẽ lần lượt từ 1 đến hết)

thế nhé ALOAN cho ý kiến nhé
 
Upvote 0
nhưng thấy in bình thường đó chứ, vẫn rất nhanh, tuy máy mình k có máy in - hay dữ liệu của bạn nhìu hơn nữa

Nhưng CHẬM ở đoạn nào nhỉ???, tức là chương trình chạy xong 1 lúc thì máy in vấn chưa in (hoặc rất chậm )
Dữ liệu này em trích lọc từ 1 Bảng khác, dung lượng c[FONT=MS P明朝]ũ[/FONT]ng chỉ vậy thôi, và đã sort theo CMOD rồi.
Em thấy lệnh in chậm, không đều nhau. Khi ra lệnh 1 lúc sau mới thấy in ra.
hướng giải quyết là copy DL ra 1 sheet tạm (temp) khác rồi sort theo trường CMOD (N3:N...) (mà hình như Dữ liệu được sort rùi thì phải) -> rùi phân dàn trang theo trường này -> xong in 1 loạt cả sheet lun == đó chỉ là ý tưởng (tuy nhiên khi đó số tt trang sẽ lần lượt từ 1 đến hết)
Ý tưởng này rất hay. Mình copy và dàn trang hết tất cả ra 1 sheet temp sau đó ra lệnh in thì chắc nhanh hơn nhiều.
Ngày nào em c[FONT=MS P明朝]ũ[/FONT]ng ra lệnh in như vậy. Nhưng chờ đợi in lâu quá. Anh giúp em viết code cho ý tưởng này nha.
Cảm ơn anh nhiều. Chúc mọi người 1 ngày vui vẻ
 
Upvote 0
Dữ liệu này em trích lọc từ 1 Bảng khác, dung lượng c[FONT=MS P明朝]ũ[/FONT]ng chỉ vậy thôi, và đã sort theo CMOD rồi.
Em thấy lệnh in chậm, không đều nhau. Khi ra lệnh 1 lúc sau mới thấy in ra.

Ý tưởng này rất hay. Mình copy và dàn trang hết tất cả ra 1 sheet temp sau đó ra lệnh in thì chắc nhanh hơn nhiều.
Ngày nào em c[FONT=MS P明朝]ũ[/FONT]ng ra lệnh in như vậy. Nhưng chờ đợi in lâu quá. Anh giúp em viết code cho ý tưởng này nha.
Cảm ơn anh nhiều. Chúc mọi người 1 ngày vui vẻ

Oh, Giải pháp đây rùi,

NGhĩ lại, thấy k cần sheet tam, chỉ cần chèn PageBreak ở mỗi vị trí khác nhau của CMOD

chú ý: trong file đã bổ sung việc in lặp 3 dòng đầu 1:3 (File \ Page setup ... \ Sheet -> mục Rows to repeat at top) - nếu k thích ALOAN có thể bỏ cái này đi = cách xóa trong mục chọn đó

Cuối cùng để in -> bấm Ctrl+e để chạy sub InNhanh

Sau khi thực hiện sẽ có thấy phân cách pagebreak -> lần sau chỉ cần bấm lệnh in bình thường là được (dĩ nhiên là DL chưa thay đổi ở CMOD) TUY VẬY Nếu thích bỏ Pagebreak sau khi chạy InNhanh thì thêm neu thich bo PageBreak thi thêm lệnh ActiveSheet.ResetAllPageBreaks gần cuối CT mà tigertiger đã đặt sẵn ở gần cuối của SUB thì dấu màu đỏ đó
'ActiveSheet.ResetAllPageBreaks ' neu thich bo PageBreak thi xoa dau NHAY TREN o dau dong nay nhe


và đây là CODE

PHP:
Option Explicit

Sub InNhanh()
'bam Ctrl+e phim tat de chay sub nay   _tigertiger
Dim i As Integer, iL As Integer, RgnCp As Range, Rgn As Range, Inra
Inra = MsgBox("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel)
If Inra = vbCancel Then Exit Sub
Application.ScreenUpdating = False
Sheet2.Select
ActiveSheet.ResetAllPageBreaks

iL = Range("B65536").End(xlUp).Row
Set Rgn = Range("N4:N" & iL)

For i = 1 To iL - 1
    Rgn(i + 1).Select
    If Rgn(i + 1) <> Rgn(i) Then ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
Next

If Inra = vbYes Then
    ActiveSheet.PrintOut
Else: ActiveSheet.PrintPreview: End If

'ActiveSheet.ResetAllPageBreaks  ' neu thich bo PageBreak thi xoa dau NHAY TREN o  dau dong nay nhe
Application.ScreenUpdating = True
End Sub
có in nhanh hơn k thử lun nhé, chờ kết quả thông báo (vì k có máy in để thử)
.
 
Lần chỉnh sửa cuối:
Upvote 0
Tuyệt lắm Anh "Hổ Con" à.
Lúc trước phải mất 3-4 phút cho mỗi lần In, nhưng dờ chỉ còn khoảng 30 giây thôi.
Nhanh hơn nhiều lắm ạ.
Hôm nay em đã bắt đầu áp dụng code này vào công việc của mình rồi!
 
Lần chỉnh sửa cuối:
Upvote 0
Tuyệt lắm Anh "Hổ Con" à.
Lúc trước phải mất 3-4 phút cho mỗi lần In, nhưng dờ chỉ còn khoảng 30 giây thôi.
Nhanh hơn nhiều lắm ạ.
Hôm nay em đã bắt đầu áp dụng code này vào công việc của mình rồi!

vì làm vội nên vẫn để cái dong thử, để nó nhanh hơn 1 chút bạn làm như sau
tại dòng 11 và 12 (có ghi chú ở dưới):
PHP:
11    Rgn(i + 1).Select
12    If Rgn(i + 1) <> Rgn(i) Then ActiveWindow.SelectedSheets.HPageBreaks.Add Before:= ActiveCell
xóa dòng 11, dòng 12 sửa thành (thay ActiveCell thành Rgn(i + 1))
PHP:
12    If Rgn(i + 1) <> Rgn(i) Then ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Rgn(i + 1)

Như thế thay vì từng i phải chọn Rgn(i+1) mà chỉ tại vị trí pagebreak mới xét



HOẶC copy toàn bộ InNhanh ở CODE dưới lại

PHP:
Sub InNhanh()
'bam Ctrl+e phim tat de chay sub nay   _tigertiger
Dim i As Integer, iL As Integer, RgnCp As Range, Rgn As Range, Inra
Inra = MsgBox("Nhan Yes de in,  Nhan No de xem qua,  Nhan Cancel de huy lenh", vbYesNoCancel)
If Inra = vbCancel Then Exit Sub
Application.ScreenUpdating = False
Sheet2.Select
ActiveSheet.ResetAllPageBreaks

iL = Range("B65536").End(xlUp).Row
Set Rgn = Range("N4:N" & iL)

For i = 1 To iL - 1
11    'Rgn(i + 1).Select
12    If Rgn(i + 1) <> Rgn(i) Then ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Rgn(i + 1) ' ActiveCell
Next

If Inra = vbYes Then
    ActiveSheet.PrintOut
Else: ActiveSheet.PrintPreview: End If

'ActiveSheet.ResetAllPageBreaks  ' neu thich bo PageBreak thi xoa dau NHAY TREN o dau dong nay nhe
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bắt bẻ bác tigertiger một chút. Không hiểu có nhanh hơn được chút nào không nếu cái vòng lặp của bác được viết lại như sau:
PHP:
For i = 2 To iL 
11   'Rgn(i + 1).Select'
12   If Rgn(i) <> Rgn(i - 1) Then ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Rgn(i)   
Next
--------
To tigertiger: Dạo này em thấy bác hay lên mạng ghê. Chắc là SV được nghỉ nên bác cũng được nghỉ theo. Không biết hè này có được gặp lại bác ở HN không?
 
Lần chỉnh sửa cuối:
Upvote 0
Bắt bẻ bác tigertiger một chút. Không hiểu có nhanh hơn được chút nào không nếu cái vòng lặp của bác được viết lại như sau:
PHP:
For i = 2 To iL 
11   'Rgn(i + 1).Select'
12   If Rgn(i) <> Rgn(i-1) Then ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Rgn(i)   
Next
--------

tốc độ Cũng giống nhau minlev ơi, vì cũng cùng số vòng lặp (iL-1) số lần (chắc là minhlev vui một chút nhỉ hi iiiiii)

To tigertiger: Dạo này em thấy bác hay lên mạng ghê. Chắc là SV được nghỉ nên bác cũng được nghỉ theo. Không biết hè này có được gặp lại bác ở HN không?

hix, đang rảnh một chút, tranh thủ ghé GPE, thấy GPE hồi này nhìu nhân tài wa ta. Giờ anh em mình thành mới tập tành rùi nhỉ - đến bác LVD còn thành newbie rùi
Chứng tỏ GPE rất phát triển - đáng mừng đáng mừng
Hè thường nghỉ ngắn ngày lém (2 tuần) và quan trọng Bác có đồng lòng k nữa mới hành quân ra đước
 
Upvote 0
Web KT

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

Back
Top Bottom