Как сделать динамический диапазон в процедуре SelectionChange рабочего листа в программировании на основе событий VBA? - PullRequest
0 голосов
/ 04 июля 2019

Мне нужно создать шаблон листа вопроса в Excel, каждый вопрос имеет четыре различных типа ответа, например

"Yes/No", 
"Ture/False", 
"Multiple Choice/Single Answer",
"Multiple Choice/Multiple Answer".

, если пользователь выберет "Yes/No" и попытается ответить более чем на два ответа, он появитсясообщение об ошибке.если пользователь выберет "Multiple Choice/Multiple Answer" и выберет только один ответ и переместится в другую ячейку или столбец, появится всплывающее сообщение об ошибке ... и т. д. для других типов вопросов.

Я использую программирование на основе событий дляДля этого используйте процедуру SelectionChange для рабочего листа. Мой код работает нормально, но он не динамический, он работает только для одного вопроса, в то время как в моем шаблоне 100 вопросов.

В этом шаблоне используются четыре столбца Column A, B, C and Dимя соответственно "Sr.No." Номер вопроса - это упоминание, "Question" Вопрос в этом столбце, "Answer Type" Тип ответа - это упоминание здесь, в раскрывающемся списке. Пользователю "Правильный вариант" нужно выбрать значение Истина отсюда.для правильного варианта.

Мой код здесь:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

' section 1

' for Multiple Choice/Multiple answer
' if user select less than 2 answer
rw = 9
rng1 = rw + 1
rng2 = rw + 4

If Worksheets("Question paper").Range("C" & rw).Value = "Mutilple Choice/ Mutiple Answer" And _
    WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") < 2 Then
    MsgBox "Select at least 2 ""TRUE"" option"

' for Multiple Choice/Single Answer
' if user select more than 1 answer
ElseIf Worksheets("Question paper").Range("C" & rw).Value = "Mutilple Choice/Single Answer" And _
    WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") > 1 Then
    MsgBox "Select only 1 ""TRUE"" option"

    ' if user doesn't select any answer
    ElseIf Worksheets("Question paper").Range("C" & rw).Value = "Mutilple Choice/Single Answer" And _
        WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") < 1 Then
        MsgBox "Select only 1 ""TRUE"" option"

' for Yes/No Answer
' if user select more than 1 answer
ElseIf Worksheets("Question paper").Range("C" & rw).Value = "Yes/No" And _
    WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") > 1 Then
    MsgBox "Select only 1 ""TRUE"" option"

        ' if user doesn't select any answer
        ElseIf Worksheets("Question paper").Range("C" & rw).Value = "Yes/No" And _
            WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") < 1 Then
            MsgBox "Select at least 1 ""TRUE"" option"

' for True/False Answer
' if user select more than 1 answer
ElseIf Worksheets("Question paper").Range("C" & rw).Value = "True/False" And _
    WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") > 1 Then
    MsgBox "Select only 1 ""TRUE"" option"

        ' if user doesn't select any answer
        ElseIf Worksheets("Question paper").Range("C" & rw).Value = "True/False" And _
            WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") < 1 Then
            MsgBox "Select at least 1 ""TRUE"" option"


' for Free Form(Essay) answer
ElseIf Worksheets("Question paper").Range("C" & rw).Value = "Free Form(Essay)" And _
    WorksheetFunction.CountIf(Range("D" & rng1 & ":" & "D" & rng2), "TRUE") > 0 Then
    MsgBox "Do not select any option,it is a free form question"

'ElseIf Worksheets("Question paper").Range("C" & rw).Value = "Free Form(Essay)" And _
'    Worksheets("Main Sheet").Range("C32") = "" Then
'    MsgBox "Please fill details in cell C32 in ""Main Sheet"" tab"

End If
End Sub

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

Я ожидаю динамический код для 100 или более вопросов.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Протестировано, работает, если вы используете значение Target.row для текущей строки

rw = Target.row

, потому что вы используете только фиксированное значение 9, а не текущую целевую строку для проверки

0 голосов
/ 08 июля 2019

сначала я помещаю эту формулу в другой столбец = ЕСЛИ (И (B10 <> "", C10 <> ""), "Q", 0) эта формула дает мне номер вопроса, над которым работает пользователь вопроса.В столбце «B» пользователю необходимо ввести вопрос, а в столбце «C» есть раскрывающийся список для типа вопроса, например «Да / Нет», «Ture / False» ... в столбце «D» я получаю «Q»."в начале вопрос, в котором пользователь работает.в конце столбца "D" я ставлю формулу = сумма, чтобы я получил номер вопроса.

, в еще 2 столбцах я составляю таблицу, в которой я упоминаю номер строки для каждого вопроса, как этот: Q № Строка№ 1 10 2 15 3 25

теперь просто с помощью формулы vlookup получил номер строки вопроса, в которой работает пользователь.

теперь я просто назначаю это значение ячейки в переменной в моемКод VBA выглядит следующим образом: Private Sub Worksheet_SelectionChange (ByVal Target As Range)

rw = Range("XFB762").Value
rng1 = rw + 1
rng2 = rw + 4

If Worksheets("Question paper").Range("D" & rw).Value = "Multiple Choice/ Multiple Answer" And _
    WorksheetFunction.CountIf(Range("E" & rng1 & ":" & "E" & rng2), "TRUE") < 2 Then
    MsgBox "Select at least 2 ""TRUE"" option"

Теперь диапазон является динамическим.и это работает фантастически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...