Sự cố khi dùng sự kiện WorkSheet_Change

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Điểm
0
Tuổi
57
Nơi ở
Biên Hòa, Đồng Nai
Giã sử tôi dùng sự kiện WorkSheet_Change đễ làm cùng 1 lúc 2 việc sau đây:
Việc 1: Khi gõ vào cell A1 số từ 1 đến 4 thì sẽ tự động chuyễn A1 thành A, B, C, D tương ứng
Việc 2: Sau khi đã sữa số thành chử xong, copy A1 đến dòng cuối cùng có dử liệu cũa 1 sheet khác
Vậy code sẽ làm việc như sau:
1> Khi gõ số xong, sheet nhận biết đây là sự kiện Change nên nó sẽ tự động đổi số thành chử và làm công việc thứ 2
2> Quá trình đổi số thành chử cũng dc xem là sự kiện Change (có thay đổi ở A1) nên code lại làm tiếp công việc 2 lần nữa, tức là khi ấy sheet bên kia sẽ nhận dc cùng lúc 2 dòng dử liệu
Xin hỏi làm sao tránh tình trạng này? Tức là chỉ copy 1 lần duy nhất
Mến
ANH TUẤN
 
anhtuan1066 đã viết:
Giã sử tôi dùng sự kiện WorkSheet_Change đễ làm cùng 1 lúc 2 việc sau đây:
Việc 1: Khi gõ vào cell A1 số từ 1 đến 4 thì sẽ tự động chuyễn A1 thành A, B, C, D tương ứng
Việc 2: Sau khi đã sữa số thành chử xong, copy A1 đến dòng cuối cùng có dử liệu cũa 1 sheet khác
Vậy code sẽ làm việc như sau:
1> Khi gõ số xong, sheet nhận biết đây là sự kiện Change nên nó sẽ tự động đổi số thành chử và làm công việc thứ 2
2> Quá trình đổi số thành chử cũng dc xem là sự kiện Change (có thay đổi ở A1) nên code lại làm tiếp công việc 2 lần nữa, tức là khi ấy sheet bên kia sẽ nhận dc cùng lúc 2 dòng dử liệu
Xin hỏi làm sao tránh tình trạng này? Tức là chỉ copy 1 lần duy nhất
Mến
ANH TUẤN
Em hiểu việc này như sau :
  1. Cell change là :A1
  2. Giá trị để chạy code là : 1;2;3;4
  3. Biến các giá trị này thành các ký tự tương ứng : A; B; C; D
  4. Copy các Ký tự này sang Sheet2.
Cái dòng chữ màu hồng là người làm hay máy tự động làm hả bác ????

Còn để không chạy chức năng Worksheet_Change thì :
  1. Dựa vào Application.EnableEvents
  2. Dựa vào vị trí Cell Change
  3. Dựa vào Giá trị Cell Change
  4. Dựa vào giá trị, thuộc tính của một Obj khác
  5. . . . . . .
Thân!


P/S : Chú ý về chính tả!
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
Giã sử tôi dùng sự kiện WorkSheet_Change đễ làm cùng 1 lúc 2 việc sau đây:
Việc 1: Khi gõ vào cell A1 số từ 1 đến 4 thì sẽ tự động chuyễn A1 thành A, B, C, D tương ứng
Việc 2: Sau khi đã sữa số thành chử xong, copy A1 đến dòng cuối cùng có dử liệu cũa 1 sheet khác
Vậy code sẽ làm việc như sau:
1> Khi gõ số xong, sheet nhận biết đây là sự kiện Change nên nó sẽ tự động đổi số thành chử và làm công việc thứ 2
2> Quá trình đổi số thành chử cũng dc xem là sự kiện Change (có thay đổi ở A1) nên code lại làm tiếp công việc 2 lần nữa, tức là khi ấy sheet bên kia sẽ nhận dc cùng lúc 2 dòng dử liệu
Xin hỏi làm sao tránh tình trạng này? Tức là chỉ copy 1 lần duy nhất
Mến
ANH TUẤN
+ Sử dụng Application.EnableEvents thì khi nhận dạng sự kiện thay đổi gõ số thì anh tắt sự kiện đi , sau khi đổi số thành chữ... và thực hiện copy lun xong hoàn toàn -> mới bật lại sự kiện

+ Cụ thể như sau:
PHP:
Application.EnableEvents = False

<..đổi số thành chữ.....>
<..copy chữ sang dòng cuối sheet khác .....>

Application.EnableEvents = true
chắc a hiểu ý rồi ...
 
Lần chỉnh sửa cuối:
Upvote 0
OK... vậy là phát hiện ra cách làm chính thống... Từ nãy giờ tôi đang làm theo cách sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   Application.ScreenUpdating = False
   If Not Intersect(Target, Range("A1")) Is Nothing Then
       Làm công việc 1
       k = k + 1
  End If
  If k = 1 Then
     Làm công việc 2
  End If
End Sub
Nhìn lại thấy hơi buồn cười dù là nó có thể giãi quyết vấn đề
Cảm ơn các bạn về Application.EnableEvents
ANH TUẤN
 
Upvote 0
Có rất nhiều cách để giải quyết, đây là 2 cách đơn giản :

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
''CACH 1'''''''''''''''''''''''''''''''''''''''''''''''''''''
    If Target.Address = "$A$1" Then
        Select Case Target.Value
        Case 1
            Target.Value = "A"
        Case 2
            Target.Value = "B"
        Case 3
            Target.Value = "C"
        Case 4
            Target.Value = "D"
        Case "A", "B", "C", "D"
            S002.Range("A1").Value = Target.Value
        End Select
    End If
''CACH 2'''''''''''''''''''''''''''''''''''''''''''''''''''''
    If Target.Address = "$A$1" Then
        Select Case Target.Value
        Case 1
            Application.EnableEvents = False
            Target.Value = "A"
            GoTo thoat
        Case 2
            Application.EnableEvents = False
            Target.Value = "B"
            GoTo thoat
        Case 3
            Application.EnableEvents = False
            Target.Value = "C"
            GoTo thoat
        Case 4
            Application.EnableEvents = False
            Target.Value = "D"
            GoTo thoat
        End Select
    End If
    Exit Sub
thoat:
    S002.Range("A1").Value = Target.Value
    Application.EnableEvents = True
End Sub
Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Sẳn đây cho hỏi: Tại sao phải dùng Goto mà ko là Call? Theo cách hiểu của tôi thì khi gặp điều kiện sẽ Goto đễ ko phải làm tiếp những việc còn lại.. nhưng ở đây mỗi lần ta chỉ nhập dc 1 số cơ mà, nên đàng nào Call hay Goto cũng vậy thôi...
Đó là theo cách hiểu cũa tôi... Mong các cao thủ chỉ thêm...
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Sẳn đây cho hỏi: Tại sao phải dùng Goto mà ko là Call? Theo cách hiểu của tôi thì khi gặp điều kiện sẽ Goto đễ ko phải làm tiếp những việc còn lại.. nhưng ở đây mỗi lần ta chỉ nhập dc 1 số cơ mà, nên đàng nào Call hay Goto cũng vậy thôi...
Đó là theo cách hiểu cũa tôi... Mong các cao thủ chỉ thêm...
ANH TUẤN
Theo như em biết : Thường thì :
- Call : Để gọi ra một thủ tục khác không nằm trong thủ tục hiện tại
- Go to : Để nhảy đến một vị trí khác nằm trong thủ tục hiện tại

Thân!

P/S : Bác có thể thử xem sao!
 
Upvote 0
Có rất nhiều cách để giải quyết, đây là 2 cách đơn giản :

Oh, Mr. Okebab hồi này phức tạp vấn đế lên nhỉ, ko tin tưởng vào mã lệnh nữa hay sao nhỉ,

+ Trong đoạn trên đâu cần Goto Thoat đâu, vì khi đã thỏa mãn 1 Case nào đó thì tự động mã lệnh điều hướng đến thực hiện - sau đó thực hiện xong thì thoát khỏi "select case" lun, nên k phải lo về tốc độ

+ Và Application.EnableEvents = False đặt ra ngoài viết 1 lần thôi

+ Cuối cùng là , hãy đơn giản như bản thân lệnh đã có
.


.
 
Upvote 0
tigertiger đã viết:
Oh, Mr. Okebab hồi này phức tạp vấn đế lên nhỉ, ko tin tưởng vào mã lệnh nữa hay sao nhỉ,

+ Trong đoạn trên đâu cần Goto Thoat đâu, vì khi đã thỏa mãn 1 Case nào đó thì tự động mã lệnh điều hướng đến thực hiện - sau đó thực hiện xong thì thoát khỏi "select case" lun, nên k phải lo về tốc độ
Có Goto Thoat vì bên dưới còn Exit Sub nữa

+ Và Application.EnableEvents = False đặt ra ngoài viết 1 lần thôi
Viết 1 lần cũng được, nhưng ý của em là : Điều này chỉ xảy ra khi A1 = 1;2;3;4 thôi. Mà em lại ngại thêm 1 if nữa

+ Cuối cùng là , hãy đơn giản như bản thân lệnh đã có
Cũng muốn thế nhưng suy nghĩ có hạn bác ạ. Hic híc
.


.

Vâng, có lẽ bác đúng. Vậy nhờ bác viết lại luôn cho gọn ạ. Dĩ nhiên TH = 1;2;3;4 chỉ là giả định (Vì nếu không giả định thì em đã dùng CHOOSE)
Cảm ơn bác.

Thân!
 
Upvote 0
Nguyên văn bởi Mr Okebab
Có rất nhiều cách để giải quyết, đây là 2 cách đơn giản
Mã:
'CACH 1
    [B]Application.EnableEvents = False[/B] ' Khong Co Cung Duoc
    If Target.Address = "$A$1" Then
        Select Case Target.Value
        Case 1
            Target.Value = "A"
        Case 2
            Target.Value = "B"
        Case 3
            Target.Value = "C"
        Case 4
            Target.Value = "D"
        Case "A", "B", "C", "D"
            S002.Range("A1").Value = Target.Value
        End Select
    End If
    Application.EnableEvents = True ' Khong Co Cung Duoc
Case "A", "B", "C", "D" cần code chạy lần 2 mới duyệt qua. Thế nên dùng Application.EnableEvents = False, dòng lệnh S002.Range("A1").Value = Target.Value sẽ không được thực hiện. Các bạn xem lại thử.
 
Upvote 0
Oh... mấu chốt vấn đề là Application.EnableEvents đã dc các bạn trợ giúp.. và tôi cũng chỉ cần có thế là đũ... Còn việc lấp ghép code như thế nào? Chạy dc hay ko và trục trặc ra sao có lẽ chúng ta sẽ bàn sau nhỉ? (khi nào tôi bị bí)... Hi... hi...
Cãm ơn tất cã các bạn!
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Oh... mấu chốt vấn đề là Application.EnableEvents đã dc các bạn trợ giúp.. và tôi cũng chỉ cần có thế là đũ... Còn việc lấp ghép code như thế nào? Chạy dc hay ko và trục trặc ra sao có lẽ chúng ta sẽ bàn sau nhỉ? (khi nào tôi bị bí)... Hi... hi...
Cãm ơn tất cã các bạn!
ANH TUẤN
+ Đúng là quan trọng sự kiện đó thôi

+ Tắt sự kiện đó rồi, a cứ vô tư đặt lệnh ... sau đó lại bật nó lên hi iiiiiiiiii

+ và Sự kiện quan trọng nữa là Application.Volatile -chắc a đã biết
.
xin trích một đoạn sưu tầm internet về sự kiện này
From Internet đã viết:
If you develop a User Defined Function (UDF) you may need to make it Volatile (Application.Volatile(True)) to make it recalculate BUT:
  • Application.Volatile makes your function ALWAYS recalculate each time Excel calculates, which can slow down calculation.
  • Application.Volatile does not directly affect Calculation Sequence.
  • If your UDF refers to cells that are not included in the function’s argument list and (if the function is calculated) those cells have not yet been calculated, then Excel will reschedule the UDF to be recalculated again later. Note that uncalculated cells do not stop your UDF from calculating, they just make it calculate more than once. This will mostly give you the correct answer
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh chị,
Em rất cảm ơn về cac bài viết của anh chị. Em đọc và tiếp thu được nhiều điều. Em đang gặp khó chỗ này mong các anh chị giúp đỡ:
+ Em đã tạo một macro đơn giản là điền số 3 và ô A3 và macro này tên là "dat"
+ Bây giờ em muốn khi em thay đổi dữ liệu trong A1 thì sẽ chạy macro tên "dat" tức là điền số 3 và ô A3
Cảm ơn, và rất mong được sự giúp đỡ của các anh chị.
 
Upvote 0
Chào các anh chị,
Em rất cảm ơn về cac bài viết của anh chị. Em đọc và tiếp thu được nhiều điều. Em đang gặp khó chỗ này mong các anh chị giúp đỡ:
+ Em đã tạo một macro đơn giản là điền số 3 và ô A3 và macro này tên là "dat"
+ Bây giờ em muốn khi em thay đổi dữ liệu trong A1 thì sẽ chạy macro tên "dat" tức là điền số 3 và ô A3
Cảm ơn, và rất mong được sự giúp đỡ của các anh chị.
Yêu cầu này hơi... lạ đây
???
Vì bất cứ lúc nào và thay đổi bất cứ cái gì tại A1 thì cũng đều điền số 3 vào A3 sao? Thế thôi khỏi code, ta tự tay điền số 3 vào A3 cho rồi
Bạn nghĩ sao?
 
Upvote 0
Web KT
Back
Top