#excel #vba
#excel #vba
Вопрос:
В настоящее время я использую excel-vba и пытаюсь создать простой вопрос и ответ. Пока у меня есть вопрос в моем листе Excel, который ответит на приведенный выше вопрос. У меня есть четыре кнопки, при выборе каждой кнопки появится сообщение. Я хочу узнать, могу ли я добавить некоторую логику к каждой кнопке, чтобы показать, сколько раз была выбрана кнопка, а также сколько раз был дан ответ на этот вопрос?
Я пытался исследовать это, но большинство ответов показано в программировании на Java и Android. Нет в excel-vba.
Sub Tomatoes()
MsgBox "Correct"
End Sub
Sub Cucumbers()
MsgBox "Wrong Answer, that would be too healthy, Please choose again."
End Sub
Sub Lime()
MsgBox "Incorrect Answer, that ketchup would be exteremely sour."
End Sub
Sub Apples()
MsgBox "Incorrect, Apples with Ketchup would be horrible. "
End Sub
Каждая кнопка создается так, что при выборе она будет отображать разные опции. Есть ли способ добавить логику к каждой кнопке, чтобы показать, сколько раз она была выбрана? а также добавить логику, чтобы показать, сколько раз на этот вопрос был дан ответ?
Комментарии:
1. Должны ли когда-либо сбрасываться счетчики? Если да, то когда?
2. Подсчеты будут сброшены только при закрытии рабочего листа, и подсчеты будут отображаться на другом листе. Например, может быть, sheet2? чтобы показать, сколько раз была выбрана эта опция.
Ответ №1:
Вы используете элементы управления формой, преимущество которых в том, что вы можете указать их все на один и тот же подраздел. Итак, создайте новый подраздел, подобный этому, и укажите все ваши кнопки на это. Этот подраздел соответствующим образом увеличит счетчики на вашем Листе2. Вот как должен выглядеть Лист2:
Sub btnIngredient_Click()
Dim wb As Workbook
Dim wsQuestion As Worksheet
Dim wsCounts As Worksheet
Dim rDest As Range
Set wb = ActiveWorkbook
Set wsQuestion = wb.ActiveSheet
Set wsCounts = wb.Worksheets("Sheet2")
Select Case wsQuestion.Shapes(Application.Caller).TextFrame.Characters.Text
Case "Cucumbers": Set rDest = wsCounts.Range("B3")
MsgBox "Wrong Answer, that would be too healthy, Please choose again."
Case "Tomatoes": Set rDest = wsCounts.Range("B4")
MsgBox "Correct"
Case "Lime": Set rDest = wsCounts.Range("B5")
MsgBox "Incorrect Answer, that ketchup would be exteremely sour."
Case "Apples": Set rDest = wsCounts.Range("B6")
MsgBox "Incorrect, Apples with Ketchup would be horrible. "
End Select
wsCounts.Range("B2").Value = wsCounts.Range("B2").Value 1 'Increase counter of the total times question answered
rDest.Value = rDest.Value 1 'Increase counter of individual button clicked
End Sub
Чтобы очистить счетчики при закрытии книги, используйте событие Workbook_BeforeClose (убедитесь, что этот код находится в модуле ThisWorkbook
code):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Worksheets("Sheet2").Range("B2:B6").Value = 0
End Sub
Ответ №2:
Вспомогательные элементы для каждой кнопки могут отслеживать необходимую вам информацию. С добавлением некоторых переменных уровня модуля ваш код может выглядеть примерно так:
Private CucumbersPressed As Integer
Private TomatoesPressed As Integer
Private QuestionAnswered As Integer
Private Sub Cucumbers()
CucumbersPressed = CucumbersPressed 1
QuestionAnswered = QuestionAnswered 1
MsgBox "Wrong"
End Sub
Private Sub Tomatoes()
TomatoesPressed = TomatoesPressed 1
QuestionAnswered = QuestionAnswered 1
MsgBox "Correct"
End Sub
В зависимости от количества вопросов и количества кнопок этот подход может стать громоздким. В этом случае потребуется какой-то другой механизм, но идея будет аналогичной.