Không cho chạy sự kiện Change??

Liên hệ QC

Mr Okebab

Ngon Ngất Ngây
Thành viên đã mất
Tham gia
6/8/06
Bài viết
3,260
Được thích
3,787
Mình có một File Excel.

Trong một số Sheet thì có dùng Combobox và có dùng các sự kiện
Sheet_Selection Change; ComboBox_Change.

Bình thường chương trình chạy ở chế độ Calculation = Manual thì không sao, nhưng mỗi khi thủ tục Sheet.Calculate hoặc Range.Caculate xảy ra là nó lại chạy lại các thủ tục change ở trên.

Mình đã thử dùng Application.EnableEvents = False nhưng không ăn thua, nó vẫn gọi lại thủ tục change đó.

Có cách nào nó không gọi các thủ tục change không ???
 
Combobox hiện ở trong userform phải không? Nếu nếu vậy cần tạo event riêng. Thí dụ:
Private fmEnableEvents As Boolean

Private Sub ComboBox1_Change()
On Error GoTo RestoreEvents
If fmEnableEvents Then
fmEnableEvents = False
’ làm những thao tác cần thiết
End If
RestoreEvents:
fmEnableEvents = True
End Sub
Còn khi mờ auto calc thì trong code cần cài 1 cái if test giống như sau:
Mã:
[FONT=Arial][SIZE=3]Sub EventsOff()[/SIZE][/FONT]
[FONT=Arial][SIZE=3]With Application[/SIZE][/FONT]
[FONT=Arial][SIZE=3]If .Calculation = xlAutomatic Then[/SIZE][/FONT]
[FONT=Arial][SIZE=3].EnableEvents = False[/SIZE][/FONT]
[FONT=Arial][SIZE=3]Activesheet.Calculate[/SIZE][/FONT]
[FONT=Arial][SIZE=3].EnableEvents = True[/SIZE][/FONT]
[FONT=Arial][SIZE=3]End If[/SIZE][/FONT]
[FONT=Arial][SIZE=3]End With[/SIZE][/FONT]
[FONT=Arial][SIZE=3]End Sub[/SIZE][/FONT]
Mến chào
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
digita đã viết:
Combobox hiện ở trong userform phải không? Nếu nếu vậy cần tạo event riêng. Thí dụ:

Còn khi mờ auto calc thì trong code cần cài 1 cái if test giống như sau:
Mã:
[FONT=Arial][SIZE=3]Sub EventsOff()[/SIZE][/FONT]
[FONT=Arial][SIZE=3]With Application[/SIZE][/FONT]
[FONT=Arial][SIZE=3]If .Calculation = xlAutomatic Then[/SIZE][/FONT]
[FONT=Arial][SIZE=3].EnableEvents = False[/SIZE][/FONT]
[FONT=Arial][SIZE=3]Activesheet.Calculate[/SIZE][/FONT]
[FONT=Arial][SIZE=3].EnableEvents = True[/SIZE][/FONT]
[FONT=Arial][SIZE=3]End If[/SIZE][/FONT]
[FONT=Arial][SIZE=3]End With[/SIZE][/FONT]
[FONT=Arial][SIZE=3]End Sub[/SIZE][/FONT]
Mến chào

Combobox của Sheet chứ không phải của Form.

Thân!
 
Upvote 0
Thấy Bác Hiếu cũng hay làm sao bác quên nhỉ, ngay trước khi Sheet.Calculate hoặc Range.Caculate xảy ra, bạn gán đại cho cell nào đó giá trị. Khi hết tính thì xóa đi.
Sự kiện change yêu cầu cell đó phải rỗng.
Không biết nói đại có đúng không.
 
Upvote 0
ThuNghi đã viết:
Thấy Bác Hiếu cũng hay làm sao bác quên nhỉ, ngay trước khi Sheet.Calculate hoặc Range.Caculate xảy ra, bạn gán đại cho cell nào đó giá trị. Khi hết tính thì xóa đi.
Sự kiện change yêu cầu cell đó phải rỗng.
Không biết nói đại có đúng không.

Thì cũng đang dùng cách đó (rỗng, chứa ký tự gì đó, Combobox đó có endable không ? . . .)
Khi chạy đến thủ tục Change thif xét ĐK, thấy ĐK không thỏa thì nó thoát.

Nhưng nếu có nhiều thủ tục change thì chẳng lẽ cứ để như thế à ?? Bực mình lắm. Vì vậy mới đề nghị xem có cách nào khác hay không thôi, hình như có cách nhưng mà mình chưa biết thôi.

Thân!
 
Upvote 0
Khi đã gán Application.EnableEvents = False rồi thì tất cả sự kiện Change của Sheet và Workbook đều không hoạt động. ComboBox không phải đối tượng nằm trong Application nên nó không chịu ảnh hưởng của Application.EnableEvents. Nếu muốn ComboBox_Change có ảnh hưởng của Application.EnableEvents thì phải dùng dòng lệnh đầu tiên trong thủ tục là
Mã:
Private Sub ComboBox1_Change()
    If Not Application.EnableEvents Then Exit Sub
    
    'Do...
End Sub

Nếu đã gán Application.EnableEvents = False mà các sự kiện của Sheet và Workbook vẫn chạy, chắc chắn một dòng lệnh ở đâu đó trong ComboBox (đối tượng của "Control Box") bạn gán Application.EnableEvents = True.

File để bạn test dưới đây.
 

File đính kèm

Upvote 0
Cảm ơn nhiều.

Để em kiểm tra lại xem sao.
 
Upvote 0
Web KT

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

Back
Top Bottom