Пользовательская форма VBA на основе выбора, сделанного в предыдущей пользовательской форме - PullRequest
0 голосов
/ 04 ноября 2019

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

Работает с использованием массива в окружающих ячейках. Например, следующее позволит пользователю преобразовать ячейки "Север" и "Восток", но не будет преобразовывать "Запад" (будучи "неконвертируемым") и ничего не даст для "Юг":

enter image description here

В этом примере при загрузке макроса пользователю предоставляется следующая пользовательская форма. Нажатие на кнопки «Преобразовать на север» или «Преобразовать на восток» приводит к появлению окна сообщения с преобразованным кодом, в то время как нажатие на «Преобразовать на запад» приводит к появлению окна сообщения со словом «Необратимые».

enter image description here

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

Вот код модуля до сих пор. Обратите внимание, что «optNorth», «optSouth» и т. Д. Относятся к кнопкам пользовательской формы, а «lblNorth» и т. Д. Относятся к меткам пользовательской формы. Наконец, не стесняйтесь, дайте мне знать, если вы заметили, как этот код можно сделать более эффективным:

Private Sub Surroundings(OFFSET_CELL As Range, LBL As Object, OPT As Object, DIRECTION As String)

    Dim VIEWPOINT As Range
    Dim LAST_ROW As Integer
    Dim ARR() As String

    ' Set ARR to use the "Split" function in the destination cell, making the "\" a delimiter
    ARR = Split(OFFSET_CELL, "\")

    ' Set the range in which to search for "Viewpoint"
    Set VIEWPOINT = Sheet1.Range("A1:Z26").Find(What:="Viewpoint", LookAt:=xlWhole, MatchCase:=True)

    ' If there is a "\" in the adjacent cell...
    If InStr(1, OFFSET_CELL, "\") > 0 Then
        ' show a label with the DIRECTION and array index 0 (the 4-letter code)
        LBL.Caption = DIRECTION & " is " & (ARR(0))
        ' show a button label with the word "Convert" and the DIRECTION:
        OPT.Caption = "Convert " & DIRECTION

    ' In any other situation...
    Else
        LBL.Caption = DIRECTION & " is nothing."
        OPT.Caption = "Nothing"
        OPT.Enabled = False
    End If

End Sub
Public Sub Surroundings_Userform()

    Dim VIEWPOINT As Range

    ' Set the range in which to search for "Viewpoint"
    Set VIEWPOINT = Sheet1.Range("A1:Z26").Find(What:="Viewpoint", LookAt:=xlWhole, MatchCase:=True)

    ' Load up the userform
    Load SurroundingsUserForm

    ' Call the variable code in the Surroundings sub
    Call Surroundings(VIEWPOINT.Offset(-1, 0), SurroundingsUserForm.lblNorth, SurroundingsUserForm.optNorth, "North")
    Call Surroundings(VIEWPOINT.Offset(1, 0), SurroundingsUserForm.lblSouth, SurroundingsUserForm.optSouth, "South")
    Call Surroundings(VIEWPOINT.Offset(0, 1), SurroundingsUserForm.lblEast, SurroundingsUserForm.optEast, "East")
    Call Surroundings(VIEWPOINT.Offset(0, -1), SurroundingsUserForm.lblWest, SurroundingsUserForm.optWest, "West")

    SurroundingsUserForm.Show

    Set VIEWPOINT = Nothing

End Sub

А вот код формы:

Private Sub OptionButton(OPT_BUTTON As String, OFFSET_ROW As Integer, OFFSET_COLUMN As Integer)

    Dim VIEWPOINT As Range
    Dim ARR() As String
    Dim OFFSET_CELL As String

    ' Set the range in which to search for "Viewpoint")
    Set VIEWPOINT = Sheet1.Range("A1:Z26").Find(What:="Viewpoint", LookAt:=xlWhole, MatchCase:=True)

    Select Case True
        Case OPT_BUTTON
            ' Define OFFSET_CELL as per the option button
            OFFSET_CELL = VIEWPOINT.Offset(OFFSET_ROW, OFFSET_COLUMN)
            ' The array uses "\" as a delimiter
            ARR = Split(OFFSET_CELL, "\")
                ' If array index 1 is "Convertible", show a message box with array index 2
                If ARR(1) = "Convertible" Then
                    MsgBox (ARR(2))
                ' If array index 1 is "Nonconvertible", show a message box with "Nonconvertible"
                ElseIf ARR(1) = "Nonconvertible" Then
                    MsgBox ("Nonconvertible")
                ' In any other situation, unload the userform
                Else
                    Unload Me
                End If
    End Select

    Unload Me

End Sub
Private Sub optNorth_Click()
    Call OptionButton(optNorth, -1, 0)
End Sub
Private Sub optSouth_Click()
    Call OptionButton(optSouth, 1, 0)
End Sub
Private Sub optEast_Click()
    Call OptionButton(optEast, 0, 1)
End Sub
Private Sub optWest_Click()
    Call OptionButton(optWest, 0, -1)
End Sub
Private Sub optClose_Click()
    Unload Me
End Sub

1 Ответ

1 голос
/ 04 ноября 2019

Если я правильно понял ваш вопрос, пожалуйста, посмотрите на приведенный ниже пример.

Я настроил первую пользовательскую форму, как показано ниже

First Userform

и поместил следующий код позади него

Option Explicit

Private Sub CommandButton1_Click()
    Call Click("North")
End Sub

Private Sub CommandButton2_Click()
    Call Click("South")
End Sub

Private Sub Click(str As String)
    Dim ufrm2 As UserForm2
    Set ufrm2 = New UserForm2
    ufrm2.CoOrd = str
    ufrm2.Show
End Sub

Во второй форме я поместил текстовое поле

Second Userform

со следующим кодом

Option Explicit
Private vCoOrd As String
Property Let CoOrd(v As String)
        vCoOrd = v
End Property
Property Get CoOrd() As String
    CoOrd = vCoOrd
End Property

Private Sub UserForm_Activate()
    Label1.Caption = CoOrd
End Sub

Предоставление следующих результатов:

enter image description here

Это работает путем установки CoOrd свойство UserForm2 от UserForm1 до Activating второй пользовательской формы. Таким образом, я могу передать значения от UserForm1 до UserForm2, прежде чем пользовательская форма отобразится пользователю

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