In nhãn hàng hóa (1 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
 
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 là ô đầu tiên trong vùng KQ. Thuộc tính .CurrentRegion trả về toàn bộ những ô liên quan.
Bạn xem bài theo Link ở chữ ký của Bác Sa_DQ ấy, Bác ấy viết cẩn thận như giáo trình nếu bạn đọc là hiểu liền.
 
Rg là ô đầu tiên trong vùng KQ. Thuộc tính .CurrentRegion trả về toàn bộ những ô liên quan.
Bạn xem bài theo Link ở chữ ký của Bác Sa_DQ ấy, Bác ấy viết cẩn thận như giáo trình nếu bạn đọc là hiểu liền.

Theo cách này thì VBA chỉ xóa những "ô liên quan" , trong T/h này là nhưng ô xuất KQ vậy tại sao các khác (do mình tạo ra) cũng bị xóa luôn .Bạn thử xem nhé nếu ta dịch ô xuất KQ xuống 1 dòng rồi tạo tiêu đề : Bảng KQ thì sao khi in nhãn VBA tự xóa luôn dòng tiêu đề đó !? Ko hiểu tại sao luôn +-+-+-+

Còn T/h này ,mình chỉnh phần Xuất KQ ,ko cho xuất tiêu đề mà bắt đầu xuất KQ thôi ,còn tiêu đề mình tạo sẵn (kèm định dạng) ,nhưng khi chạy thì nó xuất KQ thôi (đúng) nhưng tại sao nó lại xóa phần tiêu đề của mình tạo ra làm chi vậy (sai) trong khi mình đã chỉnh lại vùng Bắt đầu xuất KQ xuống dưới 1 dòng rồi +-+-+-+ Muốn nó ko xóa đi những gì mình tạo ra thì làm sao bạn nhé (KỂ CẢ Conditional Formatting)

Còn phần mã Sh1.[i2].Activate có ý nghĩ giống
Sh1.Range("i2").Activate ko ? hay nó mang ý nghĩa khác ?+-+-+-+ Mình sửa lại như sau như sau :
--- Ghi thế này : Sh1.[i2].Activate thì VBA báo lỗi "Run-time error '438': Object doesn't support this property or method
"
--- Ghi thế này : Sh1.Activate
Range("i2").Seclect thì VBA chịu
Em ko hiểu , anh xin giải thích dùm em +-+-+-+

Trong đoạn mã của mình Vùng xử lý của bạn là : E2:E100 khi ta thêm 1 dòng vào bảng DS hàng thì nội dung tại dòng E100 sẽ chuyển xuống E101 điều này gây khó là ta phải dò lại mã VBA và chỉnh vùng xử lý lại . Mình có thể gán tên cho vùng này không bạn ?
VD : VXL = E2:E100 --> khi thêm 1 dòng VXL = E2:E101 (tự động) nhưng trong mã VBA vẫn là WorksheetFunction.Sum(Sh1.["VSL"]) thayvì là WorksheetFunction.Sum(Sh1.[e2:e100]) +-+-+-+

Mong bạn góp ý dùm ,xin cám ơn
 
Lần chỉnh sửa cuối:
1/Bạn sửa như sau sẽ theo ý bạn (Tiêu đề cột kết quả bạn phải tự nhập)
Mã:
Option Explicit
Sub Button5_Click()
Dim rg As Range
Dim i, k
Set rg = Sh1.[i2] 'Chon o dau tien vung KQ
Sh1.Range(rg, rg.End(xlDown)).Resize(, 2).ClearContents  '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
For i = 1 To Sh1.[e2:e100].Cells.Count
If Sh1.Cells(i + 1, 5) > 0 Then
For k = 1 To Sh1.Cells(i + 1, 5)
rg = Sh1.Cells(i + 1, 2)
rg.Offset(, 1) = Sh1.Cells(i + 1, 3)
rg.Offset(, 2) = Sh1.Cells(i + 1, 4)
Set rg = rg.Offset(1)
Next
End If
Next
End Sub
2/Bạn làm như sau để hiểu thuộc tính này:
Bạn chọn xuống dưới 1 dòng rồi đặt con trỏ vào đó.--->Vào Menu Edit--->Go to --->Speacial--->CurrentRegion--->OK.
Bạn thử xem nó chọn như thế nào với các ô xung quanh.
3/--- Ghi thế này : Sh1.Activate
Range("i2").Seclect thì VBA chịu

VBA đâu có chịu. Chịu là do bạn dùng sai lệnh. Lệnh Select là lệnh chọn 1 vùng trên sheet hiện hành, nếu chỉ định vùng đó tại sheet khác sẽ phát sinh lỗi. Nếu Code như bạn viết thì VBA sẽ chuyển con trỏ về ô I2 của sheet hiện hành.Bạn viết như sau sẽ đúng ý bạn"
Mã:
Sub test()
Sh1.Select ' Hoac Sh1.Activate
Range("C5").Select
End Sub
Nếu ghi:
Sh1.Activate
Range("i2").Seclect
thì đây là cú pháp đúng không sai được

5/Để tham chiếu 1 ô thì các cú pháp sau cho kết quả như nhau:

Sheet1.Range("C5") = 10
Sheet1.[c5] = 10
Sheet1.Cells(5, 3) = 10

6/VD : VXL = E2:E100 --> khi thêm 1 dòng VXL = E2:E101 (tự động) nhưng trong mã VBA vẫn là WorksheetFunction.Sum(Sh1.["VSL"]) thayvì là WorksheetFunction.Sum(Sh1.[e2:e100])

Không được, bạn phải đặt name động nhưng lại mất công đặt Name. Mình viết Code là giải pháp còn bạn tùy biến theo ý mình. Bạn sửa sửa như sau thì mặc kệ có bao nhiêu mã hàng cứ thêm:
Mã:
Option Explicit
Sub Button5_Click()
Dim rg As Range
Dim i, k
Set rg = Sh1.[i2] 'Chon o dau tien vung KQ
Sh1.Range(rg, rg.End(xlDown)).Resize(, 2).ClearContents  'Xoa vung KQ
If WorksheetFunction.Sum(Sh1.Range("e2:e" & Sh1.[b56536].End(xlUp).Row)) = 0 Then
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
For i = 1 To Sh1.Range("e2:e" & Sh1.[b56536].End(xlUp).Row).Cells.Count
If Sh1.Cells(i + 1, 5) > 0 Then
For k = 1 To Sh1.Cells(i + 1, 5)
rg = Sh1.Cells(i + 1, 2)
rg.Offset(, 1) = Sh1.Cells(i + 1, 3)
rg.Offset(, 2) = Sh1.Cells(i + 1, 4)
Set rg = rg.Offset(1)
Next
End If
Next
End Sub


Mình diễn đạt kém quá mong bạn thông cảm
 
Lần chỉnh sửa cuối:
1.Thay đổi vùng xóa KQ :
Ở đây bạn chỉ thay 1 dòng lệnh “rg.CurrentRegion.Clear” thành dòng lệnh “Sh1.Range(rg, rg.End(xlDown)).Resize(, 2).ClearContents“ Ngoài ra ko chỉnh chỗ nào khác .
Giải pháp này không xóa hết vùng KQ . Để đơn giản mình Giả sử như sau :
--- Thứ 1 : Vùng KQ từ A17:F65536 (Từ cột A đến cột F – Từ dòng 17 đến hết bảng tính)
--- Thứ 2 : Vùng KQ có định dạng Cột B,E,F là Number , Cột C là Date , các cột khác General
--- Thứ 3 : Các hàng (row) trong Vùng KQ định dạng Conditional Formatting... để làm nổi bật các dòng cách khoảng nhau
VĐ : chỉ xóa nội dung xuất trong vùng KQ ,còn các định dạng dữ liệu và định dạng hiển thị thì ko đổi +-+-+-+

Bạn xem thêm nhé
;;;;;;;;;;;, trong đoạn mã tiếp theo bạn có dùng Range("e2:e" & Sh1.[b56536].End(xlUp).Row) Có phải mình hiểu là chọn vùng E2:E65536 (ô cuối bảng tính) không ?
Mình đem áp dụng cho vùng KQ như sau “Sheet5.Range("A17:F" & Sheet5.[b56536].End(xlUp).Row).ClearContents” thì lại Giải quyết đc VĐ 2&3 nhưng nó lại xóa cả tiêu đề (VĐ 1 ko thõa) . . .Vậy là sao vậy bạn ???

2.
CurrentRegion
Khi ta nhập tại ô A1=acbxdcc (nhập dữ liệu bất kì) và chọn xuống dưới ô đó 1 ô (
liên tiếp) – là ô A2 thì CurrentRegion là vùng A1:A2 nhưng nếu ta chọn ko liên tiếp – ví dụ ô A3 thì CurrentRegion là ô A3 (ko còn liên quan đến ô A1 .Anh xem em thực hành thế là đủ chưa ? +-+-+-+
Với
cách này em có thể là cho VBA ko xóa dòng tiêu đề do mình tạo nhưng nó lại xóa đi tất cả định dạng định dạng dữ liệu và định dạng hiển thị !! (tức là ta chỉ giải quyết đc VĐ 1 còn VĐ 2 & 3 thì chưa );;;;;;;;;;;
3.Đặt tên vùng xử lý (VXL)
Option Explicit
Sub Button5_Click()
Dim rg As Range
Dim i, k
Set rg = Sh1.[i2] 'Chon o dau tien vung KQ
Sh1.Range(rg, rg.End(xlDown)).Resize(, 2).ClearContents 'Xoa vung KQ
If WorksheetFunction.Sum(Sh1.Range("e2:e" & Sh1.[b56536].End(xlUp).Row)) = 0 Then
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
For i = 1 To Sh1.Range("e2:e" & Sh1.[b56536].End(xlUp).Row).Cells.Count
If Sh1.Cells(i + 1, 5) > 0 Then
For k = 1 To Sh1.Cells(i + 1, 5)
rg = Sh1.Cells(i + 1, 2)
rg.Offset(, 1) = Sh1.Cells(i + 1, 3)
rg.Offset(, 2) = Sh1.Cells(i + 1, 4)
Set rg = rg.Offset(1)
Next
End If
Next
End Sub

Ở đây bạn thay 2 dòng lệnh (dòng màu đỏ)
--- Có phải giải pháp của bạn là chọn từ vùng E2:E56536 (ô cuối cùng của bảng tính – Mình nghĩ ô này phải là 65536 thì phải) nên ta có thể thêm dòng thoải mái mà ko cần chỉnh lại vùng dữ liệu ? Mình hiểu vậy là đúng chưa bạn . +-+-+-+
--- Thực tế khi mình tạo 1 file Excel mới và kiểm tra đoạn mã này “Range("e2:e" & Sheet1.[b56536].End(xlUp).Row).Select” thì KQ Excel chọn vùng E1:E2 ,vậy là sao nhỉ ?? Bạn giải thích dùm mình với .;;;;;;;;;;;
--- Nhưng nếu chỉnh đoạn mã này vào chương trình của Bạn thì lại đúng (VBA hiểu vùng xử lý là E2:E56535 , mất dòng thứ 56536 !!!???? – tức là mất 1 dòng ,vậy là sao vậy bạn ? mình ko hiểu);;;;;;;;;;;
Bạn xem thêm nhé , ở đây mình dùng Marco để kiểm tra
4.Mình có thêm 1 VĐ phát sinh : Giả sử Bảng DS Hàng có nhiều cột nhưng Bảng KQ chỉ có một số cột (từ bảng DS – các cột này liên tục nhau) ,
VĐ : Xđ số cột sẽ xuất từ bảng DS hàng ,các cột này liên tục+-+-+-+
Ví dụ : Bảng DS Hàng có 7 cột : A – B – C – D – E – F – G
Bảng KQ chỉ xuất 4 cột liên tục : C – D – E – F chẳng hạn thì là sao vậy bạn ?
 

File đính kèm

  • 1.jpg
    1.jpg
    43.5 KB · Đọc: 15
Lần chỉnh sửa cuối:
1/Không xóa hết vì nó sai ở đây:
Sh1.Range(rg, rg.End(xlDown)).Resize(, 2).ClearContents
Đổi lại:
Sh1.Range(rg, rg.End(xlDown)).Resize(, 3).ClearContents

Bạn thấy Clear<>ClearContents ( Xóa hết <> Xóa nội dung, định dạng vẫn còn)

2/Bạn thử CurrentRegion đúng rồi.

3/Sh1.[b56536].End(xlUp).Row
Đây là cách xác định dòng cuối cùng có dữ liệu

4/Hoàn toàn được, việc này bạn nên nghiên cứu để nắm vững vấn đề và tùy biến trong công việc của mình. Nếu kẹt ta tính sau 1 chút.

Mình sủa lại file bạn kiểm tra nhé
 

File đính kèm

1/Không xóa hết vì nó sai ở đây:
Sh1.Range(rg, rg.End(xlDown)).Resize(, 2).ClearContents
Đổi lại:
Sh1.Range(rg, rg.End(xlDown)).Resize(, 3).ClearContents

Bạn thấyClear<>ClearContents( Xóa hết <> Xóa nội dung, định dạng vẫn còn)

2/Bạn thử CurrentRegion đúng rồi.

3/Sh1.[b56536].End(xlUp).Row
Đây là cách xác định dòng cuối cùng có dữ liệu

4/Hoàn toàn được, việc này bạn nên nghiên cứu để nắm vững vấn đề và tùy biến trong công việc của mình. Nếu kẹt ta tính sau 1 chút.

Mình sủa lại file bạn kiểm tra nhé

Bạn xem lại bài #24 vì bận việc mình post thiếu nội dung ,bây giờ mình post lại hoàn chỉnh rồi ,Bạn có thể giải thích cho mình tham số của Range và Resize ko ? mình chưa hiểu cách VBA xử lý , Ví dụ của bạn mình tạo thêm sh4 thì thấy nó xóa đúng ý mình nhưng áp dụng vào chương trình của mình thì không đc , Resize(, 3) số 3 ở đây mang ý nghĩa là xóa 3 cột lấy từ ô đầu tiên của vùng KQ phải ko bạn ?

3/Sh1.[b56536].End(xlUp).Row
Đây là cách xác định dòng cuối cùng có dữ liệu
Vậy tại sao khi test tới dòng dữ liệu cuối nó ko hiểu là có dữ liệu (dòng 56536) +-+-+-+
--- Nhưng nếu chỉnh đoạn mã này vào chương trình của Bạn thì lại đúng (VBA hiểu vùng xử lý là E2:E56535 , mất dòng thứ 56536 !!!???? – tức là mất 1 dòng ,vậy là sao vậy bạn ? mình ko hiểu);;;;;;;;;;;
Nguyên lý Hđ như thế nào vậy bạn ?
 
Lần chỉnh sửa cuối:
1/Mình quên chưa nói bạn rõ:
-1 sheet bao giờ cũng có 2 tên: Name và CodeName. Name là Tên thể hiện trên SheetTab, còn CodeName vào VBA mới thấy. Trên Explore nó là phần ngoài dấu ngoặc còn Name trong dấu ngoặc. 2 tên này độc lập với nhau, Name đổi CodeName vẫn không đổi. Do vậy, mình thích dùng CodeName hơn để tùy người dùng thay đổi tên sheet vẫn không ảnh hưởng đến Code. Để thay đổi CodeName bạn vào VBA chọn dòng tên Sheet cần đổi rồi nhấn F4. Nó hiện ra bảng Properties, dòng đầu tiên là CodeName.
Do vậy trong file ví dụ mình đổi CodeName từ Sheet1 thành Sh1 nên mới dùng Sh1 tham chiếu được. Hoặc bạn tham chiếu theo tên phần bên ngoài dấu ngoặc ấy.

2/Sh1.Range(rg, rg.End(xlDown))
Đây là câu lệnh xác định cột từ ô Rg đến ô cuối trong cột có dữ liệu.
xxx.Resize(, 3) :Lệnh mở rộng vùng sang phải 2 cột
Lệnh của mình thiếu 1 dòng là đúng vì mình bỏ dòng đầu không xóa vì nó là tiêu đề. Mình đã đặt Rg=[i2]

Giải thích câu lệnh trên bằng ý nghĩa: Chọn cho tôi từ ô Rg cho tới ô cuối cùng trong cột đó có dữ liệu rồi mở rông sang phải 2 cột (Đếm cả nó là 3). Xong xóa đi nội dung thôi nhé.
 

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

Back
Top Bottom