修改Vba中的是/否选项

时间:2014-08-13 19:24:30

标签: vba

MsgBox " Select Any of the two Options "
MyNote = "Which type of file ?"
Answer = MsgBox(MyNote, vbQuestion + vbYesNo, "")
If Answer = vbNo Then
    Call A()
Else 
    Call B()

一切正常,但我只想将是/否选项的外观更改为A和B,以便用户更好地了解为哪个文件选择哪个选项。

3 个答案:

答案 0 :(得分:4)

根据评论,您可以使用 API 作为讨论HERE

我发布了以下代码,以防链接关闭并且还包含您的代码。 HTH。

Option Explicit

' Import
Private Declare Function GetCurrentThreadId Lib "kernel32" () 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 UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long

' Handle to the Hook procedure
Private hHook As Long

' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5

' Constants
Public Const IDOK = 1
Public Const IDCANCEL = 2
Public Const IDABORT = 3
Public Const IDRETRY = 4
Public Const IDIGNORE = 5
Public Const IDYES = 6
Public Const IDNO = 7

Public Sub Test()
    ' Set Hook
    hHook = SetWindowsHookEx(WH_CBT, _
                             AddressOf MsgBoxHookProc, _
                             0, _
                             GetCurrentThreadId)

    ' Run MessageBox
    MyNote = "Which type of file ?"
    Answer = MsgBox(MyNote, vbQuestion + vbYesNo, "Select Any of the two options")
    If Answer = vbNo Then Call A() Else Call B()

End Sub

Private Function MsgBoxHookProc(ByVal lMsg As Long, _
                                ByVal wParam As Long, _
                                ByVal lParam As Long) As Long

    If lMsg = HCBT_ACTIVATE Then
        SetDlgItemText wParam, IDYES, "A" '~~> replacement for Yes
        SetDlgItemText wParam, IDNO, "B" '~~> replacement for No

        ' Release the Hook
        UnhookWindowsHookEx hHook
    End If

    MsgBoxHookProc = False
End Function

如果您使用 64位,则需要添加PtrSafe

答案 1 :(得分:1)

您可以使用的另一种选择是输入框。虽然这并没有给你按钮"它确实允许您更大程度地自由接受用户输入。可以轻松修改Case语句,以包含变体,拼写错误等。

Dim ibox
Retryinput:
ibox = inputBox("Choose option 1 or option 2")
Select case ibox
    Case 1
        Call A()
    Case 2
        Call B()
    Case Else
        If MsgBox("please enter 1 or 2", vbRetryCancel) = vbRetry then goto Retryinput
        Exit sub

End Select

答案 2 :(得分:0)

我知道这已经晚了2年但我只是想帮助找出为什么它不适用于那些想要查看Hook代码的人。 我想发表评论,但我无法发表评论,因为我需要50个声誉。 因此,我发布这个作为答案,可能是mods可以做任何他们想要的这篇文章... 无论如何,@ kevinarpe,它不起作用的原因是,你必须在VBE中从立即窗口运行测试...我遇到了同样的问题,我花了半天的时间来弄清楚我需要插入Excel工作表中的一个按钮,并将测试宏分配给该按钮以使所有这些工作。 我认为它从立即窗口运行时无法工作的原因是因为SetDlgItemText以某种方式无法找到msgbox的hWnd。 这只是我的意见,可能是我错了......如果是这样,专家请更正...... 在任何情况下,Hook代码确实有效!在我的Win8.1,32bit-Excel2010上。 可以在以下位置找到可以从VBE中运行的更好的代码: How do I change the names of buttons on a message box?