Я создал макрос в VBA, который находит слово «Viewpoint» и создает пользовательскую форму, которая просматривает окружающие ячейки (в «север», «восток», «юг» или «запад») и «конвертирует»"4-буквенный код в 4-значное число, если ячейка является" конвертируемой ".
Работает с использованием массива в окружающих ячейках. Например, следующее позволит пользователю преобразовать ячейки "Север" и "Восток", но не будет преобразовывать "Запад" (будучи "неконвертируемым") и ничего не даст для "Юг":
В этом примере при загрузке макроса пользователю предоставляется следующая пользовательская форма. Нажатие на кнопки «Преобразовать на север» или «Преобразовать на восток» приводит к появлению окна сообщения с преобразованным кодом, в то время как нажатие на «Преобразовать на запад» приводит к появлению окна сообщения со словом «Необратимые».
Однако вместо создания окна сообщения я хотел бы создать вторую пользовательскую форму на основе выбора пользователя из первой пользовательской формы . Например, если пользователь выберет «Преобразовать север», он получит дополнительную пользовательскую форму с преобразованным кодом (в виде метки) и парой дополнительных опций (в виде кнопок, в идеале просто на основе дополнительных индексов в массиве). Конечно, это будет означать, что должен быть какой-то способ ссылки на первую пользовательскую форму во второй пользовательской форме. Я посмотрел на другие ответы здесь, но не могу найти тот, который работает здесь. Что было бы хорошим способом сделать это?
Вот код модуля до сих пор. Обратите внимание, что «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