Dikategorikan | excel makro dan VBA

VBA Message Box (MsgBox) - Pesan The Can Do Better




Kotak Pesan VBA (MsgBox) membantu menyampaikan pesan pra-didefinisikan pengguna. Pengembang sering menggunakan kotak pesan untuk barang-barang mulai dari debugging VBA (msgbox "Saya di sini" jenis) untuk mendorong pengguna untuk tindakan (MsgBox ("Maaf, apa yang Anda minta tidak dapat dilakukan", vbAbortRetryIgnore)). Sementara itu tetap menjadi salah satu perintah yang paling berguna dan sering digunakan dalam VBA, juga umum untuk menemukan pengembang terjebak dengan bentuk paling primitif dari kotak pesan dan kehilangan keluar pada kesempatan untuk menyesuaikannya. Pada artikel ini kita akan melihat bagaimana Anda dapat meningkatkan kotak pesan VBA dan membuatnya lebih efektif.

Bentuk dasar dari Message Box (MsgBox) di VBA

1
2
3
Sub basic_messagebox ()
MsgBox "Hi there"
End Sub

simple-msgbox Waktu dihormati dan diuji, ini adalah bentuk dasar dari kotak pesan. Formulir ini adalah sesuatu yang siapa saja yang telah menulis lebih dari 5 baris kode VBA akrab dengan. Kotak pesan ini hanya menunjukkan sebuah pesan sederhana kepada pengguna. Yang harus Anda lakukan membuat pekerjaan ini adalah untuk menentukan pesan pada akhir perintah MsgBox dalam kode VBA Anda. Namun, ada banyak cara di mana kotak pesan sederhana ini dapat disesuaikan.

Menyesuaikan VBA Message Box

Mari kita menjelajahi beberapa cara di mana kita dapat menyesuaikan kotak pesan. Sebelum kita melangkah lebih jauh, mari kita memeriksa sintaks lengkap dari kotak pesan:

Mengembalikan nilai = MsgBox (Prompt, Button dan Icon jenis, Judul, Bantuan File Bantuan Berkas Konteks)

Dimana:
Kembali Nilai - Menunjukkan tindakan pengguna mengambil ketika kotak pesan ditunjukkan kepadanya / nya.
Prompt - Ini adalah pesan yang terkandung dalam tubuh utama dari kotak pesan.
Button dan Icon Jenis - ini menentukan set tombol & Ikon dan penempatan mereka karena mereka akan muncul kepada pengguna.
Bantuan File - Ini adalah path ke file bantuan yang pengguna dapat merujuk pada topik ini.
File Bantuan Konteks - ini adalah pointer ke bagian file bantuan yang specificially berhubungan dengan pesan ini.

Mari kita mengambil contoh yang akan memberikan kejelasan yang lebih besar.

1
2
3
Sub basic_messagebox ()
i = MsgBox ("Apakah Anda ingin dihentikan?", vbAbortRetryIgnore, "Salam Earthlings", "test.hlp", 100)
End Sub

Output dari bagian atas kode akan menjadi seperti ini:
cutomize-message-box-msgbox-vba

Mari kita masing-masing bagian dari kotak pesan dan melihat bagaimana kita dapat menyesuaikannya.

Bagaimana untuk menyesuaikan tombol di kotak pesan VBA

Daripada menunjukkan pengguna yang vanila plain "Ok" tombol, Anda dapat melengkapi kotak pesan Anda dengan tombol yang membuat pengguna merasa bahwa ia / dia membuat pilihan cerdas.

vba-msgbox-yesno-okonly

Contoh di atas melebih-lebihkan tapi hanya sedikit begitu. Itu semua umum untuk menemukan pengembang meninggalkan OK hanya pilihan bagi pengguna yang tidak curiga untuk mengklik. Sejak VBA menyediakan kemampuan untuk menangkap nilai kembali (pilihan yang dibuat oleh pengguna), tidak ada alasan mengapa setiap pengembang yang wajar tidak ingin menangkap masukan itu dan memberikan pengguna dengan kontrol lebih besar atas bagaimana program merespon.

Berikut adalah daftar dari berbagai tombol dan ikon yang dapat Anda gunakan di kotak pesan VBA.

vba-message-box-msgbox-list

Anda bahkan dapat menggabungkan dua atau lebih tombol (dan ikon) dengan hanya menggunakan simbol +. Dalam contoh yang diberikan di bawah ini, kami menggabungkan tombol ok dengan ikon kritis dan menunjukkan kombinasi kepada pengguna. (Selain itu, Anda juga dapat menentukan tombol yang harus memiliki fokus default dengan menggunakan opsi vbDefaultButton dari grafik di atas)

1
2
3
Sub basic_messagebox ()
i = MsgBox ("Hi there", vbOKOnly + vbCritical)
End Sub

Menangkap tindakan pengguna dari kotak pesan VBA

Seperti yang ditekankan dalam bagian di atas, kotak pesan menyediakan kemampuan untuk menangkap tindakan pengguna dan mengambil tindakan lebih lanjut berdasarkan umpan balik itu. Anda dapat menyimpan output dari kotak pesan VBA dalam variabel dan kemudian mengambil tindakan yang sesuai berdasarkan pilihan pengguna. Berikut adalah daftar nilai-nilai kembali terkait dengan pengguna mengklik berbagai tombol di kotak pesan.

vba-message-box-msgbox-return-type-values

Memasukkan beberapa baris di kotak pesan VBA

Misalkan Anda memiliki pesan yang panjang bahwa Anda ingin menunjukkan dalam beberapa baris. Karena pesan diapit dalam tanda kutip biasanya string, Anda dapat menggunakan karakter baris baru VBA (vbCrLf) untuk memisahkan berbagai bagian pesan panjang menjadi beberapa baris. Berikut adalah kode:

1
2
3
Sub basic_messagebox ()
the second line" MsgBox "Ini adalah baris pertama" & vbCrLf & "Ini adalah baris kedua"
End Sub

Dan ini adalah bagaimana itu akan muncul kepada pengguna:
vba-msgbox-in-multiple-lines

Memasukkan karakter khusus dalam kotak pesan VBA

Sering kali, saat bekerja dengan bahasa lain, Anda mungkin ingin memasukkan karakter luar 26 karakter bahasa Inggris. Dalam kasus tersebut, Anda dapat menggunakan fungsi arang VBA (chr) untuk memasukkan karakter khusus.

1
2
3
Sub basic_messagebox ()
MsgBox Chr (200) & "Cuaca indah, cantik" & Chr (244) & "l"
End Sub

Dalam contoh di atas, kita telah menggunakan dua karakter khusus untuk membuat sebuah string yang memiliki huruf non-Inggris.
special-character-in-vba-msgbox


Excel Formula, Excel Chart, Excel Macro, Excel VBA, Pivot Table Excel, Excel Dashboard

Apa yang Anda Pikirkan?


XHTML: Anda dapat menggunakan tag ini: <a href <abbr title=""> <acronym title=""> <blockquote <b> cite=""> <cite> <code> < del datetime = ""> <em> <i> <q cite=""> <strike> <strong>


Komentar dan Trackbacks

  1. JP wrote:

    Aku dikemas fungsi MsgBox, aku menyukainya lebih baik daripada memiliki MsgBox panggilan mengotori kode saya. Saya memasang contoh di blog saya baru-baru ini.

  2. Jon Peltier wrote:

    Anda harus menunjukkan bagaimana untuk mendapatkan respon pengguna:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    VbMsgBoxResult Respon Dim As VbMsgBoxResult
    Response = MsgBox ("Apakah Anda ingin dihentikan?", VbYesNo + vbQuestion)

    Pilih Kasus Response
    VbYes Kasus
    'Mengakhiri
    Kasus vbNo
    'Tidak menghentikan
    End Select
  3. Ajay wrote:

    Jon,
    Terima kasih untuk menyediakan implementasi.

    JP,
    Mengambil isyarat dari apa yang dikatakan Jon, jika dalam kode di bawah ini disebutkan, fungsi panggilan untuk "MessageBox" itu harus diganti dengan standar VBA MsgBox, harus memberikan hasil yang sama.

    [

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub testme1 ()
    Hasil Dim As Integer
    result = MessageBox ("hello", vbInformation + vbYesNo, "Judul saya")
    Pilih hasil Kasus
    Kasus 1, 4, 5, 6
    MessageBox ("Anda ingin melanjutkan!")
    Kasus 2, 3, 7
    MessageBox ("Anda ingin berhenti")
    End Select
    End Sub

    ... Bekerja cukup banyak yang sama seperti ...

    [

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub testme2 ()
    Hasil Dim As Integer
    Hasil = MsgBox ("hello", vbInformation + vbYesNo, "Judul saya")
    Pilih hasil Kasus
    Kasus 1, 4, 5, 6
    MsgBox ("Anda ingin melanjutkan!")
    Kasus 2, 3, 7
    MsgBox ("Anda ingin berhenti")
    End Select
    End Sub

    Maafkan aku yang naif, aku merindukan sesuatu di sepanjang jalan?

  4. Chris menulis:

    Pembelian saya lakukan akan eirntely didasarkan pada artikel ini.

  5. Sharon menulis:

    Informasi yang sangat membantu. Dapatkah Anda mengubah warna dari kotak pesan?

  6. Ricco DeCicco menulis:

    "Saya menemukan di bawah kode yang memungkinkan tombol kustom teks menjadi
    'Ditampilkan ke kotak pesan standar.
    "Tempelkan ini ke modul baru di VBA
    '--------
    Option Explicit

    Private Const MB_YESNOCANCEL = & H3 &
    Private Const MB_YESNO = & H4 &
    Private Const MB_RETRYCANCEL = & H5 &
    Private Const MB_OKCANCEL = & H1 &
    Private Const MB_OK = & H0 &
    Private Const MB_ABORTRETRYIGNORE = & H2 &
    Private Const MB_ICONEXCLAMATION = & H30 &
    Private Const MB_ICONQUESTION = & H20 &
    Private Const MB_ICONASTERISK = & H40 &
    Private Const MB_ICONINFORMATION = MB_ICONASTERISK
    Private Const IDOK = 1
    Private Const IDCANCEL = 2
    Private Const IDABORT = 3
    Private Const IDRETRY = 4
    Private Const IDIGNORE = 5
    Private Const IDYES = 6
    Private Const IDNO = 7
    Private Const IDPROMPT = & HFFFF &
    Private Const WH_CBT = 5
    Private Const GWL_HINSTANCE = (-6)
    Private Const HCBT_ACTIVATE = 5
    Pribadi Tipe MSGBOX_HOOK_PARAMS
    hwndOwner As Long
    hHook As Long
    End Type
    Swasta MSGHOOK Sebagai MSGBOX_HOOK_PARAMS
    Private Declare Function GetCurrentThreadID Lib "kernel32" () As Long
    Declare Function Public GetDesktopWindow Lib "user32" () As Long
    Private Declare Function GetWindowLong Lib "user32" Alias ​​_
    "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function MessageBox Lib "user32" Alias ​​_
    "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, _
    ByVal lpCaption As String, ByVal wType As Long) As Long
    Private Declare Function SetDlgItemText Lib "user32" Alias ​​_
    "SetDlgItemTextA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, _
    ByVal lpString As String) As Long
    Private Declare Function SetWindowsHookEx Lib "user32" Alias ​​_
    "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
    ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function SetWindowText Lib "user32" Alias ​​_
    "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
    MbFlags Dim As VbMsgBoxStyle
    Dim mbFlags2 Sebagai VbMsgBoxStyle
    Dim mTitle As String
    Dim mPrompt As String
    Dim But1 As String
    Dim But2 As String
    Dim But3 As String
    Public Function MessageBoxH (hwndThreadOwner As Long, _
    hwndOwner As Long, mbFlags As VbMsgBoxStyle) As Long
    'Fungsi ini panggilan hook
    Dim hInstance As Long
    Dim hThreadId As Long
    hInstance = GetWindowLong (hwndThreadOwner, GWL_HINSTANCE)
    hThreadId = GetCurrentThreadID ()
    Dengan MSGHOOK
    . HwndOwner = hwndOwner
    . HHook = SetWindowsHookEx (WH_CBT, AddressOf MsgBoxHookProc, _
    hInstance, hThreadId)
    End Dengan
    MessageBoxH = MessageBox (hwndOwner, Angkasa $ (120), Ruang $ (120), mbFlags)
    End Function
    Public Function MsgBoxHookProc (ByVal uMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    'Fungsi ini menangkap messagebox sebelum membuka
    'Dan mengubah teks tombol - kemudian menghapus hook
    Jika uMsg = HCBT_ACTIVATE Lalu
    SetWindowText wParam, mTitle
    SetDlgItemText wParam, IDPROMPT, mPrompt
    Pilih mbFlags Case
    Kasus vbAbortRetryIgnore
    SetDlgItemText wParam, IDABORT, But1
    SetDlgItemText wParam, IDRETRY, But2
    SetDlgItemText wParam, IDIGNORE, But3
    Kasus vbYesNoCancel
    SetDlgItemText wParam, IDYES, But1
    SetDlgItemText wParam, IDNO, But2
    SetDlgItemText wParam, IDCANCEL, But3
    Kasus vbOKOnly
    SetDlgItemText wParam, IDOK, But1
    Kasus vbRetryCancel
    SetDlgItemText wParam, IDRETRY, But1
    SetDlgItemText wParam, IDCANCEL, But2
    Kasus vbYesNo
    SetDlgItemText wParam, IDYES, But1
    SetDlgItemText wParam, IDNO, But2
    Kasus vbOkCancel
    SetDlgItemText wParam, IDOK, But1
    SetDlgItemText wParam, IDCANCEL, But2
    End Select
    UnhookWindowsHookEx MSGHOOK.hHook
    End If
    MsgBoxHookProc = False
    End Function

    Fungsi BBmsgbox publik (mhwnd As Long, _
    mMsgbox Sebagai VbMsgBoxStyle, Judul As String, _
    Prompt As String, Optional mMsgIcon Sebagai VbMsgBoxStyle, _
    Opsional Buta As String, Optional ButB As String, _
    Opsional ButC As String) As String
    'Fungsi ini menetapkan parameter kustom Anda dan kembali
    Tombol 'yang ditekan sebagai string
    Dim mReturn As Long
    mbFlags = mMsgbox
    mbFlags2 = mMsgIcon
    mTitle = Judul
    mPrompt = Prompt
    But1 = Buta
    But2 = ButB
    But3 = ButC
    mReturn = MessageBoxH (mhwnd, GetDesktopWindow (), _
    mbFlags Atau mbFlags2)
    Pilih Kasus mReturn
    Kasus IDABORT
    BBmsgbox = But1
    Kasus IDRETRY
    BBmsgbox = But2
    Kasus IDIGNORE
    BBmsgbox = But3
    IDYES Kasus
    BBmsgbox = But1
    Kasus IDNO
    BBmsgbox = But2
    Kasus IDCANCEL
    BBmsgbox = But3
    Kasus IDOK
    BBmsgbox = But1
    End Select
    End Function

    Sub Test ()
    Dim mReturn As String
    mReturn = BBmsgbox (1, vbYesNoCancel, "Hi There", "Keren?",, "Pergi untuk itu", "No way", "Biarkan aku berpikir")
    MsgBox "Anda menekan" + mReturn
    End Sub

  7. Robert wrote:

    Bagus sekali, ini adalah yang paling ringkas dan mudah dimengerti artikel yang saya temukan tentang cara menggunakan kotak pesan.

  1. Dapatkah Anda menyingkirkan tombol batal dari kotak pesan wrote:

    [...] "Hello", vbOkCancel LINK ini akan memberikan info lebih lanjut tentang messge Box. Salam [...]

  2. Kode VBA kotak pesan dilema ...... menulis:

    [...] Dan menambahkan sedikit lebih struktur, Anda dapat menampilkan sekitar 1024 karakter di kotak pesan. Link ini mungkin memberikan beberapa ide. Berikut adalah contoh bagaimana menggunakan vbCrLf untuk menambahkan carriage return-line [...]

Berlangganan

Bersaing dengan cerita terbaru - Disampaikan langsung ke kotak masuk Anda
feedburner

Menterjemahkan

English flagChinese (Simplified) flagPortuguese flagGerman flagFrench flagSpanish flagJapanese flagArabic flagDutch flagHindi flagPolish flagSwedish flagFilipino flagHebrew flagIndonesian flagUkrainian flagThai flagTurkish flag
software treeemap untuk excel