Xin giúp đỡ về Sự kiện Worksheet_Change

Liên hệ QC

trungvdb

Thành viên thường trực
Tham gia
22/8/08
Bài viết
374
Được thích
171
Nghề nghiệp
Tài chính
Giả sử tôi có đoạn Code sau

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$H$1" Then
Range("A1").CurrentRegion.Copy: Range("A10").PasteSpecial 3
End If
End Sub

Bây giờ tôi muốn lệnh Copy chỉ được thực hiện khi ô H1>100 thì lệnh Copy mới thực hiện, tôi sửa thành
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$H$1" And Target > 100 Then
Range("A1").CurrentRegion.Copy: Range("A10").PasteSpecial 3
End If
End Sub

thì nó lỗi, vậy xin hỏi mọi người chỉ cho cách viết đúng
 
Chốt lại bản chất vấn đề này thày Ndu giảng giải và kết luận: Target là tất cả những cell có thay đổi

Đúng nhưng chưa đủ. Chỉ đúng trong sự kiện Change. Mọi cái đều phải xem xét trong bối cảnh của nó.

Đối với sự kiện Worksheet_Change thì Target là cell hoặc Range (nhiều Cells) có thay đổi giá trị

Đối với sự kiện Selection_Change, thì Target là cell hoặc Range (nhiều Cells) vừa di chuyển tới. Nên so sánh với sự kiện Sheet_Change: khi thay đổi giá trị bằng cách gõ vào và Enter, thì Target là ô vừa gõ và dời đi, chứ không phải ô vừa chuyển tới.

Đối với sự kiện BeforeRightClick hoặc BeforeDoubleClick thì target là ô mà ta nhấn chuột phải vào, hoặc double click vào.
 
Upvote 0
Em nghĩ chưa hẳn vậy, ví dụ sự thay đổi do nguyên nhận thực hiện lệnh Copy cả vùng sang chỗ khác, lúc này những vùng sau khi được Paste vào đâu có phải đặt con trỏ vào cả tất vùng đâu.

Quan trọng là bản chất vấn đề những cái gì thay đổi thôi.
 
Upvote 0
Cảm ơn thày Ptm0412, bản thân mới tìm hiểu Worksheet_Change, nhờ thày chỉ cho nên có điều kiện biết thêm về cả Selection_Change, BeforeRightClick hoặc BeforeDoubleClick.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói đúng hơn, Target là nơi mà con trỏ đặt vào và có thay đổi tại ô đó.
Không đúng nha! Copy Paste thì tính sao?
----------------------------------
Nói thêm về sự kiện Change:
- Target là tất cả những cell có thay đổi giá trị nhưng không tính các cell thay đổi do công thức gây ra

Ví dụ trên bảng tính, ta gõ vào cell D1 công thức =A1
Ta thiết lập sự kiện Change bẳng code
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$D$1" Then
    MsgBox Target.Address
  End If
End Sub
Khi ta thay đổi giá trị tại A1 thì D1 cũng có thay đổi nhưng chẳng có code nào hoạt động cả
- Ngoài ra Target cũng không tính các LinkCell do các ComboBox, ListBox thay đổi luôn
 
Lần chỉnh sửa cuối:
Upvote 0
Em nghĩ chưa hẳn vậy, ví dụ sự thay đổi do nguyên nhận thực hiện lệnh Copy cả vùng sang chỗ khác, lúc này những vùng sau khi được Paste vào đâu có phải đặt con trỏ vào cả tất vùng đâu.

Quan trọng là bản chất vấn đề những cái gì thay đổi thôi.
Chắc DauthiVan trả lời bài 20 của Nghĩa?
Đúng rồi, nếu dùng câu lệnh VBA để gán giá trị vào 1 ô hoặc 1 Range nhiều ô, thì ô hoặc Range đó thay đổi giá trị, nhưng con trỏ ở đâu đâu ấy.

Thí dụ con trỏ ở đâu không cần biết, nhưng chạy câu lệnh này:

Cells(1, 1).Resize(10, 4) = RArr

Thì Target là vùng A1:D10
 
Upvote 0
Em hỏi hơi ngớ ngẩn 1 chút tại sao khi dùng địa chỉ tương đối không được mà địa chỉ tuyệt đối lại được, ví dụ em thay đổi Code của thày Ndu thì khi đánh giá trị mới hộp thoại Msgbox không chịu ra
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "D1" Then
    MsgBox Target.Address
  End If
End Sub
 
Upvote 0
Không đúng nha! Copy Paste thì tính sao? ---------------------------------- Nói thêm về sự kiện Change: - Target là tất cả những cell có thay đổi giá trị nhưng không tính các cell thay đổi do công thức gây ra Ví dụ trên bảng tính, ta gõ vào cell D1 công thức =A1 Ta thiết lập sự kiện Change bẳng code
PHP:
 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Address = "$D$1" Then     MsgBox Target.Address   End If End Sub
Khi ta thay đổi giá trị tại A1 thì D1 cũng có thay đổi nhưng chẳng có code nào hoạt động cả - Ngoài ra Target cũng không tính các LinkCell do các ComboBox, ListBox thay đổi luôn
Nhớ ngày mới vào diễn đàn, những ngày tập tành "con đường gian khổ" VBA, mình có hỏi câu TARGET là gì, thật sự mà nói, định nghĩa nó cũng vô vàn, nhưng chỉ biết "gài" nó vào vùng nào đó rồi xử lý nó thôi.

Mình cũng thấy rằng môi trường học tập tại đây thật độc đáo, có những người không phải là giáo viên, song, họ rất nhiệt tình hướng dẫn, chỉ bảo, trong tâm mình cũng coi những vị đó như ÂN SƯ như Sư phụ PTM0412, như Thầy ndu96081631, như Bác SA_DQ, ... họ thật sự là những người Thầy của mình.

Và mình cũng tự hào rằng, nhờ có môi trường GIẢI PHÁP EXCEL mà kỹ năng vận dụng hàm, công thức, kể cả VBA mình thật sự tiến bộ. Cám ơn diễn đàn và các thành viên rất nhiều!

(Sẳn dịp các bạn hỏi những kiến thức cơ bản làm gợi nhớ lại những ngày đầu, tự nhiên có cảm xúc, xin BQT đừng xem là Spam nhé! Cám ơn)
 
Lần chỉnh sửa cuối:
Upvote 0
Em hỏi hơi ngớ ngẩn 1 chút tại sao khi dùng địa chỉ tương đối không được mà địa chỉ tuyệt đối lại được, ví dụ em thay đổi Code của thày Ndu thì khi đánh giá trị mới hộp thoại Msgbox không chịu ra
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "D1" Then
    MsgBox Target.Address
  End If
End Sub
Thuộc tính Address còn có mấy tham số nữa đấy
Để dùng địa chỉ tương đối, sửa code thành:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address(0, 0) = "D1" Then
    MsgBox Target.Address
  End If
End Sub
 
Upvote 0
Nói thêm về chỗ này 1 chút:

Không biết Trung hiểu thế nào, câu kết luận thì đúng nhưng phát biểu này không đúng:

(vì 1 ô H1 không thể so sánh được với nhiều ô thay đổi).

Trong code bài #3 sinh ra lỗi Type Mismatch, và bài #5 tôi nói:

Khi xoá dòng 10:100, sự kiện chạy lần 2, Target.Address = $10$100, và Target.Value > 100 không tính được vì target là cả 1 range chứ không phải 1 cell, target.Value là 1 mảng các giá trị chứ không phải 1 giá trị, không so sánh với 1 giá trị đơn được. (Type MisMatch là chỗ này)

Lỗi sinh ra khi có sự thay đổi lần 2, và lần 3, vì khi đó Target (vùng xảy ra thay đổi) không phải là 1 ô, Target.Value trở thành 1 mảng giá trị. Lỗi Type Mismatch xảy ra vì ta cố so sánh 1 Mảng với 1 giá trị đơn là 100.

Có còn so sánh với H1 nữa đâu?
Không so sánh Target mới với H1, cũng không so sánh H1 với 100 gì cả.

Tìm lại gốc của lỗi: Nguyên do chính vì code chạy nhiều lần. Nên trong bài #5, tôi có nói muốn sửa lỗi triệt để phải khử Event bằng cặp lệnh:

Application.EnableEvents = False và
Application.EnableEvents = True

Khi xoá dòng 10:100 và khi copy Paste vào A10, có thay đổi, sự kiện có diễn ra, nhưng nhấp nhổm tìm code chạy thì đụng nhằm bảng cấm sự kiện. Khoẻ re: không chạy, không lỗi, lại còn lợi về tốc độ.
 
Upvote 0
Sau khi thày giảng xong thì tôi đã hiểu rồi ah, chỉ bởi trước quan niệm tôi hiểu nhầm là H1 thuộc Target (thời điểm đó chưa hiểu bản chất Target trong phương thức Worksheet_Change là những ô thay đổi).

Hôm nào được thày Mỹ gợi ý là hôm đó chắc chắn bản thân tôi tìm theo hướng thày chỉ bảo, học được rất nhiều kiến thức bổ ích.

Xin đa tạ thày rất nhiều.
 
Upvote 0
Sau khi thày giảng xong thì tôi đã hiểu rồi ah, chỉ bởi trước quan niệm tôi hiểu nhầm là H1 thuộc Target (thời điểm đó chưa hiểu bản chất Target trong phương thức Worksheet_Change là những ô thay đổi).

Hôm nào được thày Mỹ gợi ý là hôm đó chắc chắn bản thân tôi tìm theo hướng thày chỉ bảo, học được rất nhiều kiến thức bổ ích.

Xin đa tạ thày rất nhiều.

Nghe đồn trong 3 ngày lão chết tiệt đi Nha Trang, không được nghe mắng có người thấy nhớ nhớ thì phải?
http://www.giaiphapexcel.com/forum/...về-mảng-trong-VBA-(Array)&p=375855#post375855

Vậy thì mắng đây:

Giải thích ở bài #5, mãi bài #19 mới nói hiểu rồi hiểu rồi, mà lại vẫn phát biểu trật lất!
 
Lần chỉnh sửa cuối:
Upvote 0
Sự kiên change khi paste dữ liệu vào ô target công thức ko đổi đúng không các bác
 
Upvote 0
Web KT

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

Back
Top Bottom