Показать форму после щелчка по ячейке, затем CommandButton для перехода к следующей ячейке ActiveCell

Показать форму после щелчка по ячейке, затем CommandButton для перехода к следующей ячейке ActiveCell

Я создаю форму ввода для использования с 'планшетным' ПК в 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 после достижения последнего элемента в списке.

Надеюсь это поможет!

Связанный контент