Excel VBA: нажмите две кнопки (фигуры), которые запускают два отдельных сценария VBA при открытой электронной таблице - PullRequest
0 голосов
/ 07 мая 2018

У меня полностью заблокирована электронная таблица, и я управляю всей сортировкой и фильтрацией через VBA. У меня также есть другой скрипт, который скрывает лист при закрытии и автоматически сохраняет файл, чтобы скрыть этот лист.

Я пытался выяснить, как я могу использовать VBA, чтобы «щелкнуть» по одной кнопке (фигуре), которая очистит все, что было отфильтровано, а затем «щелкнуть» по другой кнопке (фигуре), которая сортирует электронную таблицу по алфавиту , Кнопки (фигуры) уже отлично работают при взаимодействии с пользователем, но я также хотел бы, чтобы эти кнопки (фигуры) автоматически срабатывали при открытии листа.

Первая кнопка назначена макросу SearchBox, связанному со следующим VBA -

Sub SearchBox()

Dim myButton As OptionButton
Dim SearchString As String
Dim ButtonName As String
Dim sht As Worksheet
Dim myField As Long
Dim DataRange As Range
Dim mySearch As Variant

  Set sht = ActiveSheet

  On Error Resume Next
    sht.ShowAllData
  On Error GoTo 0

  Set DataRange = sht.ListObjects("DataTable").Range

  mySearch = sht.Shapes("UserSearch").TextFrame.Characters.Text

  If IsNumeric(mySearch) = True Then
    SearchString = "=" & mySearch
  Else
    SearchString = "=*" & mySearch & "*"
  End If

  For Each myButton In sht.OptionButtons
    If myButton.Value = 1 Then
      ButtonName = myButton.Text
      Exit For
    End If
  Next myButton

  myField = Application.WorksheetFunction.Match(ButtonName, DataRange.Rows(1), 0)

  DataRange.AutoFilter _
    Field:=myField, _
    Criteria1:=SearchString, _
    Operator:=xlAnd

  sht.Shapes("UserSearch").TextFrame.Characters.Text = ""

End Sub

Второй вариант намного проще, он просто сортирует таблицу данных по этому конкретному столбцу -

Sub Sort_Name()

Dim oneRange As Range
Dim aCell As Range

Set oneRange = Range("A4:H1162")
Set aCell = Range("A4")

oneRange.Sort Key1:=aCell, Order1:=xlAscending, Header:=xlYes

End Sub

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Итак, лучший способ объяснить, как я сделал то, что хотел сделать, это посмотреть на то, к чему сама кнопка обращается, щелкнув ее правой кнопкой мыши и снова нажав «Назначить макрос». Вы увидите, как это выглядит -

'YourSpreadSheetName.xlsm'! Sheet2.SearchBox

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

Поместив этот код в раздел ThisWorkbook с помощью скрипта Workbook_Open, я смог заставить его работать так, как я хотел -

Call Sheet2.SearchBox

Еще раз спасибо за помощь всем, кто прокомментировал.

0 голосов
/ 07 мая 2018

В коде для ThisWorkbook вы сможете обрабатывать события рабочей книги , включая событие Open, которое запускается рабочей книгой при ее открытии.

Перейдите к модулю (дважды щелкните ThisWorkbook в проводнике проекта VBE [Ctrl + R]), затем найдите раскрывающиеся списки в верхней части панели кода редактора. В раскрывающемся меню слева выберите Workbook; затем из правого раскрывающегося списка выберите событие Open; VBE автоматически создает заглушку метода с правильной подписью для вас:

Private Sub Workbook_Open()

End Sub

Обратите внимание, что подчеркивание имеет очень особое значение в VBA; когда называете свои процедуры (особенно неявно или явно Public), всегда придерживайтесь PascalCase и избегайте Snake_Case; это может не иметь значения сейчас , но когда вы станете разработчиком, вы по достоинству оцените согласованность в именовании, а когда вы начнете работать с интерфейсами, это подчеркивает публично Участники программы начнут отличать работающий код от кода, который даже не компилируется: заблаговременное использование полезных привычек избавит вас от головной боли позже.

Теперь вам нужно вызвать две процедуры в этом обработчике.

Когда вы делаете это:

oneRange.Sort Key1:=aCell, Order1:=xlAscending, Header:=xlYes

Вы вызываете метод Sort объекта oneRange , который является экземпляром класса Range.

Когда вы делаете это:

MsgBox "Hi!"

Вы вызываете функцию MsgBox, которая находится в библиотеке VBA в модуле Interaction (найдите ее в браузере объектов [F2]). Это будет эквивалентно:

VBA.Interaction.MsgBox "Hi!"

Итак, чтобы вызвать ваш SearchBox, а затем ваш SortName метод, все, что вам нужно сделать, это:

Private Sub Workbook_Open()
    SearchBox
    SortName  'formerly known as Sort_Name
End Sub

Процедуры делают что-то - их имена всегда должны начинаться с глагола, они действия . «SearchBox» выглядит как имя, а не как действие. В программировании имена больше похожи на классы - Range, Workbook и т. Д .; рассмотрите переименование SearchBox, чтобы лучше передать то, что оно делает . Если это трудно сделать, вероятно, потому что ваша процедура делает слишком много вещей - например, получение имени для фильтрации , а затем применение фильтра к определенной таблице , а затем очистка текста некоторой формы .

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

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