In nhãn hàng hóa (3 người xem)

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

Người dùng đang xem chủ đề này

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
 

File đính kèm

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

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
 

File đính kèm

Lần chỉnh sửa cuối:
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
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ể
PHP:
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
Mong được bổ sung.
 

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

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.

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)
 
Chỉnh sửa lần cuối bởi điều hành viên:
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)
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.
Tạo tự động thì bíêt là khi nào bạn hết nhập vào data nguồn.
 
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é.
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
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.

Mã:
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
To anh ThuNghi:

Đoạn
Mã:
If endR = FRow Then
Nên sửa thành:

Mã:
If endR < FRow Then
Vì nếu dữ liệu chỉ có ở cell E14 là 1 số nào đó thì nó không chạy dòng đó
 
Lần chỉnh sửa cuối:
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é.
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 :
- Bảng Danh sách hàng hóa ở 1 sheet (nằm bất kì đâu trong sheet)
- Bảng kết quả nằm ở 1 sheet (nằm bất kì đâu trong sheet)
Vậy làm cách nào để em xđ vị trí đoạn mã cần sữa (ở đây là : đoạn mã vị trí tiêu đề : số dòng là 13 & vị trí đoạn mã dữ liệu : số dòng 14) , tất nhiên trong T/h này có thể 2 tiêu đề sẽ cũng chẳng nằm trên 1 dòng (mà cách nhau n dòng chẳng hạn !)
Mong nhận được sự giải thích cặn kẽ vì em hiểu về VBA cũng còn hạn hẹp lắm !mong các bạn thông cảm & giúp đỡ , xin cám ơn
......................................
Các bạn cùng xem vấn đề này nhé : Dòng lệnh
If endR = FRow Then sẽ sữa thành If endR < FRow Then thì có kết quả sau :

- Nếu ta chọn dấu "=" thì ko thể in nhãn đầu tiên được mà phải in kèm với 1 nhãn khác , đồng thời nếu ta xóa tất cả giá trị in thì bảng KQ sẽ xóa hết (cái này mới đúng là Reset lại !)
- Nêu ta chọn dấu "<" thì có thể in nhãn đầu tiên bình thường , nhưng lại không thể Reset bảng KQ lại được !

Vậy các bạn có giải pháp gì có thể giúp vừa in nhãn đầu tiên bình thường vừa có thể reset lại bảng KQ được không ?
 
Chỉnh sửa lần cuối bởi điều hành viên:
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é.
 

File đính kèm

Lần chỉnh sửa cuối:
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é.

Xin cám ơn bạn Sealand rất nhiều , bạn tạo giao diện rất đẹp . trong đó có 1 vài chỗ nhỏ mình chưa khắc phục được :
1. Giả sử mình muốn in 1 nhãn duy nhất (bất kì hàng nào) thì ko thể .Số nhãn in luôn là số chẵn .Có cách nào in SL theo ý mình ko ?
2. Định dạng nhãn rất hay nhưng mình chưa biết cách tạo . Vì sao nó có sẵn 52 nhãn , khi in ít hơn 52 thì các mẫu định dạng ko tự mất đi mà khi in lớn hơn 52 thì tự động xuất hiện . Có cách nào thay đổi chỉ xuất hiện đúng số lượng nhãn cần in ko?
3. Khi xóa hết SL nhãn in để bắt đầu lại (gọi là reset) thì ko thể đc - bị báo lỗi . Có cách nào khắc phục ko vì thực tế : lúc đầu mình in 2 nhãn khác ,lúc sau in 5 nhãn khác , . . .
4. Ở đâ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 đề)
 
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ì đó.
 

File đính kèm

Hy vọng các bạn sẽ giúp mình tới nơi tới chốn , xin cám ơn nhiều !

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ì đó.

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)
======> Nếu bạn không ngại có thể xem giải pháp của 2 bạn domfootwear và ThuNghi (giống ý tưởng của vấn đề này nhưng còn một vài VĐ nhỏ cần chỉnh lại http://www.giaiphapexcel.com/forum/showthread.php?36023-In-nhãn-hàng-hóa&p=238845#post238845 )

À quên còn 1 VĐ nhỏ nữa : Khi xóa hết SL nhãn in để bắt đầu lại (gọi là reset) thì ko thể đc - bị báo lỗi . Có cách nào khắc phục ko vì thực tế : lúc đầu mình in 2 nhãn khác ,lúc sau in 5 nhãn khác , . . . (cái này chưa khắc phục đc!!!)

-------- Rất cám ơn Bạn cùng mọi người đã quan tâm và giúp đỡ , VĐ của mình đã được giải quyết gần đến đích rồi (còn qua phà là tới nhà rồi !) chỉ còn 1 bước là hiểu đoạn mã trên và áp dụng từng T/h cụ thể thôi . Mình rất mong Bạn Seland và các bạn khác có thể giúp mình đến nơi đến chốn .Xin cảm ơn rất nhiều +-+-+-++-+-+-++-+-+-+
 
Lần chỉnh sửa cuối:
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)
+-+-+-++-+-+-++-+-+-+
Mình tạm tách code của anh Sealand ra thành 3 code cho bạn tập trung hơn.
1/ Tìm thấy nếu có sl thì mới xoá sh Nhan
2/ Tạo SL nhãn
3/ Copy từ tmp sang nhãn.
Bạn nghiên cứu thử, còn phần chọn tại dòng nào muốn in bao nhiêu nhãn thì cũng kg khó. Trước mắt bạn cố hiểu code đã.
Code của anh Sealand dùng mảng nên cũng tạm thời khó hiểu với bạn. Phần mg(j, 1) = rngSL(i).Offset(, -3) 'ma ...Nghiên cứu sau.
Tôi gởi code và file nhé.
Sẽ giải thích sau.
PHP:
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
 

File đính kèm

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 !+-+-+-++-+-+-++-+-+-+
 

File đính kèm

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
 

File đính kèm

Lần chỉnh sửa cuối:
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 !+-+-+-++-+-+-++-+-+-+
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.
 
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

Bạn Sealand ơi , Trong đoạn mã này còn thiếu : Nếu ô SL=0 thì
- Trở lại vùng rg
- Xóa hết kêt quả đã xuất
- Hiện thông báo : "Bạn chưa nhập số lượng nhãn cần in"
- Kêt thúc
Cái này mình đã ghi trong Sơ đồ bạn xem lại dùm mình nhé , Xin cám ơn , mong sớm nhận được hồi âm

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
.

[FONT=&quot]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=&quot]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 ?
 
Bạn thay câu lệnh
Mã:
Set rg = Application.InputBox("Chi dinh o dau vung xuat ket qua", , , , , , , 8)
Bằng :

Mã:
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
Thêm câu lệnh sau trước End Sub:

Mã:
Sh1.[i2].Activate
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


[FONT=&quot;]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=&quot;]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.
 
Lần chỉnh sửa cuối:
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.

Cách giải thích của bạn mình hiểu nhưng việc chỉnh sửa mã VBA có đơn giản không ? Lấy VD như vậy : Giải sử mình muốn thêm 1 cột nữa (sau cột tên hàng) thì phải sửa ở chỗ nào , điều này cũng kéo theo Bảng KQ sẽ ko thay đổi (nếu T/h mình vẫn cần 3 cột : Mã - Tên hàng - Giá ) hoặc sẽ thay đổi nếu ta cần hiện thêm cột mới nữa (lúc này bạn sẽ chỉnh phần mã xuất KQ)

Bạn chú ý nhé , ở đây có 2 vấn đề
-- Thứ 1 : Dùng VBA để giải quyết VĐ bài toán
-- Thứ 2 : Mã VBA phải có khả năng tùy biến - tức thay đổi khi bảng DS có sự thay đổi hoặc Bảng KQ có thêm yêu cầu

Ở trên các bạn đã giúp mình giải quyết VĐ thứ 1 nhưng để giải quyết VĐ thứ 2 đòi hỏi mình phải hiểu rõ các dòng lệnh VBA nhưng vì kiến thức của mình còn hạn hẹp nên có thể các bạn sẽ giải thích hơi mệt !$@!! Chính vì thế mình đã xây dựng giải pháp là chủ động hướng xây dựng các đoạn mã có thể hiện chính xác vùng dữ liệu (ở đây là Range) để khi nhìn vào mình chỉ thay đổi là có thể giải quyết các VĐ thứ 2 (các bạn xem mình vẽ sơ đồ thì biết ngay trình độ VBA của mình rồi . . **~**-+*/-\\/. thật tệ phải ko )

Lấy ví dụ nhé , khi áp dụng mình sẽ thay đoạn mã của bạn
Set rg = Application.InputBox("Chi dinh o dau vung xuat ket qua", , , , , , , 8)
Thành thế này
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ệc
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

%#^#$Thực ra mình rất muốn học VBA một cách có bài bản nhưng tiếc là chỗ mình ko có 1 nơi nào dạy . . đành phải học mò vậy ,mình đang xem tài liệu của thầy Phan Tự Hướng nhưng có nhiều chỗ ko "thấy đường đi" . . hy vọng 1 ngày nào đó mình cũng sẽ có cơ hội tham gia và làm việc với các bạn ;;;;;;;;;;;

Mình sửa đoạn mã rồi có gì cho bạn hay nhé
 
xin báo cho bạn Sealand mừng , mình đã áp dụng đoạn mã của bạn thành công rồi ,tuyệt --=0 Xin cám ơn Sealand và các bạn khác đã giúp đỡ . Mình sẽ tiếp tục nghiên cứu tiếp }}}}}}}}}}}}}}}
 
Bạn Sealand ơi cho mình hỏi thêm chỗ này nhé , đoạn mã xóa kết của bạn là xóa từ ô nào đến ô nào trong Vùng xuất KQ vậy ? (Chương trình chạy ổn rồi nhưng cái này muốn hỏi thêm cho biết);;;;;;;;;;;
rg.CurrentRegion.Clear 'Xoa vung KQ
 
Web KT

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

Back
Top Bottom