Excel '97: ListBox in UserForm befüllen und bearbeiten

polaroid

Vice Admiral
Registriert
Nov. 2007
Beiträge
6.785
Hallo zusammen.

Ich bin dabei eine UserForm zu basteln. Hier geht es darum eine zweispaltige Exceltabelle über diese UserForm zu befüllen, zu bearbeiten und Daten daraus zu löschen, sprich den Namen und dessen E-Mail Adresse zu bearbeiten. Das Ganze soll wie gesagt über eine UserForm geschehen, die im Anhang zu sehen ist. Leider bin ich in der VBA Programmierung nicht so bewandert, als dass ich jetzt wüsste, warum mein Projekt nur so halb funktioniert, weswegen ich auf eure Hilfe angewiesen bin! :)

Der Code der UserForm sieht bisher folgendermaßen aus:

Code:
Option Explicit

Private Sub cmdAbbrechen_Click()
Unload Me
End Sub




Private Sub cmdÄndernVB_Click()
'Datensatz ändern
Dim lng As Long
Dim i As Integer

On Error Resume Next
'ListBox.ColumnCount
lng = UserForm2.ListBox1.Column(2)
Sheets("VB").Activate
With UserForm2
 Cells(2, 1).Value = .UserForm2.TextBox1.Value
 Cells(2, 2).Value = .UserForm2.TextBox2.Value '& "@lalala.de"

  
 'Listbox aktualisieren
 i = .ListBox1.ListIndex
  .ListBox1.Column(0, i) = .TextBox1.Value
  .ListBox1.Column(1, i) = .TextBox2.Value
End With
End Sub

Private Sub cmdLöschen_Click()
'Datensatz löschen
Dim lng As Long

On Error Resume Next
Sheets("VB").Activate
lng = UserForm2.ListBox1.Column(1)

Sheets("VB").Rows(lng).Delete
FelderLöschenVB
End Sub



Private Sub cmdSuchen_Click()
'Suche im Datenstamm
 SuchVB
End Sub

Private Sub cmdTextfelderLeeren_Click()
 FelderLöschen
End Sub



Private Sub CommandButton1_Click()
 SucheName
End Sub

Private Sub ListBox1_Click()
Dim lng As Integer

Sheets("VB").Activate
  lng = UserForm2.ListBox1.Column(2)
  With UserForm2
   TextBox1.Value = Cells(lng, 1).Value
   TextBox2.Value = Cells(lng, 2).Value
   
  End With
End Sub



Private Sub UserForm2_Initialize()
Dim UserForm2 As Worksheet
Dim i As Integer
 
Set tblDaten = Worksheets("Erfassung")
'Titel der UserForm
UserForm2.Caption = Sheets("VB").Cells(1, 1).Value & (" Eingabemaske")

End With

End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 If CloseMode = vbFormControlMenu Then
  MsgBox "Schließen Sie die Userform über die Schaltfläche Abbrechen!", _
  vbInformation
  Cancel = True
 End If
End Sub





Private Sub cmdNeu_Click()
'Datensatz anlegen
Dim Dia2 As UserForm2
Dim lng As Long
Dim Treffer As Range
Dim i As Integer


If Me.TextBox1.Value = "" Then
 MsgBox "Sie müssen einen " & Me.Label1.Caption & " angeben!"
 Exit Sub
End If

Set Treffer = DATEN.Columns(1).Find(what:=Me.TextBox1.Value, lookat:=xlWhole)

If Treffer Is Nothing Then
 lng = Range("A65536").End(xlUp).Offset(1, 0).Row
Else
i = MsgBox("Dieser Satz wurde bereits erfasst! Überschreiben?", vbYesNo + vbQuestion)
If i = 2 Then
 lng = Treffer.Row
Else
 Exit Sub
End If
End If


End Sub



Private Sub UserForm_Activate()
    ListBox1.ColumnCount = 2
    
    
    Label1.Caption = _
    ThisWorkbook.Sheets(2).Range("A1").Text
    Label2.Caption = _
    ThisWorkbook.Sheets(2).Range("B1").Text
    
    UserForm2.Label11.Caption = UserForm2.Label1.Caption
    UserForm2.Label12.Caption = UserForm2.Label2.Caption
    
 
    
    'Titel der UserForm
    UserForm2.Caption = "VB Erfassung"


End Sub

Und das entsprechende Modul dazu:

Code:
Sub Dia2()
 UserForm2.Show
End Sub


Sub FelderLöschenVB()
Dim tb As Object

With UserForm2
 .ListBox1.Clear
    For Each tb In .Controls
      If TypeName(tb) = "TextBox" Then tb.Text = ""
    Next tb
 End With
End Sub


Sub SuchVB()
Dim lng As Long
Dim i As Integer

Application.ScreenUpdating = False
With UserForm2
 .ListBox1.Clear
 Sheets("VB").Activate
 i = 0
For lng = 2 To ActiveSheet.UsedRange.Rows.Count
If InStr(LCase(Cells(lng, 1).Value), LCase(.TextBox1.Value)) > 0 Then
  .ListBox1.AddItem Cells(lng, 1).Value
  .ListBox1.Column(1, i) = Cells(lng, 2).Value
  .ListBox1.Column(2, i) = Cells(lng, 3).Row


Else
'
'End With
End If
Next lng


End With
Application.ScreenUpdating = True
End Sub

Vielen vielen Dank für eure Hilfe!

Beste Grüße, Christian
 

Anhänge

  • Eingabemaske VB.JPG
    Eingabemaske VB.JPG
    60,2 KB · Aufrufe: 1.469
Guten Morgen,
und als erstes möchte Ich sage... Excel '97? Wow!

Was funktioniert denn nicht?
 
Jaa :D Wir warten täglich auf die Umstellung auf Windows 7. :D

Also folgende Fehler sind mir bisher aufgefallen:

- Wenn ich das Makro SuchVB starte, werden in der ListBox die richtigen VB, allerdings mit der falschen beziehungsweise gar keiner Email Adresse. Diese Daten sollte er eigentlich aus der Excel Tabelle nehmen, wo die Information VB in Spalte 1 und die E-Mail in Spalte 2 zu finden ist

- Wenn ich aus diesen Suchergebnissen eines anwähle, stürzt das ganze ab und ich bekomme die Fehlermeldung "Laufzeitfehler '94': Ungültige Verwendung von Null

- Wenn ich einen Namen in das Suchfenster eingebe, wird dieser zwar mit den richtigen Informationen gefunden, wenn ich allerdings auf Datensatz ändern gehe, wird der Datensatz eben gerade nicht geändert

- Wenn ich neue Informationen in die beiden Felder eingebe, werden diese nicht in die Excel Tabelle übertragen


Ich weiß das ist ziemlich viel auf einmal. Aber ich nehme jede kleine Hilfe dankend an. :)

LG
 
polaroid schrieb:
- Wenn ich das Makro SuchVB starte, werden in der ListBox die richtigen VB, allerdings mit der falschen beziehungsweise gar keiner Email Adresse. Diese Daten sollte er eigentlich aus der Excel Tabelle nehmen, wo die Information VB in Spalte 1 und die E-Mail in Spalte 2 zu finden ist
Du fügst die Daten immer in Zeile i hinzu (.Column(x, i)). i wird aber nie erhöht sondern bleibt immer 0, daher landet die zweite E-Mailadresse wieder in der ersten Zeile.

Code:
If InStr(LCase(Cells(lng, 1).Value), LCase(.TextBox1.Value)) > 0 Then
  .ListBox1.AddItem Cells(lng, 1).Value
  .ListBox1.Column(1, i) = Cells(lng, 2).Value
  .ListBox1.Column(2, i) = Cells(lng, 3).Row

'*****************
  i = i + 1 ' i in jedem Durchgang in dem ein Datensatz gefunden wurde um +1 erhöhen
'*****************

- Wenn ich aus diesen Suchergebnissen eines anwähle, stürzt das ganze ab und ich bekomme die Fehlermeldung "Laufzeitfehler '94': Ungültige Verwendung von Null
Funktioniert, wenn der obige Fehler beseitigt wurde.

- Wenn ich einen Namen in das Suchfenster eingebe, wird dieser zwar mit den richtigen Informationen gefunden, wenn ich allerdings auf Datensatz ändern gehe, wird der Datensatz eben gerade nicht geändert
Die Schaltfläche hat auch keinerlei Code ;)
Code:
Private Sub cmdÄndern_Click()
'*****************
'nichts vorhanden
'*****************
End Sub

- Wenn ich neue Informationen in die beiden Felder eingebe, werden diese nicht in die Excel Tabelle übertragen
Ändere mal
Code:
Set Treffer = DATEN.Columns(1).Find(what:=Me.TextBox1.Value, lookat:=xlWhole)
in
Code:
Set Treffer = Range("A:A").Find(Me.TextBox1.Value)
Allerdings passiert in deinem Makro bislang nichts weiter, als dass die nächste freie Zeile gefunden wird, in der der Eintrag gespeichert werden könnte.
 
Oh man 1000 Dank! (mit ein paar Satzzeichen mehr :) ) Werde ich am Montag gleich mal alles einbauen. :)


Kannst du mir auch sagen wie man die restlichen Fehler noch beseitigt? Bei der Schaltfläche cmd_Ändern ist der Code:
Private Sub cmdÄndernVB_Click()
'Datensatz ändern
Dim lng As Long
Dim i As Integer

On Error Resume Next
'ListBox.ColumnCount
lng = UserForm2.ListBox1.Column(2)
Sheets("VB").Activate
With UserForm2
Cells(2, 1).Value = .UserForm2.TextBox1.Value
Cells(2, 2).Value = .UserForm2.TextBox2.Value '& "@lalala.de"


'Listbox aktualisieren
i = .ListBox1.ListIndex
.ListBox1.Column(0, i) = .TextBox1.Value
.ListBox1.Column(1, i) = .TextBox2.Value

End With
End Sub

drin, und der ist falsch meinst du?


2. Zum letzten Punkt.. Wie macht man das dann dass er in diese Zeile die er durch das Makro gefunden hat den neuen Eintrag abspeichert? Wäre wunderbar wenn du mir noch kurz helfen könntest! :)

LG
 
Zuletzt bearbeitet:
Ich sehe gerade, dass du zwei Makros hast - entweder hast du da mal zwischendurch den Namen des Makros geändert oder den Namen des Buttons - so dass der Button beim Klick im Moment das falsche - leere - Makro startet.

Direkt nach deinem geposteten Code folgt:

Private Sub cmdÄndernVB_Click()
'dein Code
End Sub

Private Sub cmdÄndern_Click()

End Sub
Dein Button führt zu dem zweiten Makro. Am einfachsten kopierst du deinen Code von oben in das untere Sub cmdÄndern_Click() und löscht dein Sub cmdÄndernVB_Click()


Damit der neue Datesatz gespeichert wird, musst du die Werte aus den beiden Textboxen in die gewünschten Zellen packen:

Code:
If Treffer Is Nothing Then
  lng = Range("A65536").End(xlUp).Offset(1, 0).Row 'findet die nächste freie Zeile'
  Range("A" & lng).Value = UserForm2.TextBox1.Value 'schreibt Textbox1 in Spalte A'
  Range("B" & lng).Value = UserForm2.TextBox2.Value 'schreibt Textbox2 in Spalte B'
Else
...

Übrigens prüfst du im Moment lediglich, ob in der ersten Textbox ein Wert eingegeben wurde:
Code:
If Me.TextBox1.Value = "" Then
  MsgBox "Sie müssen einen " & Me.Label1.Caption & " angeben!"
  Exit Sub
End If
Die zweite Textbox prüfst du nicht.
Code:
If Me.TextBox1.Value = "" Or Me.TextBox2.Value = "" Then
  If Me.TextBox1.Value = "" then MsgBox "Sie müssen einen " & Me.Label1.Caption & " angeben!"
  If Me.TextBox2.Value = "" then MsgBox "Sie müssen einen " & Me.Label2.Caption & " angeben!"
  Exit Sub
End If
 
Zuletzt bearbeitet:
Zurück
Oben