Пусть MsgBox условно отображает несколько переменных - PullRequest
0 голосов
/ 02 ноября 2019

Я довольно новичок в использовании VBA, и я получил задание колледжа, в котором есть часть, в которой я понятия не имею, как именно кодировать.

Итак, на самом деле речь идет о Userform. В Userforms у нас есть эти флажки, и мы можем проверить варианты, которые мы хотим.

Допустим, у меня есть три флажка: Найти Макс, Найти Мин, Найти Среднее

Они в основном находят максимальные, минимальные и средние значения из определенного диапазона. Моя проблема здесь связана с MsgBox. После того, как программа выполнит свои расчеты, основанные на выборе, появится MsgBox, который отображает эти значения.

Как мне создать MsgBox, который отображает варианты, которые я выбрал ранее? Если бы я мог создать MsgBox для каждого выбора, это было бы проще, но это назначение требует, чтобы все они появлялись в одном MsgBox. Если бы я выбрал только Max и Min, MsgBox отображал бы только значения Max и Min. Если я выберу только Max, MsgBox будет отображать значение Max. Если я выберу все, MsgBox отобразит их все.

По-моему, я думаю, что мог бы просто создать MsgBox для всех возможных сценариев, но на самом деле у меня есть шесть вариантов выбора, которые должны отображаться независимо от того, были ли они выбраны в пользовательской форме или нет. Я чувствую, что это будет не очень эффективно. Я предполагаю, что между флажками userform и MsgBox должно быть некоторое условное кодирование, но я не могу понять это. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019
  1. Создайте пользовательскую форму с (Имя): fmrCalculator & Caption: Калькулятор
  2. Создайте 3 метки с Заголовком: Макс., Мин. И Среднее значение
  3. Создайте 3 флажка с (Имя):cbxMax, cbxMin & cbxAverage
  4. Создать 1 CommandButton with (Имя): cdbCalculate & Caption: Calculate
  5. Двойной щелчок на CommadButton и импортировать следующий код:

Код:

Private Sub cdbCalculate_Click()

    Dim rng As Range, cell As Range
    Dim cnrtl As Control
    Dim strMessageBox As String

    'Clear the string
    strMessageBox = ""

    'Set the rng you want
    Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1:A10")

    'Check if all values in the range are numeric to avoid errors
    For Each cell In rng

        If Not IsNumeric(cell) Then
            MsgBox "The value in column " & cell.Column & " , row " & cell.Row & " is not a number!", vbCritical
            'Stop the code
            End
        End If

    Next cell

    'Loop all Controls
    With Me

        For Each cnrtl In .Controls

            'Check if the control is checkbox
            If TypeName(cnrtl) = "CheckBox" Then

                'Check if the checkbox is checked and find the Max
                If cnrtl.Name = "cbxMax" And cbxMax.Value = True Then
                    strMessageBox = "Max value=" & Application.WorksheetFunction.Max(rng)
                End If

                'Check if the checkbox is checked and find the Min
                If cnrtl.Name = "cbxMin" And cbxMin.Value = True Then
                    If strMessageBox = "" Then
                        strMessageBox = "Min value= " & Application.WorksheetFunction.Min(rng)
                    Else
                        strMessageBox = strMessageBox & vbNewLine & "Min value= " & Application.WorksheetFunction.Min(rng)
                    End If
                End If

                'Check if the checkbox is checked and find the Avarage
                If cnrtl.Name = "cbxAverage" And cbxAverage.Value = True Then
                    If strMessageBox = "" Then
                        strMessageBox = "Average value=" & Application.WorksheetFunction.Average(rng)
                    Else
                        strMessageBox = strMessageBox & vbNewLine & "Avarage value= " & Application.WorksheetFunction.Average(rng)
                    End If
                End If

            End If

        Next cnrtl

        MsgBox strMessageBox, , "Results:"

    End With

    Unload Me

End Sub

Просмотр пользовательской формы:

enter image description here

0 голосов
/ 02 ноября 2019

Попробуйте что-то вроде ниже:

Sub ShowResults()

    Dim sMessage As String

    ' btnMax btnMin btnAvg - use your controls names
    If btnMax.Value = True Then
        sMessage = sMessage & "Max is: " & CStr(yourMAXvalue) & vbNewLine
    End If

    If btnMin.Value = True Then
        sMessage = sMessage & "Min is: " & CStr(yourMINvalue) & vbNewLine
    End If

    If btnAvg.Value = True Then
        sMessage = sMessage & "Avg is: " & CStr(yourAvgvalue) & vbNewLine
    End If



    If Len(sMessage) > 0 Then MsgBox sMessage
End Sub
...