VBA để in mã vạch ra giấy dán Tomy133

Liên hệ QC

andythuy

Thành viên mới
Tham gia
24/8/10
Bài viết
41
Được thích
2
Chào các bác,

Em có viết một đoạn mã để thực hiện các việc sau:
1. Tạo một sheet mới trong workbook hiện hành
2. Định dạng chiều cao dòng và loại font cho các dòng ở sheet mới cho khớp với các miếng dán trên giấy Tomy133
3. Copy dữ liệu trong các cột do người dùng chỉ định ở worksheet hiện hành sang worksheet mới

Tuy nhiên, đoạn mã này chạy rất chậm, mặc dù em thấy toàn các lệnh đơn giản, các bác xem giúp nó cần tối ưu như thế nào và tư vấn cho em với nhé
Mã:
ub tomy133()
Dim checksheetname As Boolean
    Dim Vung As Range
    Dim iCell As Range
    Dim BoDem As Integer
'ws As Sheets
'
' Macro1 Macro
'
'
On Error GoTo errHandler:
'Cho user chon vung du lieu de in Label
Set Vung = Application.InputBox("Chon cac o chua SO LIEU de in", "Chon CELL can in LABEL", , , , , , 8)

'kiem tra xem có sheet tomy133 chua, neu chua co thi tao
checksheetname = False
For Each ws In Worksheets
If ws.Name = "tomy133" Then
checksheetname = True
MsgBox ("Sheet da ton tai")
Exit For
End If
Next ws
If checksheetname = False Then

'tao sheet tomy133
    Worksheets.Add
    ActiveSheet.Name = "tomy133"
 End If
 
Sheets("tomy133").Activate
    Rows("1:24").Select
    Selection.RowHeight = 51.75
    Selection.Font.Name = "Free 3 of 9 Extended"
    Selection.Font.Size = 30
    Selection.VerticalAlignment = xlBottom
    '------------
    Columns("A:A").Select
    Selection.ColumnWidth = 46
    Columns("B:B").ColumnWidth = 6
    Columns("C:C").ColumnWidth = 46
    
    '-----
    Rows("1:1").Select
    Selection.RowHeight = 47.25
        
    Rows("2:2").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("5:5").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("8:8").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("11:11").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("14:14").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("17:17").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("20:20").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    Rows("23:23").Select
    Selection.RowHeight = 22.5
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 20
    '--------------
    Rows("3:3").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("6:6").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("9:9").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("12:12").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("15:15").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("18:18").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("21:21").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    Rows("24:24").Select
    Selection.RowHeight = 30.75
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 22
    Selection.VerticalAlignment = xlTop
    '------------
    'Chon font arial va size 22 Free 3 of 9 Extended
    'Cells.Font.Name = "Arial"
    'Cells.Font.Size = 22
    Cells.Select
    With Selection
        .HorizontalAlignment = xlLeft
        '.VerticalAlignment = xlTop
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = True
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    '
    'Cai dat trang
        With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0)
        .RightMargin = Application.InchesToPoints(0)
        .TopMargin = Application.InchesToPoints(0)
        .BottomMargin = Application.InchesToPoints(0)
        .HeaderMargin = Application.InchesToPoints(0)
        .FooterMargin = Application.InchesToPoints(0)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlPortrait
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = 100
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
        
        BoDem = 1
    For Each iCell In Vung
        
            If BoDem <= 8 Then
            
            Range("A" & BoDem * 3 - 2).Value = "*" & iCell.Value & "*"
            Range("A" & BoDem * 3 - 1).Value = iCell.Value2
            Range("A" & BoDem * 3).Value = iCell.Offset(, 2).Value2
            Else
            If BoDem <= 16 Then
            'BoDem = BoDem + 1
            Range("C" & (BoDem - 8) * 3 - 2).Value = "*" & iCell.Value & "*"
            Range("C" & (BoDem - 8) * 3 - 1).Value = iCell.Value2
            Range("C" & (BoDem - 8) * 3).Value = iCell.Offset(, 2).Value2
            Else
                Exit For
            End If
            End If
            iCell.Font.Color = -11489280
        
        BoDem = BoDem + 1
    Next iCell
    MsgBox "Done"

errHandler:  Exit Sub
 
End Sub
 

File đính kèm

Để cải thiện tốc độ. Mình nghĩ bạn có thể lược bỏ các đoạn code căn chỉnh cao; rộng, lề trái, phải, border v..v theo từng dòng từng cột của sheet tomy133.
Mà Thay vào đó bạn làm sẵn ra 1 sheet khác có đầy đủ các format đó. Sau đó dùng Macro copy sheet chuẩn đó sửa tên thành sheet tomy133. như vậy sẽ giảm thời gian xử lý
Ý tưởng của mình là vậy, các chi tiết còn lại bạn tự hoàn thiện theo nhu cầu của riêng bạn nhé
(góp ý thêm: Đối với tomy133 Bạn nên sắp xếp kết quả hiện ra theo chữ Z như vậy sẽ đỡ tốn giấy hơn khi in lẻ 1 vài mã)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào các bác,

Em có viết một đoạn mã để thực hiện các việc sau:
1. Tạo một sheet mới trong workbook hiện hành
2. Định dạng chiều cao dòng và loại font cho các dòng ở sheet mới cho khớp với các miếng dán trên giấy Tomy133
3. Copy dữ liệu trong các cột do người dùng chỉ định ở worksheet hiện hành sang worksheet mới

Tuy nhiên, đoạn mã này chạy rất chậm, mặc dù em thấy toàn các lệnh đơn giản, các bác xem giúp nó cần tối ưu như thế nào và tư vấn cho em với nhé
.................................................
- Đây là cách đơn giản nhất, tôi sửa cấu trúc Sheet1 lại 1 tí để thuận tiện cho việc dùng hàm.
- Ở sheet Tomy133, muốn in bắt đầu từ số mấy thì vào I3 gõ số muốn in, còn muốn in hết danh sách thì gõ số 1, đến số mấy thì dùng hàm lấy số cuối cùng.
 

File đính kèm

Upvote 0
bac be09 làm thế nào mà tài thế nhỉ, em chả thấy sheet1 của em ở đâu.

Em giải thích thêm là em cần in ra giấy Tomy cho nhiều loại file khác nhau, do đó code này em đưa vào template của excel dạng add-in để sử dụng trên menu của excel luôn.

Như file của bác be09 thì em không nhập thêm được vào sheet1, và nếu mở file khác thì em cũng không in theo mẫu được nữa.
 
Upvote 0
bac be09 làm thế nào mà tài thế nhỉ, em chả thấy sheet1 của em ở đâu.

Em giải thích thêm là em cần in ra giấy Tomy cho nhiều loại file khác nhau, do đó code này em đưa vào template của excel dạng add-in để sử dụng trên menu của excel luôn.

Như file của bác be09 thì em không nhập thêm được vào sheet1, và nếu mở file khác thì em cũng không in theo mẫu được nữa.
Code đó là code biểu diễn thôi. Muốn làm để sử dụng thì phải sửa nhiều chỗ. Còn làm add-in thì lại phải nhọc công thêm nữa.

Thì bạn cũng nhìn thấy vd.
="VP.D15.18.HS989"&TEXT(RIGHT(E1;3)&E1;"000")&" - "&VLOOKUP(E1;Sheet1!$A$2:$E$33;5;0)
Tức nó chỉ xét từ dòng 2 tới dòng 33 thôi. Nhập thêm thì cũng vô ích.
 
Upvote 0
bac be09 làm thế nào mà tài thế nhỉ, em chả thấy sheet1 của em ở đâu.

Em giải thích thêm là em cần in ra giấy Tomy cho nhiều loại file khác nhau, do đó code này em đưa vào template của excel dạng add-in để sử dụng trên menu của excel luôn.

Như file của bác be09 thì em không nhập thêm được vào sheet1, và nếu mở file khác thì em cũng không in theo mẫu được nữa.
1/ Muốn nhập liệu cái gì thì vào sheet Nhap_Lieu, xong nhấn nút, nó lưu vào vào sheet1 và tự đánh số thứ tự.
2/ Bạn đưa dữ liệu đến đâu thì tôi chỉ làm cho đến đó, còn bạn nhập liệu thêm vào sheet1 thì vào những chỗ có hàm VLOOKUP của Sheet tomy133 sửa chỗ màu đỏ (không lẽ bạn lại không biết sửa).

VLOOKUP(E1;Sheet1!$A$2:$E$33;5;0)

3/ Code chỉ áp dụng cho File này, còn File khác tôi không biết. Bài 1 bạn đâu có nêu câu này "cần in ra giấy Tomy cho nhiều loại file khác nhau".
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em có viết một đoạn mã để thực hiện các việc sau:
1. Tạo một sheet mới trong workbook hiện hành
2. Định dạng chiều cao dòng và loại font cho các dòng ở sheet mới cho khớp với các miếng dán trên giấy Tomy133
3. Copy dữ liệu trong các cột do người dùng chỉ định ở worksheet hiện hành sang worksheet mới
Dù in bằng tay hay dùng code thì cũng phải có mẫu in. Vậy phải soạn mẫu in thật chuẩn. Tiếp theo nếu in tay thì phải tự nhập dữ liệu vào các trường cần in hoặc dùng công thức để lấy dữ liệu nguồn và đập vào vùng cần in. Sau đó phải dùng tay kích hoạt Print.

Cũng có thể dùng code để lấy dữ liệu nguồn và bắn vào vùng cần in, và dùng code để in. Đã dùng code thì dùng tới cùng chứ ai lại chỉ dùng để in còn lại dùng công thức để bắn dữ liệu vào vùng in? Chả ai làm nửa vời như thế cả. Đã code thì code làm tuốt.

Code của bạn tự lấy dữ liệu và bắn vào vùng in là đúng rồi. Không dùng công thức gì cả. Nhưng tôi nhìn lướt qua thì code của bạn chỉ in tối đa 16 dòng. Nếu chọn vùng có 17 dòng thì code cũng chỉ in 16 dòng.

Mà thậm chí khi dùng tay thì chả ai dùng công thức với vị trí dòng cố định, vd. 2:33. Đây không phải là chuyện biết hay không biết sửa công thức. Chả nhẽ mỗi lần co dãn, nhập thêm dữ liệu thì lại phải sửa công thức bằng tay? Chả ai làm thế cả. Phải dùng công thức tự thích hợp với vùng dữ liệu hiện hành.

Tôi không hiểu bạn tạo sheet mới cho mỗi lần in để làm gì. Chỉ cần tạo mẫu in chuẩn 1 lần duy nhất. Mỗi khi cần in thì lấy và bắn dữ liệu vào mẫu rồi in thôi.
 
Upvote 0
....................Em giải thích thêm là em cần in ra giấy Tomy cho nhiều loại file khác nhau, do đó code này em đưa vào template của excel dạng add-in để sử dụng trên menu của excel luôn.............................
Góp ý cho bạn:

1/ Do bài 1 bạn diễn giải chưa cụ thể, rỏ ràng nên tôi chưa hiểu rỏ mục đích của bạn làm gì. Vì vậy, tại bài 3 tôi đưa File lên và cũng đã nêu rỏ “Đây là cách đơn giản nhất”, việc còn lại là bạn áp dụng nó như thế nào là tùy cách bạn ứng biến.

2/ Đúng ra bạn phải đưa lên cái mẫu giấy Tomy133 để người giúp hình dung được nội dung cái mẫu đó thế nào, gán dữ liệu nào trên sheet vào đâu của cái mẫu giấy (bài 1 bạn chưa diễn giải).

3/ Bạn nên thiết kế 1 sheet làm mẫu theo nội dung mẫu giấy Tomy133 và bạn chỉ cần định dạng ở sheet này 1 lần chứ không nên dùng code để Add sheet và định dạng cho nó, do mỗi lần Add là mỗi lần định dạng nên nó chậm là phải rồi.
 
Upvote 0
Cảm ơn các bác, em thử phương án định dạng sẵn một sheet rồi chỉ đẩy thông tin vào, công nhận nhanh hơn hẳn.

Vấn đề của em coi như được xử lý 90%, mặc dù chưa hẳn tuyệt đối, nhưng cũng đã được cải thiện rất nhiều.

Chúc các bác một năm mới sức khỏe và hạnh phúc ạ.
 
Upvote 0
Cảm ơn các bác, em thử phương án định dạng sẵn một sheet rồi chỉ đẩy thông tin vào, công nhận nhanh hơn hẳn.

Vấn đề của em coi như được xử lý 90%, mặc dù chưa hẳn tuyệt đối, nhưng cũng đã được cải thiện rất nhiều.

Chúc các bác một năm mới sức khỏe và hạnh phúc ạ.
Góp ý thêm:
Tại sheet1 nên đặt Name để khi nhập liệu thêm vào sheet1 thì khỏi mất công sửa lại hàm trong sheet tomy133 (chỗ màu đỏ).
VLOOKUP(E1;Sheet1!$A$2:$E$33;5;0)
 
Upvote 0
Cảm ơn các bác, em thử phương án định dạng sẵn một sheet rồi chỉ đẩy thông tin vào, công nhận nhanh hơn hẳn.

Vấn đề của em coi như được xử lý 90%, mặc dù chưa hẳn tuyệt đối, nhưng cũng đã được cải thiện rất nhiều.
Bạn tham khảo add-in.

Toàn bộ code nằm trong add-in. Tập tin ngoài chỉ chứa dữ liệu.

Bạn tải tomy133v2.xlam về -> mở Excel -> cài add-in.

Trong add-in có sheet tomy133 chứa mẫu in. Mẫu này tôi lấy từ tập tin của bạn. Bạn nên sửa cho thật chuẩn. Trước hết tôi thấy nội dung in dài hơn 1 trang. Cần thay cỡ chữ nhỏ hơn, chiều cao dòng nhỏ hơn. Để sửa thì: Alt + F11 -> chọn ThisWorknook -> trong cửa sổ Properties đổi thuộc tính IsAddin thành False -> trở về sheet -> sửa mẫu trong tomy133 -> sửa xong -> Alt + F11 -> sửa IsAddin thành True -> về lại sheet và lưu lại tập tin.

Khi mở tập tin chứa và chỉ chứa dữ liệu cần in thì nhấn menu tomy133 trên Ribbon -> chọn cột đầu tiên (cũng có thể chọn nhiều cột nhưng code sẽ chỉ lấy cột đầu tiên) từ dòng tới dòng -> nhấn OK trong InputBox. Thế thôi.

Code thực thi là Sub tomy133. Nếu sau này có nhu cầu đặt code trong tập tin có dữ liệu thì chỉ lấy Sub tomy133. Không có một tí công thức nào cả.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom