MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 20.01.2018, 13:02   #1
stephansnet
Neuer Benutzer
Neuer Benutzer
Standard VBA - Daten in Userform einlesen, ändern und zurückschreiben

Hallo Zusammen,

ich stolpere über einen Fehler, den ich nicht sehe.
Ausgang:
Tabelle mit 10 Spalten
Userform mit 1 ListBox und 7 Textboxen

Was funktioniert:
In der Listbox werden die Daten der Tabelle eingelesen und die gewünschten Spalten werden angezeigt.
Aber die Textboxen füllen sich nicht richtig.
TextBox1 soll sein Spalte A
TextBox2 soll sein Spalte C
TextBox3 soll sein Spalte E
TextBox4 soll sein Spalte F
TextBox5 soll sein Spalte G
TextBox6 soll sein Spalte H
TextBox7 soll sein Spalte I

Die Boxen werden aber falsch gefüllt.

Mein Code:
Code:

Option Explicit
Option Compare Text

' ************************************************************************************************
' KONSTANTEN / PARAMETRISIERUNG
' ************************************************************************************************

'Wie viele TextBoxen sind auf der UserForm platziert?
Private Const iCONST_ANZAHL_EINGABEFELDER As Integer = 7

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


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

'Speichern Schaltfläche Ereignisroutine
Private Sub CommandButton1_Click()
    Call EINTRAG_SPEICHERN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub


'Beenden Schaltfläche Ereignisroutine
Private Sub CommandButton2_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


' ************************************************************************************************
' 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
    
    '4 Spalten einrichten
    'Spalte 1: Zeilennummer des Datensatzes
    'Spalte 2: Name (Spalte A)
    'Spalte 3: Telefon (Spalte B)
    'Spalte 4: E-Mail (Spalte C)
    ListBox1.ColumnCount = 4
    
    'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch)
    '";;;"
    ListBox1.ColumnWidths = "0;;;"
    'Feste Breiten: ListBox1.ColumnWidths = "0;100;100;100"
    
    'Um eine Schleife für alle Datensätze zu erhalten benötigen wir die letzte verwendete Zeile
    lZeileMaximum = ActiveSheet.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)
            ListBox1.List(ListBox1.ListCount - 1, 2) = CStr(Tabelle1.Cells(lZeile, 3).Text)
            ListBox1.List(ListBox1.ListCount - 1, 3) = CStr(Tabelle1.Cells(lZeile, 6).Text)
        
        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, 3) = TextBox2
    ListBox1.List(ListBox1.ListIndex, 5) = TextBox3
    ListBox1.List(ListBox1.ListIndex, 6) = TextBox4
    ListBox1.List(ListBox1.ListIndex, 7) = TextBox5
    ListBox1.List(ListBox1.ListIndex, 8) = TextBox6
    ListBox1.List(ListBox1.ListIndex, 9) = TextBox7
    
End Sub
Wo ist hier der Fehler?
stephansnet ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 20.01.2018, 13:28   #2
Nepumuk
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Stephan,

das liegt an dieser Schleife:

Code:

       For i = 1 To iCONST_ANZAHL_EINGABEFELDER
            Me.Controls("TextBox" & i) = CStr(Tabelle1.Cells(lZeile, i).Text)
        Next i
Es werden die Spalten A-G angezeigt. Um die Spalten A, C, E, F, G, H, I anzuzeigen benötigst du ein Array der Spaltennummern.

Beispiel:

Dim vntColumns As Variant
vntColumns = Array(1, 3, 5, 6, 7, 8, 9)
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
    Me.Controls("TextBox" & i) = CStr(Tabelle1.Cells(lZeile, vntColumns(i - 1)).Text)
Next i

Das selbe natürlich beim Zurückschreiben der TextBoxen in die Tabelle.

__________________

Gruß
Nepumuk
Nepumuk ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.01.2018, 11:39   #3
stephansnet
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Oje, stimmt. Danke für den Hinweis. Funktioniert nun wie es soll.

Vielen Dank!

Ich schließe damit das Thema!

Gruß
Stephan
stephansnet ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.