セルをクリックしてフォームを表示し、CommandButton をクリックして次の ActiveCell に渡します。

セルをクリックしてフォームを表示し、CommandButton をクリックして次の ActiveCell に渡します。

私は、現場のスタッフが入力できるように、Excel で「タブレット」 PC で使用する入力フォームを作成しています。ドロップダウン メニューなどの入力は非常に扱いにくいため、大きな合格/不合格コマンド ボタンを備えた基本的な入力フォームを使用したいと考えています。個別のコマンド ボックスを使用してフォームを呼び出すのではなく、特定のセルが選択されたときにフォームを呼び出すために、次のコード (オブジェクト/シート内) を使用することにしました。

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 に関連する情報を呼び出し、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

ユーザーはコメントを入力し(該当する場合)、次に「合格」、「不合格」、「合格して続行」、「不合格して続行」の 4 つのボタンのいずれかをクリックします。

「合格」または「不合格」をクリックすると、フォーム内のコードでコメント ボックスのテキストを隣接するセルに返し(オフセットを使用)、アクティブ セルにそれぞれ「P」または「F」を入力して、問題なくユーザー フォームを閉じます(フォームで次のコードを使用)。

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

問題は、ユーザーに「合格して続行」または「不合格して続行」のいずれかをクリックさせたい場合、上記のようなことが起こるはずなのですが、アクティブ セルが 1 つ下に移動し、その行に固有の新しいフォームが開かれてしまうことです。

現在、FORM から「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

別のユーザーのおかげで解決策を見つけました。フォームを呼び出す関数に、セル AI14 (1 から始まる) のフラグ (1 または 0) を検索する IF THEN ステートメントを追加しました。

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  

次に、PASS ボタンと FAIL ボタンのフラグを 1 に戻す変更を追加しました。

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

このコードは、フォームを初期化するためのコードと同じ情報ソースを使用します(元の投稿を参照)

リストの最後の項目に到達したらフラグが 1 に戻るように、「継続」コーディングの最後を整理する必要があります。

お役に立てれば!

関連情報