многие кнопки (форма пользователя) управляют одним макросом, открывающим разные формы пользователя в зависимости от выбора

Я создал небольшую форму Excel для обновления базы данных. отлично работает, хотя персонал делает странные вещи и должен еженедельно заменять Excel на чистую версию. Поэтому я думаю о создании пользовательских форм, которые обновляют лист Excel (DutySelection). У меня есть много кнопок (форма пользователя) A4: A31, которые будут управлять одним макросом, который открывает 3 разных формы пользователя в зависимости от выбора раскрывающегося списка B4: B31.

В настоящее время мой код работает только с B4, независимо от того, какую кнопку я нажимаю. Например: B4 выберите Start, откроется форма Start. Выбор B6 Готово, открывается форма Старт

Sub Duty()

    If Sheets("DutySelection").Range("B4,B31") = "Start" Then
        frmStart.Show

    ElseIf Sheets("DutySelection").Range("B4,B31") = "Duty Type" Then
        ReportUpdate.Show

    Else: Sheets("DutySelection").Range("B4,B31") = "Finish" 'Then
        frmFinish.Show

    End If
End Sub

Я думаю, что мне не хватает одной или двух строк, но я просто не могу найти то, что мне нужно в Интернете.


person Drag00n    schedule 24.01.2016    source источник
comment
Интересно, зачем у вас столько кнопок для вызова одного и того же макроса. Вы можете добавлять события на рабочий лист, чтобы при выборе ячейки проверять ее столбец, а если столбец B, то вы можете переместить кнопку в определенную ячейку и сделать ее видимой. Выбор других ячеек скроет кнопку. Также разблокируйте ячейки, которые вы разрешаете изменять сотрудникам, затем защитите лист, например Activesheet.Protect UserInterfaceOnly:=True   -  person PatricK    schedule 25.01.2016


Ответы (2)


Sheet.Range("B4,B31") не возвращает то, что вы думаете: он возвращает составной диапазон, состоящий из 2 областей, область 1 — ячейка B4, а область 2 — ячейка B31. То есть так же, как если бы вы выбрали ячейку B4, а затем, удерживая нажатой клавишу Ctrl, ячейку B31.

Я думаю, вы имели в виду «B4: B31», но это также возвращает что-то еще: массив, заполненный (значениями) всех ячеек в диапазоне от B4 до B31. Вы не можете сравнить его с текстовой строкой просто так.

Здесь вам нужно перебрать все ячейки между B4 и B31, а затем сравнить их значения с интересующим вас текстом.

Другая проблема заключается в том, что ваш код работает только с первым совпавшим текстом. Итак, если ячейка B4 содержит «Старт», то ElseIf никогда не будет оцениваться, даже если ячейка B5 содержит «Тип обязанности». Лучший способ справиться с этим зависит от того, как вы получаете эти тексты в столбце B на вашем листе.

person Carl Colijn    schedule 24.01.2016
comment
Не лучше ли попробовать выбор регистра в цикле? Или установить подпрограмму, чтобы инициировать пользовательскую форму на основе критериев? Мой второй вопрос более экспериментальный и, вероятно, в лучшем случае шаткий, но выбор случая в цикле может быть хорошей альтернативой. - person Doug Coats; 25.01.2016
comment
Что ж, я скажу спасибо, потому что, сам того не осознавая, Карл Колейн, ваш ответ на самом деле дал мне правильный ответ. В итоге я использовал 3 цикла, и это сработало, просто мне потребовалось некоторое время, чтобы заставить его работать. Спасибо - person Drag00n; 21.04.2016

Если я вас правильно понял, у вас есть кнопка в каждой строке рядом со столбцом B, и нажатие на нее вызывает действие, выбранное в столбце B в соответствующей строке, верно?

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

Привет, ват

person vatbub    schedule 25.01.2016