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,以便用户更好地了解为哪个文件选择哪个选项。
答案 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?