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

Я создаю форму ввода для использования с "планшетным" ПК в Excel, чтобы наши ребята могли заполнить ее в поле. Поскольку вводы, такие как выпадающие меню и т. П., Довольно трудоемки, я хочу использовать базовую форму ввода с большими кнопками Pass / Fail Command. Вместо того, чтобы использовать отдельные CommandBox для вызова формы, я решил использовать следующий код (внутри объекта / листа) для вызова формы при выборе определенных ячеек:

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, для заполнения Item#, Description & Comments, используя следующий код в FORM.

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

Предполагается, что пользователь введет комментарий (если применимо), а затем нажмите одну из четырех кнопок "Пропустить", "Неудачно", "Пропустить и продолжить" и "Неудачно и продолжить".

If they click "Pass" or "Fail", I have code in the Form return the text in the Comment box to the adjacent cell (using Offset), enter "P" or "F" respectively in the Active Cell, and close the user form with no problems (using the following code in the FORM).

Private Sub PASSButton_Click()
    PFInputForm.Hide
    ActiveCell = "P"
    ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
End Sub

The problem I have is when I want the user to click either "Pass & Continue" or "Fail & Continue", where the above is meant to happen, but the Active Cell then moves down one cell, and opens up a new Form specific for that row.

The code I currently run from the FORM for the "Pass & Continue" is below. The problem I have is that when the new Form opens, I can see the new active cell is selected on the Sheet, but the form is still calling on the information from the previous ActiveCell.

Private Sub PCONTButton_Click()
    PFInputForm.Hide
    ActiveCell = "P"
    ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
    ActiveCell.Offset(1, 0).Select
End Sub  

I've unsuccessfully tried a few variants, including hiding the user form (both in the FORM code and the Sheet code), but after a few hours of trawling this (and other) forums, I feel I'm now just stabbing in the dark!

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, как только был достигнут последний элемент в списке.

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

Другие вопросы по тегам