USB1394
Thành viên hoạt động



- Tham gia
- 20/12/08
- Bài viết
- 173
- Được thích
- 12
- Nghề nghiệp
- Lính triều đình
Em có 1 file DS Hàng hóa , bây giờ muốn in nhãn từ DS này với số lượng nhãn tùy ý ,nhưng ko biết phải giải quyết vấn đề từ đâu , em có gởi kèm file xin các bạn giúp đỡ ,xin cám ơn
Sub Copy()
Dim rCell As Range
Dim dong, i
For Each rCell In Range("e14:e18")
If rCell <> "" Then
For i = 1 To rCell.Value
dong = Range("g65000").End(xlUp).Row + 1
Range("g" & dong) = rCell.Offset(0, -3)
Range("h" & dong) = rCell.Offset(0, -2)
Range("i" & dong) = rCell.Offset(0, -1)
Next
End If
Next
End Sub
Có cần thiết phải tường minh hơn, theo Bác SA.Thử code sau nhé
Mã:Sub Copy() Dim rCell As Range Dim dong, i For Each rCell In Range("e14:e18") If rCell <> "" Then For i = 1 To rCell.Value dong = Range("g65000").End(xlUp).Row + 1 Range("g" & dong) = rCell.Offset(0, -3) Range("h" & dong) = rCell.Offset(0, -2) Range("i" & dong) = rCell.Offset(0, -1) Next End If Next End Sub
Option Explicit
Dim FRow As Long
Dim rCell As Range
Dim dong As Long, iR As Long, endR As Long
Sub inNhan()
With Application
.ScreenUpdating = False: .Calculation = xlCalculationManual
End With
FRow = 14
endR = cells(65000, 5).End(xlUp).Row 'cot 5 la cot co sl nhan'
If endR = FRow Then
MsgBox "Nothing to print"
Exit Sub
End If
'Xoa phan can in va xd dong moi can in'
Range("G" & FRow & ":I1000").ClearContents
dong = Range("g65000").End(xlUp).Row + 1
For Each rCell In Range("E" & FRow & ":E" & endR)
If Len(rCell) <> 0 Then
For iR = 1 To rCell.Value
Range("G" & dong) = rCell.Offset(0, -3)
Range("H" & dong) = rCell.Offset(0, -2)
Range("I" & dong) = rCell.Offset(0, -1)
dong = dong + 1
Next
End If
Next
With Application
.ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End Sub
Thử code sau nhé
Có cần thiết phải tường minh hơn, theo Bác SA.
Nên khai báo fRow = 14 thay vì range("E14:E18"). Sau này nếu có bắt đầu <> 14 thì mình đỡ mất công.
Và phải xóa sạch nhãn cũ nữa chớ, số nhãn sau cần in ít hơn số nhãn hiện hữu.
Cụ thể
Mong được bổ sung.
Theo tôi nên có cái nút nhấn thì hay hơn. Và nếu cần tạo thêm 1 lựa chọn in nhãn nào -> ta tạo ra bao nhiêu nhãn luôn -> đỡ mất công vlookup. Giống như kiểu tạo phiếu in lương cho từng NV.Giải pháp của bạn cũng hay nhưng nếu làm cho nó tự động thì tuyệt , có cách nào không bạn !(tự động chạy đoạn mã này sau khi ta nhập dữ liệu)
Thì dùng code của anh ThuNghi bỏ vào sự kiện Change của Worksheet là được, đương nhiên là tốc độ của bảng tính sẽ ì ạch.Cách này đúng rồi , nhưng em muốn nó xử lý giống hàm vậy . Tức là khi ta chọn in mã N01 thì sẽ xuất liền , khi ta xóa giá trị in thì nó cũng mất theo
Option Explicit
Dim FRow As Long
Dim rCell As Range
Dim dong As Long, iR As Long, endR As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
With Application
.ScreenUpdating = False: .Calculation = xlCalculationManual
End With
FRow = 14
endR = cells(65000, 5).End(xlUp).Row 'cot 5 la cot co sl nhan'
If endR = FRow Then
MsgBox "Nothing to print"
Exit Sub
End If
If Not Intersect(Range("e" & FRow & ":e" & endR), Target) Is Nothing Then
'Xoa phan can in va xd dong moi can in'
Range("G" & FRow & ":I1000").ClearContents
dong = Range("g65000").End(xlUp).Row + 1
For Each rCell In Range("E" & FRow & ":E" & endR)
If Len(rCell) <> 0 Then
For iR = 1 To rCell.Value
Range("G" & dong) = rCell.Offset(0, -3)
Range("H" & dong) = rCell.Offset(0, -2)
Range("I" & dong) = rCell.Offset(0, -1)
dong = dong + 1
Next
End If
Next
With Application
.ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End If
End Sub
If endR = FRow Then
If endR < FRow Then
domfootwear ơi , bạn cho mình hỏi : Vì trong vấn đề này mình đã đơn giản để các bạn hình dung và đưa ra giải pháp , các giải pháp trên rất đúng nhưng có điều khi áp dụng thì có thể sẽ rơi vào trường hợp sau :To USB1394:
Code của anh ThuNghi rất tuyệt, nhưng bạn cần lưu ý khi sử dụng là dòng tiêu đề của bảng danh sách hàng và kết quả in nhãn phải là dòng thứ 13, dữ liệu là kể từ dòng 14 trở xuống (Thay đổi tùy bạn), có điều là tiêu đề của 2 bàng này phải nằm song song nhau nhé.
Mình tham gia cách tạo nhãn hàng hoá, theo cách hiểu của mình. Mình thấy Demo của bạn thì sao có thể dán vào hàng được
Bạn điền số lượng nhan tại sheet HH rồi nhấn tạo nhan. Sheet Temp là Sheet mẫu có thể ẩn đi (Tên Cty, Cửa hàng nhập vào sheet Temp sẽ điền vào toàn bộ nhãn).
Ban bổ xung 2 font mình gửi kèm vào máy của bạn để hiển thị mã vạch nhé.
1/Nếu bạn chỉ cần in 1 nhãn thì xoá hết cột số lượng nhãn và chỉ gõ số 1 vào dòng nhãn cần in. Nếu cần thì có thể sửa Code để chỉ in những dòng có đánh dấu x tại 1 cột nào đó.
2/In lượng nhãn lẻ đã khắc phục.
3/Đã khắc phục lượng nhãn cố định.
4/Muốn định dạng ra sao thì định dạng ở trang Temp, các nhãn kết quả y hệt hai nhãn ở trang temp.
5/Bạn nên cố gắng hoàn thiện và áp dụng. Nó tạo cảm giác cho khách hàng yên tâm hơn khi thanh toán và tin tưởng cửa hàng của bạn hoạt động rất khoa học. Nó sẽ rất thuận lợi cho việc bán hàng, viết hoá đơn tính tiền, thống kê bán hàng và kiểm kê hàng tồn khi trang bị máy quét mã vạch đấy.
Rất mong giúp được bạn 1 chút gì đó.
Mình tạm tách code của anh Sealand ra thành 3 code cho bạn tập trung hơn.Bạn seland ơi , file bạn sửa đã gần hoàn chỉnh nhưng bạn có thể giải thích cụ thể từng dòng lệnh không? mình muốn ứng dụng nhưng ko hiểu nên ko biết phải áp dụng thế nào . Mình ví dụ như thế này bạn nhé :
-------- Thứ 1: đoạn mã nào xác định vị trí bảng DS hàng hóa để mình có thể thêm DS hàng vào hoặc thêm cột vào (gọi là thêm thông tin hàng)
-------- Thứ 2: Đoạn mã này xử lý - tức là thực hiện hành động: Xác định Bảng DS hàng --> rồi áp dụng mã VBA --> cho ra Bảng KQ để mình thay đổi tương ứng
-------- Thứ 3: Đoạn mã nào xuất ra Bảng kết quả để mình lựa chọn nội dung xuất (số cột thông tin hàng hóa) , vị trí xuất (bắt đầu xuất KQ từ ô nào) , Hình thức xuất (xuất cột nào trước, cột nào sau)
Ở đây em xin chú thích thêm VĐ : Sở dĩ kết quả cuối cùng ta xuất ra Bảng KQ là có các ưu điểm sau :
------- thứ 1 : Giao diện đơn giản , dễ úng dụng . Tức ta chỉ cần Bảng DS hàng --> rồi áp dụng mã VBA --> cho ra Bảng KQ
------- thứ 2 : Do có nhiều loại nhãn in khác nhau (về kích thước lẫn nội dung, nhưng qui cách cũng tương tự - chỉ thêm số cột) nên từ Bảng kết quả ta lấy giá trị để in cho phù hợp
------- VĐ đặt ra ở đay là : Giả sử ta chọn dòng 2 (nhãn 2) và muốn in 5 lần thì kết quả sẽ cho ra 5 lần dòng 2 , cứ thế . . (đây là mấu chốt vấn đề)
======> Phương pháp của bạn thường dùng trong T/h DS hàng hóa nhỏ (ko đa dạng về qui cách và chủng loại) nhưng trong T/h của mình hàng hóa rất đa dạng (số lượng nhiều) , đa chủng loại (thông tin hàng hóa nhiều và khác nhau nên số cột nhiều ít khác nhau) ,nên việc áp dụng 1 kiểu định dạng duy nhất là ko khả thi ! (ở đây là sheet : Temp)
![]()
Option Explicit
Option Base 0
Dim mg()
Dim Sl As Long, i As Long, j As Long, k As Long, dg As Long
Dim dongcuoi As Long, rngSL As Range
Sub XoaNhan()
With Sh3
.Rows.Clear
End With
End Sub
Sub TaoNhan()
With Sh1
dongcuoi = .Cells(65000, 5).End(xlUp).Row
If dongcuoi = 1 Then Exit Sub
Set rngSL = .Range("E2:E" & dongcuoi)
End With
XoaNhan
j = 1
Sl = WorksheetFunction.Sum(rngSL)
ReDim mg(1 To Sl, 1 To 3)
For i = 1 To rngSL.Rows.Count
If rngSL(i) > 0 Then
For k = 1 To rngSL(i)
'Gan vao mang mg()'
mg(j, 1) = rngSL(i).Offset(, -3) 'ma'
mg(j, 2) = rngSL(i).Offset(, -2) 'ten'
mg(j, 3) = rngSL(i).Offset(, -1) 'gia'
j = j + 1
Next k
End If
Next i
TaoLabel
Set rngSL = Nothing
End Sub
Sub TaoLabel()
dg = 1
For i = 1 To Sl Step 2
Sh2.[a6] = mg(i, 1)
Sh2.[a5] = mg(i, 1)
Sh2.[a3] = mg(i, 2)
Sh2.[a4] = mg(i, 3)
k = IIf(i < Sl, i + 1, Sl)
Sh2.[c6] = mg(k, 1)
Sh2.[c5] = mg(k, 1)
Sh2.[c3] = mg(k, 2)
Sh2.[c4] = mg(k, 3)
Sh2.Rows("1:6").Copy Sh3.Cells(dg, 1)
If i >= Sl Then Sh3.Cells(dg, 3).Resize(6).Clear
dg = dg + 7
Next
End Sub
Option Explicit
Sub Button5_Click()
Dim rg As Range
Dim i, k
Set rg = Application.InputBox("Chi dinh o dau vung xuat ket qua", , , , , , , 8) [I][COLOR=Red]'đặt biến Rg bằng ô đầu tiên[/COLOR][/I]
rg = "MA HANG" [COLOR=Red][I] Gán ô đó ="MA HANG" [/I][/COLOR]
rg.Offset(, 1) = "TEN HANG" [I][COLOR=Red]''Gan ô bên canh="TEN HANG"[/COLOR][/I]
rg.Offset(, 2) = "DON GIA" [I][COLOR=Red]'Gán ô bên cạnh tiếp theo = "DON GIA"[/COLOR]
[/I] Set rg = rg.Offset(1) [I][COLOR=Red]'Dịch xuong 1 dong[/COLOR][/I]
For i = 1 To Sh1.[e2:e100].Cells.Count [I][COLOR=Red]'Gioi han su lý trong vùng dữ liệu[/COLOR]
[/I] If Sh1.Cells(i + 1, 5) > 0 Then [COLOR=Red]'Kiểm tra ô số lượng nếu lớn hơn 0[I] sẽ làm các việc dưới[/I][/COLOR]
For k = 1 To Sh1.Cells(i + 1, 5) [I][COLOR=Red]' Xác dịnh so lần làm việc dưới[/COLOR]
[/I] rg = Sh1.Cells(i + 1, 2) [I][COLOR=Red]'Cho ô đó = ma[/COLOR][/I]
rg.Offset(, 1) = Sh1.Cells(i + 1, 3) [COLOR=Red][I]'Cho ô bên cạnh bằng tên[/I][/COLOR]
rg.Offset(, 2) = Sh1.Cells(i + 1, 4) [I][COLOR=Red]'Cho ô cạnh nữa bằng giá[/COLOR]
[/I] Set rg = rg.Offset(1) [I][COLOR=Red] 'dich ô đó xuống 1 dòng[/COLOR][/I]
Next
End If
Next
End Sub
Có cần thiết tạo ra như sh KQ không, ví dụ muốn in 1000 nhãn phải tạo ra 1000 dòng.Xin cám ơn bạn ThuNghi đã giúp đỡ , sau một lúc nghiên cứu mình từ những giải pháp các bạn đưa ra mình đã phân tích lại VĐ trên một cách đơn giản để các bạn có thể dễ dàng giải quyết triệt để nó . Xin các bạn chú ý dùm cho Do hàng hóa rất đa dạng , đa chủng loại nên tùy T/h cụ thể mình sẽ in các loại nhãn khác nhau (về định dạng & số lượng) nên mình cần 1 bảng KQ để từ đây mình chỉ việc copy và dán vào file nhãn đã định dạng cho từng loại
Xin các bạn xem file phân tích của mình , mong nhận được sự quan tâm và giúp đã của các bạn , xin cám ơn !![]()
Với yêu cầu của bạn chỉ thế này cơ bản ổn
Mã:Option Explicit Sub Button5_Click() Dim rg As Range Dim i, k Set rg = Application.InputBox("Chi dinh o dau vung xuat ket qua", , , , , , , 8) [I][COLOR=Red]'đặt biến Rg bằng ô đầu tiên[/COLOR][/I] rg = "MA HANG" [COLOR=Red][I] Gán ô đó ="MA HANG" [/I][/COLOR] rg.Offset(, 1) = "TEN HANG" [I][COLOR=Red]''Gan ô bên canh="TEN HANG"[/COLOR][/I] rg.Offset(, 2) = "DON GIA" [I][COLOR=Red]'Gán ô bên cạnh tiếp theo = "DON GIA"[/COLOR] [/I] Set rg = rg.Offset(1) [I][COLOR=Red]'Dịch xuong 1 dong[/COLOR][/I] For i = 1 To Sh1.[e2:e100].Cells.Count [I][COLOR=Red]'Gioi han su lý trong vùng dữ liệu[/COLOR] [/I] If Sh1.Cells(i + 1, 5) > 0 Then [COLOR=Red]'Kiểm tra ô số lượng nếu lớn hơn 0[I] sẽ làm các việc dưới[/I][/COLOR] For k = 1 To Sh1.Cells(i + 1, 5) [I][COLOR=Red]' Xác dịnh so lần làm việc dưới[/COLOR] [/I] rg = Sh1.Cells(i + 1, 2) [I][COLOR=Red]'Cho ô đó = ma[/COLOR][/I] rg.Offset(, 1) = Sh1.Cells(i + 1, 3) [COLOR=Red][I]'Cho ô bên cạnh bằng tên[/I][/COLOR] rg.Offset(, 2) = Sh1.Cells(i + 1, 4) [I][COLOR=Red]'Cho ô cạnh nữa bằng giá[/COLOR] [/I] Set rg = rg.Offset(1) [I][COLOR=Red] 'dich ô đó xuống 1 dòng[/COLOR][/I] Next End If Next End Sub
Theo lời bạn ThuNghi
Có cần thiết tạo ra như sh KQ không, ví dụ muốn in 1000 nhãn phải tạo ra 1000 dòng.
Cụ thể bước 3 có thể làm như sau:
- Dùng AutoFilter xác định số nhãn phải in.
- Copy sang sh KQ. Sh KQ cũng giống như sh DS chỉ khác là không có dòng nào trống (SL=0).
- Từ Sh KQ mình sẽ tạo code đưa vào nhãn.
Bạn OK vậy thì mình làm tiếp.
Set rg = Application.InputBox("Chi dinh o dau vung xuat ket qua", , , , , , , 8)
Set rg = Sh1.[i1] 'Chon o dau tien vung KQ
rg.CurrentRegion.Clear 'Xoa vung KQ
If WorksheetFunction.Sum(Sh1.[e2:e100]) = 0 Then 'Neu cot SL =0
MsgBox "Ban khong in tem nao ca?" & Chr(13) & _
"Neu vay xin chao nhe!", , "CHUONG TRINH IN NHAN HANG" 'Thong bao va chao de thoat
Exit Sub: End If
Sh1.[i2].Activate
[FONT="]Sheet DS và Sheet KQ phải luôn là 2 sheet khác nhau vì Sheet DS sẽ chứa CSDL : gồm nhiều hàng và cột ,đặc biệt những SL cột và hàng có thể thêm tùy thuộc vào loại hàng bạn QL nhưng khi in thì chỉ lấy các cột cơ bản : Mã – Tên hàng – Giá[/FONT] .Vì thế việc tạo ra 2 sheet này là tất yếu . Còn về giải pháp : [FONT="]Theo gợi ý của bạn thì mình vẫn tạo ra 1 bảng cac hàng hóa có SL in nhãn <>0(dùng AutoFill lọc) , và từ đây bạn dùng VBA để xử lý (có đúng như bạn nghĩ vậy ko?) . Đây cũng là 1 cách , trong T/h này bạn Sealand : Kiểm tra ô SL > 0 làm đk lọc[/FONT] , bạn xem lại mình hiểu vậy đúng ko ?
Trong các bài trước, mình đã dùng mảng để lưu kết quả chứ không đưa ra sheet. Khi thoát Sub thì mảng cũng tiêu luôn không phải dọn "rác" của chương trình. (Theo mình đây là cách hợp lý hơn).Cơ chế làm việc trong code của mình là:
1/Phân công USB kiểm tra các ô trong vung số lượng. Nếu gập ô >0 thì báo cho Sealand biết SL,Ma,Ten, Gia
2/Sealand được phân công căn cư SL,Ma,Ten,Gia nhập lần lượt SL dòng Ma,Ten, Gia trên vùng KQ
Khi nhấn nút USB chạy trước, khi gặp ô >0 nháy Sealand. Sealand chạy theo phân công xong lại nghỉ chờ lệnh tiếp.
Hy vọng bạn hiểu cơ chế làm việc của Code.
Thành thế nàySet rg = Application.InputBox("Chi dinh o dau vung xuat ket qua", , , , , , , 8)
Mình sẽ xác định vị trí xuất kết quả là cố định tại ô A1 của sheet 2 chẳng hạn mà ko phải nhập nên bạn ko phải lo về việcSet rg = Sh2.Range("A1")
Lưu ý: Vì code có việc xoá DL nên đặt cố định. Nếu người dùng tự chọn không hợp lý sẽ nguy hiểm cho dữ liệu khác
rg.CurrentRegion.Clear 'Xoa vung KQ