Я создаю форму ввода для использования с 'планшетным' ПК в Excel, чтобы наши ребята могли заполнять ее, когда находятся в поле. Поскольку ввод данных, такой как раскрывающиеся меню и тому подобное, довольно неудобен, я хочу использовать базовую форму ввода с большими кнопками команд Pass/Fail. Вместо того, чтобы использовать отдельные CommandBoxes для вызова формы, я решил использовать следующий код (внутри объекта/листа) для вызова формы при выборе определенных ячеек:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Count = 2 Then
If Not Intersect(Target, Me.Range("W16:W46,W74:W143")) Is Nothing Then
PFInputForm.Show
End If
End If
End Sub
Форма ввода вызывает информацию, относящуюся к ActiveCell, для заполнения номера элемента, описания и комментариев с помощью следующего кода в ФОРМЕ.
Private Sub UserForm_Initialize()
PFInputForm.INPUTCOMMENT.Text = CStr(ActiveCell.Offset(0, 1).Value)
PFInputForm.ITEMNO = "Item " & ActiveCell.Offset(0, -2)
PFInputForm.ITEMDESCR = ActiveCell.Offset(0, -1)
End Sub
Пользователь должен ввести комментарий (если применимо), а затем нажать одну из четырех кнопок: «Сдал», «Не сдал», «Сдал и продолжил» или «Не сдал и продолжил».
Если они нажимают «Сдал» или «Не сдал», у меня есть код в форме, который возвращает текст из поля «Комментарий» в соседнюю ячейку (используя смещение), вводит «P» или «F» соответственно в активную ячейку и закрывает пользовательскую форму без проблем (используя следующий код в форме).
Private Sub PASSButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
End Sub
Проблема, с которой я сталкиваюсь, заключается в том, что когда я хочу, чтобы пользователь нажал «Сдать и продолжить» или «Не сдать и продолжить», то, как и предполагалось выше, активная ячейка затем перемещается на одну ячейку вниз и открывает новую форму, специфичную для этой строки.
Код, который я сейчас запускаю из ФОРМЫ для "Pass & Continue", приведен ниже. Проблема в том, что когда открывается новая Форма, я вижу, что на Листе выбрана новая активная ячейка, но форма по-прежнему вызывает информацию из предыдущей ActiveCell.
Private Sub PCONTButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
End Sub
Я безуспешно пробовал несколько вариантов, включая скрытие пользовательской формы (как в коде FORM, так и в коде Sheet), но после нескольких часов прочтения этого (и других) форумов, я чувствую, что теперь просто блуждаю в темноте!
решение1
Я нашел решение благодаря другому пользователю. Я добавил дополнительный оператор IF THEN в функцию, вызывающую форму, которая ищет флаг (1 или 0) в ячейке AI14 (которая начинается с 1):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("AI14") Then
If Selection.Count = 2 Then
If Not Intersect(Target, Me.Range("W16:W46,W74:W143")) Is Nothing Then
Range("AI14") = 0
PFInputForm.Show
End If
End If
End If
End Sub
Затем я добавил изменение флага обратно на 1 для кнопок PASS и FAIL:
Private Sub PASSButton_Click()
Range("AI14") = 1
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
PFInputForm.Hide
End Sub
Я опускаю изменение флага на кнопках "Продолжить", чтобы оставить флаг на нуле, так что верхний код не продолжается. Затем я добавил некоторое дополнительное содержимое в код кнопки Продолжить, чтобы он извлекал связанную информацию из нового ActiveCell:
Private Sub PCONTButton_Click()
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
PFInputForm.INPUTCOMMENT.Text = CStr(ActiveCell.Offset(0, 1).Value)
PFInputForm.ITEMNO = "Item " & ActiveCell.Offset(0, -2)
PFInputForm.ITEMDESCR = ActiveCell.Offset(0, -1)
End Sub
Этот код использует тот же источник информации, что и код для инициализации формы (см. исходный пост)
Мне просто нужно привести в порядок конец кода «continue» так, чтобы флаг возвращался в 1 после достижения последнего элемента в списке.
Надеюсь это поможет!