Liệu excel có chạy kịp!

Liên hệ QC

duyhuynh9922

Thành viên mới
Tham gia
25/10/21
Bài viết
16
Được thích
8
Xin chào các anh, chi. Hiện tại em có 1 thắc mắc là khi thực hiện đoạn code này với số lượng khoảng 3000 công nhân thì liệu excel có kịp load đúng dữ liệu cần in không ạ. Với mỗi ô tô màu vàng thì đều sử dụng hàm vLookup. Mong đc giải đáp!!!
Mã:
Public Sub PRINTING()
    Dim MAX, U, Y, A As Integer
    Dim SARR()
    Dim WSPR, WSDT As Worksheet
    Dim DA, DB, DC, DD, DE
    Application.ActivePrinter = "RICOH Aficio MP 4001 PCL 6 ON NE00:"
    Application.Calculation = xlCalculationAutomatic
    Set WSDT = ThisWorkbook.Sheets("DD")
    Set WSPR = ThisWorkbook.Sheets("FF")
    MAX = WSDT.Range("A" & Rows.Count).End(xlUp).Row
    SARR = WSDT.Range("A1:C" & MAX).Value

DC = MAX Mod 5

If DC = 0 Then
   
    For A = 1 To UBound(SARR)
       
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
             
       
     
       Next A

ElseIf DC = 1 Then
    For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 1 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            WSPR.Range("A5").Value = SARR(A, 1)
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$10"
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
     
      End If
       Next A

ElseIf DC = 2 Then
     For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 2 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$20"
            DB = DB + 1
            If DB = 1 Then
            WSPR.Range("A5").Value = SARR(A, 1)
            Else
            WSPR.Range("A15").Value = SARR(A, 1)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
      End If
       Next A

ElseIf DC = 3 Then
        For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 3 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$30"
            DB = DB + 1
            If DB = 1 Then
            WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf DB = 2 Then
            WSPR.Range("A15").Value = SARR(A, 1)
            Else
            WSPR.Range("A25").Value = SARR(A, 1)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
      End If
       Next A

ElseIf DC = 4 Then
       For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 4 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$40"
            DB = DB + 1
            If DB = 1 Then
            WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf DB = 2 Then
            WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf DB = 3 Then
            WSPR.Range("A25").Value = SARR(A, 1)
            Else
            WSPR.Range("A35").Value = SARR(A, 1)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
      End If
       Next A
Else
End If
End Sub
Untitled.jpg
 
Lần chỉnh sửa cuối:
Xin chào các anh, chi. Hiện tại em có 1 thắc mắc là khi thực hiện đoạn code này với số lượng khoảng 3000 công nhân thì liệu excel có kịp load đúng dữ liệu cần in không ạ. Với mỗi ô tô màu vàng thì đều sử dụng hàm vLookup. Mong đc giải đáp!!!
Mã:
Public Sub PRINTING()
    Dim MAX, U, Y, A As Integer
    Dim SARR()
    Dim WSPR, WSDT As Worksheet
    Dim DA, DB, DC, DD, DE
    Application.ActivePrinter = "RICOH Aficio MP 4001 PCL 6 ON NE00:"
    Application.Calculation = xlCalculationAutomatic
    Set WSDT = ThisWorkbook.Sheets("DD")
    Set WSPR = ThisWorkbook.Sheets("FF")
    MAX = WSDT.Range("A" & Rows.Count).End(xlUp).Row
    SARR = WSDT.Range("A1:C" & MAX).Value

DC = MAX Mod 5

If DC = 0 Then
  
    For A = 1 To UBound(SARR)
      
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
            
      
    
       Next A

ElseIf DC = 1 Then
    For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 1 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            WSPR.Range("A5").Value = SARR(A, 1)
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$10"
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
    
      End If
       Next A

ElseIf DC = 2 Then
     For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 2 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$20"
            DB = DB + 1
            If DB = 1 Then
            WSPR.Range("A5").Value = SARR(A, 1)
            Else
            WSPR.Range("A15").Value = SARR(A, 1)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
      End If
       Next A

ElseIf DC = 3 Then
        For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 3 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$30"
            DB = DB + 1
            If DB = 1 Then
            WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf DB = 2 Then
            WSPR.Range("A15").Value = SARR(A, 1)
            Else
            WSPR.Range("A25").Value = SARR(A, 1)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
      End If
       Next A

ElseIf DC = 4 Then
       For A = 1 To UBound(SARR)
        DA = DA + 1
            If DA <= MAX - 4 Then
            Y = Y + 1
            If Y = 1 Then
                WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf Y = 2 Then
                    WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf Y = 3 Then
                    WSPR.Range("A25").Value = SARR(A, 1)
            ElseIf Y = 4 Then
                    WSPR.Range("A35").Value = SARR(A, 1)
            ElseIf Y = 5 Then
                    WSPR.Range("A45").Value = SARR(A, 1)
                    Y = 0
                    ActiveSheet.PageSetup.PrintArea = "$A$1:$R$49"
                    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If

        Else
            ActiveSheet.PageSetup.PrintArea = "$A$1:$R$40"
            DB = DB + 1
            If DB = 1 Then
            WSPR.Range("A5").Value = SARR(A, 1)
            ElseIf DB = 2 Then
            WSPR.Range("A15").Value = SARR(A, 1)
            ElseIf DB = 3 Then
            WSPR.Range("A25").Value = SARR(A, 1)
            Else
            WSPR.Range("A35").Value = SARR(A, 1)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
                    IgnorePrintAreas:=False
            End If
      End If
       Next A
Else
End If
End Sub
Chắc không vấn đề gì đâu bạn.
 
Upvote 0
Sử dụng Elseif nhiều thì trình hơi non
 
Upvote 0
Tại sao phải "chắc"?
Có code thì cứ lập dữ liệu chạy thử. Bảo người ta lập dữ liệu giùm thì còn phya.

Tôi chỉ có nthắc mắc: 3000 tờ thì hỏi máy in chứ sao lại hỏi Excel?
Không đến 3000 tờ đâu anh. Vì 1 tờ A4 in đc 5 bảng. Khi test khoảng 100 < thì vẫn ok.
Bài đã được tự động gộp:

Sử dụng Elseif nhiều thì trình hơi non
Đoạn trên em dùng Record Macro, xong mới bổ xung thêm thành như vậy. Nếu không dùng Elseif thì mình có thể dùng cấu trúc nào khác mong anh hướng dẫn thêm. Mới tiếp xúc nên còn ngơ lắm!!!
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không dùng Elseif thì mình có thể dùng cấu trúc nào khác mong anh hướng dẫn thêm
Code dài dòng quá đọc không xuể, kèm không có file lại càng không biết cái dữ liệu nguồn thế nào, thôi trước mắt sửa khúc này đã:
  • Y=1 :A5, Y=2 : A15 ... , Y=5 :A45. Chỗ này có sự tương quan giữa Y và địa chỉ dòng (10Y-5 = dòng) thì nên cắt bớt if else.
  • Khúc Mod rồi if else cho điều kiện của DC kia cũng có thể rút gọn, tuy nhiên không biết dữ liệu gốc thế nào nên không đoán
 
Upvote 0
Để cho chắc Excel cũng kịp mà máy in cũng kịp hãy thử:
Thay For A = 1 To UBound(SARR) bằng For A = 1 To 50
Nếu được (kịp) thì sửa lại như cũ
Nhưng tốt hơn hết (do in nhiều quá), thì thêm 1 điều kiện bên trong, chạy 1 lần 50 dòng dữ liệu thôi, thêm cái Msgbox để chờ, in xong 50 dòng đó mới ok in tiếp 50 dòng.
Mã:
For A = 1 to Ubound(SARR)
    'Code in'
    If A Mod 50 = 0 Then MsgBox "Wait for the printer finish"
Next
 
Upvote 0
Upvote 0
Không thích "k" nhưng lại dùng "ok" thì hơi bị lạ đó anh. :D
Ý tôi là nhấn nút ok trên Msgbox để in tiếp.
Cái từ ok nó ăn vào tiếng Việt rồi :p
... văn hóa Mẽo cưỡng h*** văn hóa Việt.
Chữ k mà tôi ghét ở trong văn hóa chat chit tào lao. hok, ak, đến "vợ. chồng" cũng vk, ck.
Tương tự như vậy là k trong 50k: k là viết tắt của kilo, tiếp đầu ngữ cho 1 đơn vị đo lường mang nghĩa 1 ngàn như kg, km, kW, kJ, kCal. Nếu theo định nghĩa đó mà dùng cho tiền tệ thì phải có đơn vị tiền tệ như kđ, kUSD, ... mà thuở xưa cũng không ai dùng cho đơn vị tiền tệ.
 
Upvote 0
Nếu thế anh viết in hoa "OK" thì có thể đoán ra được trong ngữ cảnh đó.
Dùng "nhấn OK" thì khỏi đoán điếc gì hết.
Nguyên văn là "in xong 50 dòng đó mới ok in tiếp 50 dòng." chứ không phải "in xong 50 dòng đó ok mới in tiếp 50 dòng." Thường câu văn của tôi ít khi thiếu chữ hoặc dư chữ, đúng ngữ cảnh.
Tuy nhiên đọc lướt qua sẽ nhầm ngữ cảnh, thêm chữ "nhấn" sẽ khó nhầm hơn.
 
Upvote 0
Để cho chắc Excel cũng kịp mà máy in cũng kịp hãy thử:
Thay For A = 1 To UBound(SARR) bằng For A = 1 To 50
Nếu được (kịp) thì sửa lại như cũ
Nhưng tốt hơn hết (do in nhiều quá), thì thêm 1 điều kiện bên trong, chạy 1 lần 50 dòng dữ liệu thôi, thêm cái Msgbox để chờ, in xong 50 dòng đó mới ok in tiếp 50 dòng.
Mã:
For A = 1 to Ubound(SARR)
    'Code in'
    If A Mod 50 = 0 Then MsgBox "Wait for the printer finish"
Next
Em nghĩ sẽ tạo UserForm để nhập 2 giá trị đầu và cuối. Chia khoảng in ngắn lại!
 
Upvote 0
Em nghĩ sẽ tạo UserForm để nhập 2 giá trị đầu và cuối. Chia khoảng in ngắn lại!
Tôi có sử dụng For....Next gửi trên 4.000 lệnh in trong công việc. Excel chạy xong tắt màn hình ngủ một giấc mà máy in vẫn còn chạy miệt mài. Nói chung tùy bộ nhớ máy in chứ Excel vô tư.
 
Upvote 0
... Nói chung tùy bộ nhớ máy in chứ Excel vô tư.
Đấy là bạn nói theo kiểu dân Ai-Ti.

Dân tạp dịch văn phòng như tôi thì chỉ biết cái máy in Laser nó có chu kỳ lượng in của nó: một tháng tối đa bao nhiêu tờ. Bắt nó in một lúc nhiều quá, bên trong nguội không kịp, plastic (các phụ kiện) bị dòn, cao su (mép cuốn giấy) bị khô. Nó chết bất cứ lúc nào.
Các máy in to như cái tủ, ầm ầm ngày hằng mấy ngàn tờ là loại được nhà sản xuất dùng vật liệu bền.

Chu kỳ lượng kế: có ghi rõ trong ca ta lô chi tiết máy.
 
Upvote 0
Đấy là bạn nói theo kiểu dân Ai-Ti.

Dân tạp dịch văn phòng như tôi thì chỉ biết cái máy in Laser nó có chu kỳ lượng in của nó: một tháng tối đa bao nhiêu tờ. Bắt nó in một lúc nhiều quá, bên trong nguội không kịp, plastic (các phụ kiện) bị dòn, cao su (mép cuốn giấy) bị khô. Nó chết bất cứ lúc nào.
Các máy in to như cái tủ, ầm ầm ngày hằng mấy ngàn tờ là loại được nhà sản xuất dùng vật liệu bền.

Chu kỳ lượng kế: có ghi rõ trong ca ta lô chi tiết máy.
Công ty toàn sử dụng máy thuê không hà - in nhiều máy photo loại lớn - có trục trặc thì gọi họ tới sửa liền anh ơi. Còn em cũng tay ngang code cóp nhặt ghép lại cho nó chạy thì thôi chứ không hiểu tại sao nó chạy được nữa.
 
Upvote 0
Công ty toàn sử dụng máy thuê không hà - in nhiều máy photo loại lớn - có trục trặc thì gọi họ tới sửa liền anh ơi. Còn em cũng tay ngang code cóp nhặt ghép lại cho nó chạy thì thôi chứ không hiểu tại sao nó chạy được nữa.
Trường hợp này thì phải do printer server, đường truyền, ưu tiên sử dụng (nếu nhiều nguồi cùng in thì máy ưu tiên ai) chứ "bộ nhớ máy in" như bạn nói ở bài #17 là chuyện nhỏ.
 
Upvote 0
Web KT

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

Back
Top Bottom