Ich erstelle ein Eingabeformular für die Verwendung mit einem Tablet-PC in Excel, das unsere Leute vor Ort ausfüllen können. Da Eingaben wie Dropdown-Menüs und dergleichen ziemlich knifflig sind, möchte ich ein einfaches Eingabeformular mit großen Pass/Fail-Befehlsschaltflächen verwenden. Anstatt einzelne Befehlsfelder zum Aufrufen des Formulars zu verwenden, habe ich mich dafür entschieden, den folgenden Code (innerhalb des Objekts/Blatts) zu verwenden, um das Formular aufzurufen, wenn bestimmte Zellen ausgewählt werden:
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
Das Eingabeformular ruft Informationen bezüglich der ActiveCell ab, um die Artikelnummer, Beschreibung und Kommentare mithilfe des folgenden Codes im FORMULAR auszufüllen.
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
Dabei soll der Benutzer ggf. einen Kommentar eingeben und anschließend auf eine der vier Schaltflächen „Bestehen“, „Nicht bestehen“, „Bestehen und fortfahren“ und „Nicht bestehen und fortfahren“ klicken.
Wenn sie auf „Bestanden“ oder „Nicht bestanden“ klicken, habe ich Code im Formular, der den Text im Kommentarfeld in die benachbarte Zelle zurücksetzt (mithilfe von Offset), „P“ bzw. „F“ in die aktive Zelle eingibt und das Benutzerformular problemlos schließt (mithilfe des folgenden Codes im FORMULAR).
Private Sub PASSButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
End Sub
Mein Problem besteht darin, dass der Benutzer entweder auf „Bestehen und fortfahren“ oder „Nicht bestehen und fortfahren“ klicken soll, obwohl das oben genannte passieren soll, die aktive Zelle dann jedoch eine Zelle nach unten verschoben wird und ein neues, für diese Zeile spezifisches Formular geöffnet wird.
Unten sehen Sie den Code, den ich derzeit vom FORMULAR für „Pass & Continue“ ausführe. Mein Problem ist, dass ich beim Öffnen des neuen Formulars zwar sehen kann, dass die neue aktive Zelle auf dem Blatt ausgewählt ist, das Formular aber immer noch die Informationen aus der vorherigen aktiven Zelle abruft.
Private Sub PCONTButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
End Sub
Ich habe erfolglos einige Varianten ausprobiert, darunter das Ausblenden des Benutzerformulars (sowohl im FORM-Code als auch im Sheet-Code), aber nachdem ich einige Stunden in diesem (und anderen) Forum herumgestöbert habe, habe ich das Gefühl, dass ich jetzt nur noch im Dunkeln tappe!
Antwort1
Dank eines anderen Benutzers habe ich eine Lösung gefunden. Ich habe der Funktion, die das Formular aufruft, eine zusätzliche IF THEN-Anweisung hinzugefügt, die nach einer Flagge (entweder 1 oder 0) in Zelle AI14 (die mit 1 beginnt) sucht:
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
Ich habe dann eine Flag-Änderung zurück auf 1 für die Schaltflächen „PASS“ und „FAIL“ hinzugefügt:
Private Sub PASSButton_Click()
Range("AI14") = 1
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
PFInputForm.Hide
End Sub
Ich lasse die Flag-Änderung bei den „Weiter“-Buttons weg, um das Flag auf Null zu belassen, damit der obere Code nicht fortgesetzt wird. Dann habe ich dem Code des „Weiter“-Buttons zusätzlichen Inhalt hinzugefügt, damit er die zugehörigen Informationen aus der neuen ActiveCell durchzieht:
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
Dieser Code verwendet die gleiche Informationsquelle wie der Code zum Initialisieren des Formulars (siehe Originalbeitrag).
Ich muss nur das Ende der „Weiter“-Codierung aufräumen, sodass das Flag auf 1 zurückgesetzt wird, sobald das letzte Element in der Liste erreicht wurde.
Hoffe das hilft!