Saya memiliki 5 kotak centang untuk mengatur beberapa opsi untuk makro, salah satunya adalah kotak centang Pilih/Batalkan Semua. Saya ingin membuat sesuatu yang mirip dengan apa yang ada di kotak surat berbasis web ketika Anda memilih email untuk dihapus atau ditandai sebagai sudah dibaca, dll. Ketika saya mencentang kotak centang Pilih/Batalkan Semua, saya mengubah nilai kotak centang lainnya menjadi benar dan sebaliknya ketika saya menghapus centangnya. Tidak apa-apa.
Masalahnya muncul ketika saya juga ingin memvalidasi bahwa jika semuanya tidak dicentang dan satu per satu saya mencentang kotak centang lainnya, jika pada akhirnya saya mencentang semua, maka kotak centang Select/Unselect All berubah menjadi centang. Begitu juga sebaliknya, artinya jika semuanya dicentang dan kemudian saya hapus centang salah satu dari empat yang lain, maka kotak centang "Semua" saya ubah menjadi false (tidak dicentang).
Tetapi tampaknya bahkan ketika saya hanya menetapkan nilai, misalnya Option1Checkbox.value = True, dalam event SelectAllCheckbox_Click, ini memicu event Option1Checkbox_Click dan Option1Checkbox_Change.
Bukankah seharusnya itu hanya memicu event Change karena saya tidak benar-benar mengklik kotak centang itu?
Yang terjadi adalah saya mencentang SelectAll, sehingga mengubah Option1 menjadi dicentang, tetapi dengan melakukan ini, Option1 juga memicu peristiwa klik sehingga menghapus centang yang memicu peristiwa klik lagi dan kemudian menghapus centang lagi pada kotak centang Semua yang pada akhirnya membuat semuanya tidak dicentang, seperti di awal. Semoga bagian ini cukup jelas.
Bagaimana saya bisa menghindari perilaku ini? Bagaimana cara memastikan hanya event Change yang dipicu dan bukan event Click?
Adakah yang pernah memiliki pengaturan kotak centang seperti itu dan mengalami masalah serupa? Atau bagaimana Anda bisa melakukan hal ini tanpa perilaku yang saya alami?
Kotak centang tidak berada pada formulir tetapi hanya pada lembar kerja. Mereka adalah kontrol ActiveX. Dan apa yang saya miliki tidak rumit:
Private Sub SelectAll_Click()
Option1Checkbox.Value = SelectAll.Value
Option2Checkbox.Value = SelectAll.Value
Option3Checkbox.Value = SelectAll.Value
Option4Checkbox.Value = SelectAll.Value
End Sub
Kemudian kotak centang opsi klik acara terlihat seperti ini:
Private Sub Option1Checkbox_Click()
If Option1Checkbox.Value = True And Option2Checkbox.Value = True And Option3Checkbox.Value = True And Option4Checkbox.Value = True Then
SelectAll.Value = True
Else
SelectAll.Value = False
End If
End Sub
Ini cukup sederhana, masalah terbesar yang saya lihat adalah pemanggilan ke peristiwa klik ketika kotak centang tidak benar-benar diklik.
Terima kasih atas bantuan Anda.
Saya akan mendefinisikan variabel lokal (yang didefinisikan di luar sub) dan mengatur/memeriksa bahwa
Option Explicit
Dim ImChangingStuff As Boolean
Private Sub SelectAll_Click()
ImChangingStuff = True
Option1Checkbox.Value = SelectAll.Value
Option2Checkbox.Value = SelectAll.Value
Option3Checkbox.Value = SelectAll.Value
Option4Checkbox.Value = SelectAll.Value
ImChangingStuff = False
End Sub
maka rutinitas klik Anda akan terlihat seperti ini:
Private Sub Option1Checkbox_Click()
If ImChangingStuff Then Exit Sub
If Option1Checkbox.Value = True And Option2Checkbox.Value = True And Option3Checkbox.Value = True And Option4Checkbox.Value = True Then
SelectAll.Value = True
Else
SelectAll.Value = False
End If
End Sub
Untuk mengatasi masalah ini,
Di formulir pengguna utama Anda (dalam contoh ini disebut Mainform) tambahkan kode ini:
Private Sub Mainform_Inisialisasi() stateCheckbox = True End Sub
Buat sebuah modul untuk menyimpan variabel global Anda (mis. globalVariables
), dan tambahkan yang berikut ini, yang akan menyimpan status kotak centang:
Public stateCheckbox sebagai Boolean
Pada event _click pada kotak centang Anda, bungkus kode Anda seperti ini:
if stateCheckbox = false then { apa pun kode Anda } Jika tidak: stateCheckbox = false end if
Saya akan menulis sub pengecekan jika Option1 hingga Option4 semuanya dicentang dalam pernyataan If. Dalam pernyataan if kedua, saya akan memeriksa apakah semuanya salah:
Sub Are_O1_to_O4_All_Checked ()
If Option1Checkbox.Value = True And _
Option2Checkbox.Value = True And _
Option3Checkbox.Value = True And _
Option4Checkbox.Value = True Then
Option5Checkbox.Value = True ' select/unselect checkbox
End If
If Option1Checkbox.Value = False And _
Option2Checkbox.Value = False And _
Option3Checkbox.Value = False And _
Option4Checkbox.Value = False Then
Option5Checkbox.Value = False ' select/unselect checkbox
End If
Akhir Sub
Kemudian saya akan memanggil sub ini di akhir setiap event OnClick untuk kotak centang.