Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ListBox
BildScreenshot zu ListBox ListBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Markierte Zeile in Userform darstellen

Betrifft: Markierte Zeile in Userform darstellen von: Anja
Geschrieben am: 03.09.2020 15:53:53

Hallo zusammen,


ich verzweifel….


Ich habe eine Eingabemaske, die Daten in einer Tabelle speichert.

Die eingegeben Daten werden in einer Listbox angezeigt:


ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle1.Cells(lZeile, 1).Text) 'Mastnr

ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle1.Cells(lZeile, 2).Text) 'Ortsteil

ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle1.Cells(lZeile, 3).Text) 'Straße

ListBox1.List(ListBox1.ListCount - 1, 4) = CStr(Tabelle1.Cells(lZeile, 4).Text) 'Hausnr

ListBox1.List(ListBox1.ListCount - 1, 5) = CStr(Tabelle1.Cells(lZeile, 6).Text) 'Mastart

ListBox1.List(ListBox1.ListCount - 1, 6) = CStr(Tabelle1.Cells(lZeile, 7).Text) 'Werkstoff

ListBox1.List(ListBox1.ListCount - 1, 7) = CStr(Tabelle1.Cells(lZeile, 9).Text) 'Ereignisdatum

ListBox1.List(ListBox1.ListCount - 1, 8) = CStr(Tabelle1.Cells(lZeile, 10).Text) 'Prognose

ListBox1.List(ListBox1.ListCount - 1, 9) = CStr(Tabelle1.Cells(lZeile, 11).Text) 'Bemerkung


und in eine Tabelle übergeben.


ListBox1.List(ListBox1.ListIndex, 1) = TextBox1

ListBox1.List(ListBox1.ListIndex, 2) = TextBox2

ListBox1.List(ListBox1.ListIndex, 3) = TextBox3

ListBox1.List(ListBox1.ListIndex, 4) = TextBox4

ListBox1.List(ListBox1.ListIndex, 5) = TextBox6

ListBox1.List(ListBox1.ListIndex, 6) = TextBox7

ListBox1.List(ListBox1.ListIndex, 7) = TextBox9

ListBox1.List(ListBox1.ListIndex, 8) = TextBox10

ListBox1.List(ListBox1.ListIndex, 9) = TextBox11




Private Sub EINTRAG_ANLEGEN()
 Dim lZeile As Long
    
    lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE
    'Schleife bis eine leere ungebrauchte Zeile gefunden wird
    Do While IST_ZEILE_LEER(lZeile) = False
        lZeile = lZeile + 1 'Nächste Zeile bearbeiten
    Loop
    
    'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
    Tabelle1.Cells(lZeile, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
    
    'Und neuen Eintrag in die UserForm eintragen
    ListBox1.AddItem lZeile
    ListBox1.List(ListBox1.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
    ListBox1.List(ListBox1.ListCount - 1, 2) = ""
    ListBox1.List(ListBox1.ListCount - 1, 3) = ""
    
    'Den neuen Eintrag markieren mit Hilfe des ListIndex
    ListBox1.ListIndex = ListBox1.ListCount - 1
    'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
    
    'Und dem Benutzer direkt noch den Cursor in das erste Eingabefeld stellen und alles  _
vorselektieren,
    'so kann der Benutzer direkt loslegen mit der Dateneingabe.
    TextBox1.SetFocus
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1)
    
End Sub


Nun möchte ich den umgekehrte Weg gehen: In der Tabelle möchte ich eine Zeile markieren und mit Doppelklick mir alle Felder in der Eingabemaste anzeigen lassen.


Diesen Code habe ich:

Option Explicit


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim iIndx  As Integer
 
    For iIndx = 1 To 8
       UserForm1.Controls("TextBox" & iIndx).Value = Cells(Target.Row, iIndx).Value
           Next iIndx
     
    UserForm1.Show
 End Sub


Wenn ich nun eine Zeile markiere und einen Doppelklick ausführe wird nur die Userform geöffnet und der erste Datensatz angezeigt. Leider nicht der markierte.


Kann mir jemand helfen? Was mache ich falsch?

Betrifft: AW: Markierte Zeile in Userform darstellen
von: ralf_b
Geschrieben am: 03.09.2020 17:26:43

was passiert denn in der initialize oder activate Methode der Userform?
zeig mal den ganzen Code.

Betrifft: AW: Markierte Zeile in Userform darstellen
von: Anja
Geschrieben am: 03.09.2020 19:33:28

Das ist der Code.

Option Explicit
Option Compare Text
' ************************************************************************************************
'
'
'Wie viele TextBoxen sind auf der UserForm platziert?
Private Const iCONST_ANZAHL_EINGABEFELDER As Integer = 11

'In welcher Zeile starten die Eingaben?
Private Const lCONST_STARTZEILENNUMMER_DER_TABELLE As Long = 2


' ************************************************************************************************
' EREIGNISROUTINEN DER USERFORM
' ************************************************************************************************


'Neuer Eintrag Schaltfläche Ereignisroutine
Private Sub CommandButton1_Click()
    Call EINTRAG_ANLEGEN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub
'Löschen Schaltfläche Ereignisroutine
Private Sub CommandButton2_Click()
    Call EINTRAG_LOESCHEN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub
'Speichern Schaltfläche Ereignisroutine
Private Sub CommandButton3_Click()
    Call EINTRAG_SPEICHERN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub
'Beenden Schaltfläche Ereignisroutine
Private Sub CommandButton4_Click()
    Unload Me
End Sub
'Klick auf die ListBox Ereignisroutine
Private Sub ListBox1_Click()
    Call EINTRAG_LADEN_UND_ANZEIGEN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub
'Diese Ereignisroutine wird beim Anzeigen der UserForm ausgeführt
Private Sub UserForm_Activate()
    If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0 '1. Eintrag selektieren
End Sub
'Startroutine, wird ausgeführt bevor die Eingabemaske angezeigt wird
Private Sub Userform_initialize()
    Call LISTE_LADEN_UND_INITIALISIEREN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub

Private Sub CommandButton5_Click()

Dim rngTreffer As Range
 With Tabelle1
 'Spalte A nach Wert durchsuchen
 Set rngTreffer = Sheets("Tabelle1").Range("A:K").Find(What:=TextBox1.Value, LookAt:=xlWhole)
 'Wenn Wert gefunden
 If Not rngTreffer Is Nothing Then
    
     Me.TextBox2.Value = rngTreffer.Offset(0, 1).Value
     Me.TextBox3.Value = rngTreffer.Offset(0, 2).Value
     Me.TextBox4.Value = rngTreffer.Offset(0, 3).Value
     Me.TextBox5.Value = rngTreffer.Offset(0, 4).Value
     Me.TextBox6.Value = rngTreffer.Offset(0, 5).Value
     Me.TextBox7.Value = rngTreffer.Offset(0, 6).Value
     Me.TextBox8.Value = rngTreffer.Offset(0, 7).Value
     Me.TextBox9.Value = rngTreffer.Offset(0, 8).Value
   
      Else
    If rngTreffer Is Nothing Then
         MsgBox "Nichts gefunden"
       End If
         Exit Sub
 
 End If
End With
 End Sub


' ************************************************************************************************
' VERARBEITUNGSROUTINEN
' ************************************************************************************************

'Diese Routine wird aufgerufen um die Liste (ListBox1) zu leeren, einzustellen und neu zu füllen
Private Sub LISTE_LADEN_UND_INITIALISIEREN()
  Dim lZeile As Long
  Dim lZeileMaximum As Long
  Dim i As Integer
  
    'Alle TextBoxen leer machen
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Me.Controls("TextBox" & i) = ""
    Next i

    ListBox1.Clear 'Liste leeren
    
    '9 Spalten einrichten + 1 Zeilennummerspalte (mehr als 10 Spalten sind in einer Listbox  _
nicht möglich
    'Spalte 1: Mastnr (Spalte A)
    'Spalte 2: Ortsteil (Spalte B)
    'usw.
    ListBox1.ColumnCount = 10
    
    'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch)
    '";;;"
    ListBox1.ColumnWidths = "0;30;50;50;40;50;50;50;50;90"
    'Feste Breiten: ListBox1.ColumnWidths = "0;20;30;30,20,30,20;40;20;40;30"
    
    'Um eine Schleife für alle Datensätze zu erhalten benötigen wir die letzte verwendete Zeile
    lZeileMaximum = Tabelle1.UsedRange.Rows.Count 'Benutzer Bereich auslesen
    
    For lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE To lZeileMaximum
        
        'Nur wenn die Zeile benutzt / nicht leer ist, zeigen wir etwas an:
        If IST_ZEILE_LEER(lZeile) = False Then
            
            'Spalte 1 der Liste mit der Zeilennummer füllen
            ListBox1.AddItem lZeile
            
            'Spalten 2 bis 4 der Liste füllen
            ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle1.Cells(lZeile, 1).Text) ' _
Mastnr
            ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle1.Cells(lZeile, 2).Text) ' _
Ortsteil
            ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle1.Cells(lZeile, 3).Text) ' _
Straße
            ListBox1.List(ListBox1.ListCount - 1, 4) = CStr(Tabelle1.Cells(lZeile, 4).Text) ' _
Hausnr
            ListBox1.List(ListBox1.ListCount - 1, 5) = CStr(Tabelle1.Cells(lZeile, 6).Text) ' _
Mastart
            ListBox1.List(ListBox1.ListCount - 1, 6) = CStr(Tabelle1.Cells(lZeile, 7).Text) ' _
Werkstoff
            ListBox1.List(ListBox1.ListCount - 1, 7) = CStr(Tabelle1.Cells(lZeile, 9).Text) ' _
Ereignisdatum
            ListBox1.List(ListBox1.ListCount - 1, 8) = CStr(Tabelle1.Cells(lZeile, 10).Text) ' _
Prognose
            ListBox1.List(ListBox1.ListCount - 1, 9) = CStr(Tabelle1.Cells(lZeile, 11).Text) ' _
Bemerkung
            
           
            
        End If
        
    Next lZeile
    
End Sub

Private Sub EINTRAG_LADEN_UND_ANZEIGEN()
  Dim lZeile As Long
  Dim i As Integer
    
    'Eingabefelder resetten
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Me.Controls("TextBox" & i) = ""
    Next i
    
    'Nur wenn ein Eintrag selektiert/markiert ist
    If ListBox1.ListIndex >= 0 Then
           
        'Die Zeilennummer des Datensatzes steht in der ersten ausgeblendeten Spalte der Liste,
        'somit können wir direkt zugreifen.
        lZeile = ListBox1.List(ListBox1.ListIndex, 0)
        
        For i = 1 To iCONST_ANZAHL_EINGABEFELDER
            Me.Controls("TextBox" & i) = CStr(Tabelle1.Cells(lZeile, i).Text)
        Next i
            
    End If
    
End Sub

Private Sub EINTRAG_SPEICHERN()
 Dim lZeile As Long
 Dim i As Integer
 
    'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
    If ListBox1.ListIndex = -1 Then Exit Sub
   
    'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
    lZeile = ListBox1.List(ListBox1.ListIndex, 0)
    
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Tabelle1.Cells(lZeile, i) = Me.Controls("TextBox" & i)
    Next i
    
    'Der Benutzer könnte die angezeigten Werte in der Liste geändert haben,
    'daher aktualisieren wir den ausgewählten Eintrag entsprechend.
    ListBox1.List(ListBox1.ListIndex, 1) = TextBox1
    ListBox1.List(ListBox1.ListIndex, 2) = TextBox2
    ListBox1.List(ListBox1.ListIndex, 3) = TextBox3
    ListBox1.List(ListBox1.ListIndex, 4) = TextBox4
    ListBox1.List(ListBox1.ListIndex, 5) = TextBox6
    ListBox1.List(ListBox1.ListIndex, 6) = TextBox7
    ListBox1.List(ListBox1.ListIndex, 7) = TextBox9
    ListBox1.List(ListBox1.ListIndex, 8) = TextBox10
    ListBox1.List(ListBox1.ListIndex, 9) = TextBox11
   
    
End Sub

Private Sub EINTRAG_LOESCHEN()
 Dim lZeile As Long
  
    'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
    If ListBox1.ListIndex = -1 Then Exit Sub
  
    'Beim Löschen fragen wir zuerst den Benutzer noch einmal sicherheitshalber:
    If MsgBox("Sie möchten den markierten Datensatz wirklich löschen?", _
              vbQuestion + vbYesNo, "Sicherheitsabfrage!") = vbYes Then
  
        'Nur wenn er mit  antwortet, löschen wir auch!
  
        'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes
        lZeile = ListBox1.List(ListBox1.ListIndex, 0)
        
        'Die ganze Zeile wird nun gelöscht
        Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete
        
        'Und den Eintrag in der Liste müssen wir auch noch entfernen
        ListBox1.RemoveItem ListBox1.ListIndex
    
    End If
    
End Sub

Private Sub EINTRAG_ANLEGEN()
 Dim lZeile As Long
    
    lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE
    'Schleife bis eine leere ungebrauchte Zeile gefunden wird
    Do While IST_ZEILE_LEER(lZeile) = False
        lZeile = lZeile + 1 'Nächste Zeile bearbeiten
    Loop
    
    'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
    Tabelle1.Cells(lZeile, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
    
    'Und neuen Eintrag in die UserForm eintragen
    ListBox1.AddItem lZeile
    ListBox1.List(ListBox1.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
    ListBox1.List(ListBox1.ListCount - 1, 2) = ""
    ListBox1.List(ListBox1.ListCount - 1, 3) = ""
    
    'Den neuen Eintrag markieren mit Hilfe des ListIndex
    ListBox1.ListIndex = ListBox1.ListCount - 1
    'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
    
    'Und dem Benutzer direkt noch den Cursor in das erste Eingabefeld stellen und alles  _
vorselektieren,
    'so kann der Benutzer direkt loslegen mit der Dateneingabe.
    TextBox1.SetFocus
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1)
    
End Sub

' ************************************************************************************************
' HILFSFUNKTIONEN
' ************************************************************************************************

'Ermittelt, ob eine Zeile in Benutzung ist...
Private Function IST_ZEILE_LEER(ByVal lZeile As Long) As Boolean
  Dim i As Long
  Dim sTemp As String
  
    'Hilfsvariable initialisieren
    sTemp = ""
    
    'Um zu erkennen, ob eine Zeile komplett leer/ungebraucht ist
    'verketten wir einfach alle Spalteninhalte der Zeile miteinander.
    'Ist die zusammengesetzte Zeichenkette aller Spalten leer,
    'ist die Zeile nicht genutzt...
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        sTemp = sTemp & Trim(CStr(Tabelle1.Cells(lZeile, i).Text))
    Next i
    
    'Rückgabewert festlegen
    If Trim(sTemp) = "" Then
        'Die Zeile ist leer
        IST_ZEILE_LEER = True
    Else
        'Die Zeile ist mindestens in einer Spalte gefüllt
        IST_ZEILE_LEER = False
    End If
    
End Function
Lieben Gruß

Anja

Betrifft: AW: Markierte Zeile in Userform darstellen
von: ralf_b
Geschrieben am: 03.09.2020 21:08:43

beim Aktivieren der Userform wird die folgende Sub ausgeführt. wie der Name schon sagt.
Private Sub UserForm_Activate()
    If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0 '1. Eintrag selektieren
End Sub
und hier drin wird der erste Listeneintrag ausgewählt.

Da du das offensichtlich nicht weist, gehe ich davon aus, das du vom Rest des Programmcodes auch keinen Plan hast. Basiskenntnisse in VBA schließt das Wissen über diese Grundzüge einer Userform mit ein.



Betrifft: AW: Markierte Zeile in Userform darstellen
von: Anja
Geschrieben am: 04.09.2020 12:14:46

Lieber Ralf,

ja, du hast recht, ich bin ein VBA-Neuling.

Und nein, ich verstehe diesen Script schon. Jedoch nur, wenn er bereits geschrieben ist und ich ihn nur verändern muss.
Und ja, ich bin noch soweit Neuling, dass ich komplexere Anwendungen nicht selbst schreiben kann.

ABER, ich bemühe mich!
Und, wenn ich einen Fehler in diesem Forum gemacht habe, tut es mir sehr leid. Ich bitte es mir nachzusehen.

Und nun weiss ich aufgrund deiner Antwort zumindest, dass ich Doubleclick im Script der Userform unterbringen muss.

Jedoch bekomme ich nicht beide Formularaufrufe unter einen Hut.

Zum einen per Button und zum anderen mittels Doppelklick. Entweder wird die erste Zeile _ angezeigt, gemäß
Private Sub UserForm_Activate()
    If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0 '1. Eintrag selektieren
End Sub
Oder aber, die ausgewählte Zeile wird tatsächlich angezeigt, aber mit Laufzeitfehler 380.

Gruß

Anja

Betrifft: AW: Markierte Zeile in Userform darstellen
von: ralf_b
Geschrieben am: 04.09.2020 17:05:42

danke für dein Verständnis.

als Helfer bei Programmierproblemen möchte man die Fehlermeldungen nachvollziehen können. Ich baue ungern Dateien nach. Das klappt meist nicht wirklich und verschwendet nur Zeit. Also lade deine Datei hoch und dann sehen wir mal wie das Problem umschifft werden kann. Möglicherweise ist auch der Workflow nicht wirklich praktikabel und bedarf einer näheren Betrachtung. VBA kann zwar Einiges aber nicht Alles.

Beiträge aus dem Excel-Forum zum Thema "Markierte Zeile in Userform darstellen"