VBA : vbYesNo displays a button with OK and nothing else - vba

Title speaks for itself.
Here is an illustration
and here is the line of code I'm using.
If MsgBox("Are you sure?", vbYesNo) = Yes Then Exit Sub
I'm also using EXTRA! X-treme

I'd have to guess that EXTRA! X-treme (wow! hyperbole much?!) is messing with the vb constants, or at least not respecting them if it is intercepting calls to the MsgBox function.
vbYesNo should be a constant numeric value of 4.
Also, instead of comparing the result of MsgBox to Yes, you should probably be comparing it to vbYes (numeric value of 6).
I think you're using VBA correctly (except for the vbYes part), so this might be an EXTRA! X-treme bug (or under-documented feature).
Solution
If MsgBox("Are you sure?", 4) = 6 Then Exit Sub

If DialogResult.OK = Windows.Forms.MessageBox.Show("Are You Sure ? ", "Choose Folder",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Question) Then
' Do Code
End If

Related

VBA Access Message Box woes

I followed a few simple comments on how to pop a confirmation box before executing a script, but sadly, if I press yes, the script doesn't run.
Private Sub Overwrite_Btn_Click()
If MsgBox("Yes?", vbOKCancel) = ok Then
Me.Product_Quantity = Me.Quantity_Input
Else
Exit Sub
End If
End Sub
I'm trying to set Product_Quantity equaling Quantity_Input, and although it works without the MsgBox command, it doesn't with it.
What am I doing wrong?
Instead of If MsgBox("Yes?", vbOKCancel) = ok Then try: If MsgBox("Yes?", vbOKCancel) = vbOK Then
Typically the interactions with forms will return one constant from a set of several constants. Those are catalogged in enums. In this case you have several constants in the VbMsgBoxResult class, and vbOK is a constant with value 1, which is returned from clicking the ok button.
Actually, If MsgBox("Yes?", vbOKCancel) = 1 Then would work as well, but it is harder to remember that clicking Ok returns 1 then simply stating a constant named vbOK
In object explorer (F2 on the VBE), searching for VbMsgBoxResult will give all possible results that comes from interacting with a message box.
https://www.techonthenet.com/access/constants/msgbox_ret.php
1) Dim a variable as integer.
2) Check for value of integer equal to 6, or check for vbYess
3) ?????
4) Profit
borrowed from link
Dim LResponse As Integer
LResponse = MsgBox("Do you wish to continue?", vbYesNo, "Continue")
If LResponse = vbYes Then
{...statements...}
Else
{...statements...}
End If
Single line:
If MsgBox("Yes?", vbOKCancel) <> vbOk then Exit Sub
'continue code here.
More Information:
MSDN : MsgBox Function (Office/VBA)

Is it possible to have VBA MsgBox as type vbYesNo and vbExclamation simultaneously?

I am trying to get a message box in vba to display as a regular yes no box:
But with the Exclamation icon as well:
I can do either easily by vba. Like the vbExclamation version code below:
MsgBox "Are you sure you want to continue?", vbExclamation, "Warning!"
or the version for the vbYesNo:
Dim msgboxResult As VbMsgBoxResult
msgboxResult = MsgBox("Are you sure you want to continue?", vbYesNo, "Warning!")
If msgboxResult = vbNo Then Exit Sub
But am not sure if the two can be combined?
On the MSDN vba refrence for the MsgBox function, https://msdn.microsoft.com/en-us/library/aa445082(v=vs.60).aspx it does say at the very bottom the following:
"Note: To specify more than the first named argument, you must use MsgBox in an expression. To omit some positional arguments, you must include the corresponding comma delimiter."
Is this referring to what I need, and if so, how would I implement this please?
I think
msgboxResult = MsgBox("Are you sure you want to continue?", vbExclamation + vbYesNo, "Warning!")
would do it the way you want to have.

Command Button in msgbox vba possible?

si it possible to add a command button in the msgbox window in vba?
For example, i want to add a cancel button that stops the code rather than continuing it. I could create a new userform, but it would be nice if i save some space and use the msgbox that is already here.
VBA has several different types of MessageBoxes with built in command buttons for this very purpose. The type of buttons included in the message box is declared as the second parameter - MsgBox(Prompt, Buttons as)
The types you are probably interested in are:
vbYesNo
vbYesNoCancel
vbAbortRetryIgnore
vbOkCancel
vbRetryCancel
These Buttons return integer values that need to either be stored or used for comparison.
VBA has these integer answers stored as constants (e.g. vbOK = 1, VbCancel = 2, etc.) See Microsoft Developer Network MsgBox Function for more details on that.
Sub mySub()
Dim answer as Integer
answer = MsgBox("Would you like to choose yes?", vbYesNoCancel)
If answer = vbYes Then
'Do whatever you want
ElseIf answer = vbNo Then
'Do whatever
Else
Exit Sub
End If
End Sub
Try this:
If MsgBox("Cancel or Continue, are you sure?", vbOKCancel) = vbOK Then
'continue whatever you want to do.
End if

VBA Msgbox - No Default Button

I would like to know if it's possile to show a Msgbox in VBA (Excel 2007), without any button being set as default?
I have a yes\no button and I don't want the user to hit return or the space bar and accidentally trigger a default button.
Anyone know if this is possible so that neither button on my form is set to default, forcing the user to click yes or no?
If MsgBox("Message goes here", vbYesNo + vbQuestion ) = vbYes Then
'Something
Else
'Else
End If
Another workaround (other than a UserForm, or trapping Enter & Space etc) is to
Add a third button option that is an invalid choice
Make this button the default
Continue to show the message box if this option is picked
code
Dim lngMsg As Long
Do
lngMsg = MsgBox("Message goes here (Yes or No)", vbQuestion + vbYesNoCancel + vbDefaultButton3)
Loop While lngMsg = vbCancel
If lngMsg = vbYes Then
' route a
Else
' route b
End If
No this is not possible unfortunately.
A (not particularly nice) workaround would be to code the message box using a UserForm. Probably not worth doing given the benefit over the extra code you'd have to maintain.
If MsgBox("Message goes here", vbYesNo + vbQuestion **+ vbDefaultButton2**) = vbYes Then
'Something
Else
'Else
End If

Understanding what response codes come back from MsgBox

I'm very new to programming and I'm just starting to learn VBA with excel. I came across on this website and did the examples here but I have question about this code:
I know the variables are declared using "Dim" statement "Message" here is the variable with a data type of integer. What I don't clearly understand is; what is the meaning of "6" here and "7". I believe they come from somewhere. But as I just started learning this program, I don't have any idea. Could you please tell me how it end up to "6" and "7". I believe there is some basis here
Private Sub CommandButton1_Click()
Dim message As Integer
message = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
If message = 6 Then
Range("A1").Value = "You may proceed"
ActiveWorkbook.Activate
ElseIf message = 7 Then
ActiveWorkbook.Close
End If
End Sub
Thank you for your help:-)
=======
Thanks guys for the answers, they're very helpful. Yes this thread has been already posted in superuser site. I was informed that this question should belong here so I posted it here after reading that they will do it automatically from superuser to stackoverflow.
thanks once again
MsgBox does return an Enum(eration) called MsgBoxResult, which is basically nothing else then numeric values with a 'label'. 6 and 7 in this case are members of this enum, which are mapped to the answers Yes and No.
Using so called 'magic numbers' instead of Constants or Enums should avoided whenever possible.
Basically, you could rewrite the code to this:
Dim message As Integer
message = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
If message = MsgBoxResult.Yes Then
Range("A1").Value = "You may proceed"
ActiveWorkbook.Activate
ElseIf message = MsgBoxResult.No Then
ActiveWorkbook.Close
End If
Might be that the Enum is called vbMsgBoxResult or something... I don't have an Office to verify this, just Visual Studio.
While we are on it... this might be easier to understand:
Select Case MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
Case MsgBoxResult.Yes
Range("A1").Value = "You may proceed"
ActiveWorkbook.Activate
Case MsgBoxResult.No
ActiveWorkbook.Close
Case MsgBoxResult.Cancel
' he clicked cancel '
End Select
When I first started with MsgBox answers, I almost always declared the answer as an Integer. However, I learned that the best thing to do is to declare your message variable as VbMsgBoxResult, which is an enumeration that will always show the available answers. In the picture below, the IDE (e.g. the Visual Basic for Application editor) will show you the possible options available in VbMsgBoxResult.
You could store your answer variable as an Integer since all of the variables in the Enumeration (e.g. vbAbort, vbYes, vbOK, etc.) do in fact resolve to integers. However, you have to figure out what the integer values for those variables are every time you want to reference them. In my opinion, it's a better practice to store your answer as VbMsgBoxResult so you can actually see the available answers.
It's very poorly written code, "6" and "7" are the values of the constants "vbYes" and "vbNo" where are returned when the user clicks Yes or No on the dialog.
Reference: http://www.techonthenet.com/access/constants/msgbox_ret.php
The code should say
If message = Constants.vbYes
instead of
If message = 6
So that it is clear what is happening.
This link is for VBScript, but I think the return codes should be the same:
MsgBox Function Reference
The Return Codes tell you which button was clicked:
1 OK
2 Cancel
3 Abort
4 Retry
5 Ignore
6 Yes
7 No
These are return value from MsgBox(). The author should have used their symbolic value instead to make the program more readable:
vbYes 6
vbNo 7
See this MSDN article for more info
6 and 7 are the return codes from the MsgBox method. Basically, when MsgBox is called, it shows a message-box to the user, who clicks either "Yes", "No", or "Cancel". The user's selection is returned from the MsgBox method as a number, where 6 is Yes, and 7 is No.
It is considered best-practice not to use these numbers in your code directly, but instead to use Microsoft supplied constants which represent them. Your code could be re-written as:
Private Sub CommandButton1_Click()
Dim message As Integer
message = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
If message = vbYes Then
Range("A1").Value = "You may proceed"
ActiveWorkbook.Activate
ElseIf message = vbNo Then
ActiveWorkbook.Close
ElseIf message = vbCancel Then
'Do nothing.
End If
End Sub
The 6 and 7 are hard coded values that hold a special meaning. The 'MsgBox("Click Yes...")' call will return a number that will let your code determine what the user did with the message box and you can then use conditionals (your IF statements) to decide what to do next.
A full list of these special values can found in the MSDN documentation here:
http://msdn.microsoft.com/en-us/library/139z2azd(VS.80).aspx
Just rewrite to the equivalent:
Private Sub CommandButton1_Click()
Dim optionSelected As VbMsgBoxResult
optionSelected = MsgBox("Click Yes to Proceed, No to stop", vbYesNoCancel, "Login")
If optionSelected = vbYes Then
Range("A1").Value = "You may proceed"
ActiveWorkbook.Activate
ElseIf optionSelected = vbNo Then
ActiveWorkbook.Close
End If
End Sub
And move on