Понимание того, какие коды ответов возвращаются из MsgBox - PullRequest
12 голосов
/ 18 ноября 2009

Я очень новичок в программировании, и я только начинаю изучать VBA с Excel. Я наткнулся на этот сайт и сделал примеры здесь, но у меня есть вопрос об этом коде:

Я знаю, что переменные объявляются с помощью оператора "Dim". "Message" - это переменная с целым типом данных. Что я не совсем понимаю, так это что означает «6» здесь и «7». Я верю, что они откуда-то пришли. Но поскольку я только начал изучать эту программу, я понятия не имею. Не могли бы вы сказать мне, как это заканчивается до «6» и «7». Я считаю, что здесь есть основания

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

Спасибо за вашу помощь: -)

=======

Спасибо, ребята, за ответы, они очень полезны. Да, эта тема уже была размещена на сайте суперпользователя. Мне сообщили, что этот вопрос должен быть здесь, поэтому я разместил его здесь после прочтения, что они будут делать это автоматически от суперпользователя до стека-потока.

еще раз спасибо

Ответы [ 8 ]

22 голосов
/ 18 ноября 2009

MsgBox возвращает Enum(eration), называемое MsgBoxResult, которое по сути является ничем иным, как числовыми значениями с меткой. 6 и 7 в этом случае являются членами этого перечисления, которые сопоставлены с ответами Yes и No.

Следует по возможности избегать использования так называемых «магических чисел» вместо констант или перечислений.

По сути, вы можете переписать код так:

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

Возможно, Enum называется vbMsgBoxResult или что-то в этом роде ... У меня нет Office, чтобы это проверить, только Visual Studio.

Пока мы на этом ... это может быть легче понять:

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
8 голосов
/ 20 ноября 2009

Когда я впервые начал с MsgBox ответов, я почти всегда объявлял ответ как Integer. Однако я узнал, что лучше всего объявить переменную message как VbMsgBoxResult, которая является перечислением, которое всегда будет отображать доступные ответы. На рисунке ниже среда IDE (например, редактор Visual Basic for Application) покажет вам возможные параметры, доступные в VbMsgBoxResult.

VbMsgBoxResult

Вы можете сохранить свою переменную answer как Integer, поскольку все переменные в Перечислении (например, vbAbort, vbYes, vbOK и т. Д.) Действительно действуют разрешить в целые числа. Однако вы должны выяснить, какие целочисленные значения для этих переменных есть каждый раз, когда вы хотите сослаться на них. На мой взгляд, лучше хранить ваш ответ как VbMsgBoxResult, чтобы вы могли видеть доступные ответы.

8 голосов
/ 18 ноября 2009

Это очень плохо написанный код, «6» и «7» - это значения констант «vbYes» и «vbNo», которые возвращаются, когда пользователь нажимает «Да» или «Нет» в диалоговом окне.

Ссылка: http://www.techonthenet.com/access/constants/msgbox_ret.php

Код должен сказать

If message = Constants.vbYes 

вместо

If message = 6

Так что понятно, что происходит.

6 голосов
/ 18 ноября 2009

Эта ссылка для VBScript, но я думаю, что коды возврата должны быть такими же: Справочник по функциям MsgBox

Коды возврата сообщают, какая кнопка была нажата:

1   OK
2   Cancel
3   Abort
4   Retry
5   Ignore
6   Yes
7   No
5 голосов
/ 18 ноября 2009

6 и 7 - коды возврата из метода MsgBox. Обычно, когда вызывается MsgBox, он показывает окно сообщения пользователю, который нажимает «Да», «Нет» или «Отмена». Выбор пользователя возвращается из метода MsgBox как число, где 6 - Да, а 7 - Нет.

Лучшей практикой считается не использовать эти числа в коде напрямую, а вместо этого использовать предоставленные Microsoft константы, которые их представляют. Ваш код может быть переписан как:

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
5 голосов
/ 18 ноября 2009

Это возвращаемое значение из MsgBox (). Вместо этого автору следовало использовать их символическое значение, чтобы сделать программу более читабельной:

vbYes   6
vbNo    7

См. статью MSDN для получения дополнительной информации

5 голосов
/ 18 ноября 2009

6 и 7 являются жестко закодированными значениями, которые имеют особое значение. Вызов «MsgBox (« Нажмите Да ... »)» вернет номер, который позволит вашему коду определить, что пользователь сделал с окном сообщения, и вы сможете использовать условные выражения (ваши операторы IF), чтобы решить, что делать дальше.

Полный список этих специальных значений можно найти в документации MSDN здесь:

http://msdn.microsoft.com/en-us/library/139z2azd(VS.80).aspx

3 голосов
/ 25 ноября 2009

Просто переписать в эквивалент:

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

И двигаться дальше

...