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

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é.
 
Web KT

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

Back
Top Bottom