Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1780to1784
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Markierte Zeile in Userform darstellen

Markierte Zeile in Userform darstellen
03.09.2020 15:53:53
Anja
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?

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Markierte Zeile in Userform darstellen
03.09.2020 17:26:43
ralf_b
was passiert denn in der initialize oder activate Methode der Userform?
zeig mal den ganzen Code.
AW: Markierte Zeile in Userform darstellen
03.09.2020 19:33:28
Anja
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
Anzeige
AW: Markierte Zeile in Userform darstellen
03.09.2020 21:08:43
ralf_b
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.
AW: Markierte Zeile in Userform darstellen
04.09.2020 12:14:46
Anja
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
Anzeige
AW: Markierte Zeile in Userform darstellen
04.09.2020 17:05:42
ralf_b
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.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige