Cara Menghilangkan & Menonaktifkan Tombol Close (X) UserForm VBA Excel
Kunci integritas data aplikasi Excel: Panduan mendisabel dan menyembunyikan tombol Close (X) UserForm dengan Windows API 32-bit & 64-bit.
Saat kita membangun sistem aplikasi berbasis VBA Excel (Macro) menggunakan antarmuka UserForm, salah satu masalah klasik yang sering membuat developer pusing adalah perilaku pengguna yang asal menekan tombol Close (X) di pojok kanan atas form.
Tindakan menutup form secara paksa ini sering kali memicu dampak fatal pada aplikasi:
- Data Korup / Hilang: Inputan yang belum sempat tereksekusi oleh perintah simpan menjadi tidak tersimpan.
- Variabel Global Terputus: Variabel memori sistem terhenti di tengah alur proses.
- Sistem Validasi Jebol: Pengguna dapat melompati form autentikasi (seperti form Login atau alur transaksi wajib).
Solusi paling elegan untuk mengatasi masalah ini adalah menghilangkan atau menonaktifkan tombol Close (X) bawaan UserForm tersebut dan menggantinya dengan tombol kontrol (CommandButton) yang kita desain secara khusus!
Mari kita bedah tuntas skrip "Keris Sakti" Windows API yang kompatibel penuh untuk Excel 32-bit maupun 64-bit berikut ini.
Mengapa Harus Menggunakan Windows API (User32 Lib)?
Sifat bawaan (default) dari jendela UserForm di VBA Excel tidak menyediakan opsi properti bawaan untuk menyembunyikan tombol X. Oleh karena itu, kita perlu memanggil fungsi sistem operasi Windows melalui Windows API (user32.dll).
Dengan teknik ini, kita meminta sistem operasi Windows untuk memodifikasi gaya jendela (Window Style) dan menu sistem (System Menu) milik UserForm yang sedang aktif di layar.
Formulasi Kode VBA Excel (Modul Standar)
Buat sebuah Module baru di VBA Editor (Insert > Module), lalu salin skrip "Keris Sakti" di bawah ini:
Option Explicit
' ====================================================================
' ⚔️ DOKUMEN KODE "KERIS SAKTI" WIN32/WIN64 API FOR USERFORM EXCEL
' Memodifikasi Header & Tombol Sistem UserForm (Compatible 32-bit & 64-bit)
' ====================================================================
Private Const GWL_STYLE = -16
Private Const WS_CAPTION = &HC00000
Private Const WS_SYSMENU = &H80000
Private Const SC_CLOSE = &HF060
#If VBA7 Then
' 🚀 DEKLARASI UNTUK ARSITEKTUR MODERN (VBA7 / 64-Bit)
Private Declare PtrSafe Function GetWindowLong _
Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function DrawMenuBar _
Lib "user32" (ByVal hWnd As Long) As Long
Private Declare PtrSafe Function FindWindowA _
Lib "user32" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function DeleteMenu _
Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetSystemMenu _
Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
#Else
' 🏛️ DEKLARASI UNTUK EXCEL LEGACY (32-Bit)
Private Declare Function GetWindowLong _
Lib "user32" Alias "GetWindowLongA" ( _
ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar _
Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindowA _
Lib "user32" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function DeleteMenu _
Lib "user32" (ByVal hMenu As Long, _
ByVal nPosition As Long, ByVal wFlags As Long) As Long
Public Declare Function GetSystemMenu _
Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
#End If
' --------------------------------------------------------------------
' 1. MENGATUR KEBERADAAN IKON SISTEM & TOMBOL CLOSE PADA BARIS JUDUL
' --------------------------------------------------------------------
Public Sub SystemButtonSettings(frm As Object, show As Boolean)
Dim windowStyle As Long
Dim windowHandle As Long
windowHandle = FindWindowA(vbNullString, frm.Caption)
windowStyle = GetWindowLong(windowHandle, GWL_STYLE)
If show = False Then
SetWindowLong windowHandle, GWL_STYLE, (windowStyle And Not WS_SYSMENU)
Else
SetWindowLong windowHandle, GWL_STYLE, (windowStyle + WS_SYSMENU)
End If
DrawMenuBar (windowHandle)
End Sub
' --------------------------------------------------------------------
' 2. MENDISABEL / MENGHILANGKAN FUNGSI TOMBOL CLOSE (X) SPESIFIK
' --------------------------------------------------------------------
Public Sub CloseButtonSettings(frm As Object, show As Boolean)
Dim windowHandle As Long
Dim menuHandle As Long
windowHandle = FindWindowA(vbNullString, frm.Caption)
If show = True Then
menuHandle = GetSystemMenu(windowHandle, 1)
Else
menuHandle = GetSystemMenu(windowHandle, 0)
DeleteMenu menuHandle, SC_CLOSE, 0&
End If
End Sub
Cara Pemanggilan Kode pada UserForm
Setelah modul di atas siap, Anda tinggal memanggil fungsi tersebut di dalam jendela kode UserForm (misalnya pada UserForm1).
Klik ganda pada UserForm dan masukkan skrip pemanggil saat form baru diinisialisasi (UserForm_Initialize):
Private Sub UserForm_Initialize()
' 🚫 Matikan fungsi tombol Close (X) bawaan (Tombol tampak redup/disabled)
Call CloseButtonSettings(Me, False)
End Sub
Atau jika Anda ingin menyembunyikan seluruh baris tombol kontrol di bagian header:
Private Sub UserForm_Initialize()
' 🚫 Sembunyikan seluruh ikon sistem dan tombol kontrol di header
Call SystemButtonSettings(Me, False)
End Sub
Penjelasan Kompatibilitas #If VBA7 (Aman di Semua Versi)
Penggunaan pengondisian direktif kompilasi #If VBA7 adalah kunci utama agar aplikasi Excel Anda tidak mengalami crash atau error compile saat dibuka di berbagai versi Microsoft Office (32-bit maupun 64-bit):
1. Keyword PtrSafe
Kata kunci wajib pada arsitektur 64-bit yang memastikan deklarasi fungsi Win32 API aman dijalankan oleh memori pointer Microsoft Office modern tanpa memicu bentrok sistem.
2. FindWindowA & GetSystemMenu
Fungsi API untuk melacak ID unik (Handle / hWnd) jendela UserForm berdasarkan teks judulnya (Caption), lalu mengambil akses ke menu sistem Windows yang menaungi form tersebut.
3. DeleteMenu & SC_CLOSE
Perintah untuk mengeksekusi penghapusan fungsi tombol SC_CLOSE secara spesifik, sehingga tombol X di pojok kanan atas terbukti terkunci saat diklik pengguna.
Tabel Ringkasan Prosedur Keris Sakti VBA
Berikut adalah perbandingan hasil visual dan efek kerja dari kedua prosedur dalam modul:
| Nama Prosedur Sub | Parameter Input 🛠️ | Hasil Visual & Efek Sistem 🎯 |
|---|---|---|
| SystemButtonSettings | (Me, False) |
Menghilangkan seluruh ikon sistem dan baris tombol kontrol di header. |
| CloseButtonSettings | (Me, False) |
Tombol X tetap tampak namun mati/terkunci (Disabled). |
Kesimpulan
Menggunakan modul API Windows di VBA Excel memberikan kita kendali penuh atas antarmuka aplikasi. Dengan mengunci tombol Close (X), aplikasi buatan Anda tidak hanya tampil jauh lebih rapi dan eksklusif, namun juga menjamin integritas alur simpan data dari kesalahan tindakan pengguna!
Selamat mencoba trik "Keris Sakti" VBA ini pada proyek macro Excel Anda!
💬 Suka dengan trik koding VBA Excel seperti ini? Bagikan artikel ini ke komunitas developer dan jangan lupa tinggalkan tanggapan Anda di kolom komentar di bawah!
Posting Komentar untuk "Cara Menghilangkan & Menonaktifkan Tombol Close (X) UserForm VBA Excel"
Tinggalkan Komentar Anda Disini: