Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1672to1676
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

Codezeile einfügen

Codezeile einfügen
07.02.2019 10:09:37
Helmut
Guten Morgen VBA'ler
Ich poste hier einen Code, der um eine Zeile erweitert werden soll. Jedoch weiß ich nicht wie die Zeile aussehen soll bzw. wo sie eingefügt gehört. Hier eine kurze Erklärung: es werden mehrere Spalten in List Box 2 eingelesen, nun möchte ich, wenn ich eine Zeile in der Listbox anklicke, dass diese mir in Zelle A1 eingetragen wird. Vielleicht erreiche ich den Autor dieses Codes-Nepumuk, ansonsten bin ich für jede Hilfe dankbar.

  • Option Explicit
    Private Sub ComboBox1_Change()
    Dim objFindCell As Range, objCell As Range
    Dim strFirstAddress As String
    'Listbox2 loeschen da sich der Wert der Combobox geaendert hat
    Call ListBox2.Clear
    'Pruefen ob eine Leiterlaenge ausgewaehlt wurde denn das Ereignis
    'wird auch durch das Loeschen der Combobox ausgeloest
    If ComboBox1.ListIndex >= 0 Then
    'Verweis auf die Spalte 14 in der Tabelle 'Datenbank1' oeffnen
    With WksDB1.Columns(14)
    'Suche nach dem Ausgewaehlten Wert von Listbox1
    Set objFindCell = .Find(What:=ListBox1.Text, After:=.Cells(1, 1), _
    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
    'Wenn der Wert gefunden wurde
    If Not objFindCell Is Nothing Then
    'Adresse der Fundstelle merken
    strFirstAddress = objFindCell.Address
    'Schleife beginnen
    Do
    'Schleife ueber alle Einzelzellen des verbundenen Bereiches
    For Each objCell In objFindCell.MergeArea
    'Wenn der Wert in der Zelle dem ausgewaehlten Wert in der Combobox  _
    entspricht
    If objCell.Offset(0, 3).Value = CLng(ComboBox1.Value) Then
    'Verweis auf die Listbox oeffnen
    With ListBox2
    'Leere Zeile hinzufuegen
    Call .AddItem
    'Die gewuenschten Werte dieser Zeile uebergeben
    .List(.ListCount - 1, 0) = objCell.Offset(0, 9).Value
    .List(.ListCount - 1, 1) = objCell.Offset(0, 5).Value
    .List(.ListCount - 1, 2) = objCell.Offset(0, 7).Value
    .List(.ListCount - 1, 3) = objCell.Offset(0, -7).Value
    .List(.ListCount - 1, 4) = objCell.Offset(0, -8).Value '######## _
    _
    End With
    End If
    Next
    'Naechsten Eintrag suchen
    Set objFindCell = .FindNext(After:=objFindCell)
    'Wenn kein Wert gefunden wurde Schleife verlassen
    If objFindCell Is Nothing Then Exit Do
    'Wenn die erste Fundstelle wieder gefunden wurde Schleife verlassen
    Loop Until objFindCell.Address = strFirstAddress
    'Objektvariable resetten
    Set objFindCell = Nothing
    'In das Label2 die Anzahl der gefundenen Leitern eintragen
    Label2.Caption = CStr(ListBox2.ListCount) & " Leitern vorhanden"
    End If
    End With
    End If
    End Sub
    
    Private Sub CommandButton1_Click()
    'Userform schliessen
    Call Unload(Object:=Me)
    End Sub
    
    Private Sub ListBox1_Change()
    Dim objFindCell As Range, objCell As Range
    Dim objDictionary As Object
    Dim strFirstAddress As String
    'Listbox2 loeschen
    Call ListBox2.Clear
    'Combobox1 loeschen
    Call ComboBox1.Clear
    'Label2 loeschen
    Label2.Caption = vbNullString
    'Verweis auf die Spalte 14 in der Tabelle 'Datenbank1' oeffnen
    With WksDB1.Columns(14)
    'Suche nach dem Ausgewaehlten Wert von Listbox1
    Set objFindCell = .Find(What:=ListBox1.Value, After:=.Cells(1, 1), _
    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
    'Wenn der Wert gefunden wurde
    If Not objFindCell Is Nothing Then
    'Adresse der Fundstelle merken
    strFirstAddress = objFindCell.Address
    'Dictionary initialisieren ein Dictionary ist ein Array mit einem Wert und einem  _
    eindeutigen Schluessel
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    'Schleife beginnen
    Do
    'Schleife ueber alle Einzelzellen des verbundenen Bereiches
    For Each objCell In objFindCell.MergeArea
    'Verweis auf die Zelle drei Spalten nach rechts oeffnen
    With objCell.Offset(0, 3)
    'Wenn die Zelle nicht leer ist dann dem Dictionary mit dem
    'Zellwert als Schluessel einen leeren String zuweisen
    'Wenn der Schluessel noch nicht existiert wird er angelegt,
    'wenn er schon existiert passiert nichts
    If .Value  vbNullString Then objDictionary(.Value) = vbNullString
    End With
    Next
    'Naechsten Eintrag suchen
    Set objFindCell = .FindNext(After:=objFindCell)
    'Wenn kein Wert gefunden wurde Schleife verlassen
    If objFindCell Is Nothing Then Exit Do
    'Wenn die erste Fundstelle wieder gefunden wurde Schleife verlassen
    Loop Until objFindCell.Address = strFirstAddress
    'Der Combobox die Schlssel des Dictionary uebergeben
    ComboBox1.List = objDictionary.Keys
    'Eintraege der Combobox sortieren
    Call QuickSort(0, ComboBox1.ListCount - 1, ComboBox1)
    'Objektvariablen resetten
    Set objDictionary = Nothing
    Set objFindCell = Nothing
    End If
    End With
    End Sub
    

    Private Sub UserForm_Activate()
    Dim avntValues As Variant, vntItem As Variant
    Dim objDictionary As Object
    'Verweis auf die Tabelle 'Datenbank1' oeffnen
    With WksDB1
    'Alle Werte ab Zeile 3 bis zur letzten benutzten Zeile der Spalte 14 in ein Aray  _
    einlesen
    avntValues = .Range(.Cells(3, 14), .Cells(.Rows.Count, 14).End(xlUp)).Value
    End With
    'Dictionary initialisieren ein Dictionary ist ein Array mit einem Wert und einem  _
    eindeutigen Schluessel
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    'Schleife ueber alle Werte im Array
    For Each vntItem In avntValues
    'Wenn der Eintrag nicht leer ist dann dem Dictionary mit
    'dem Arraywert als Schluessel einen leeren String zuweisen
    'Wenn der Schluessel noch nicht existiert wird er angelegt,
    'wenn er schon existiert passiert nichts
    If Not IsEmpty(vntItem) Then objDictionary(vntItem) = vbNullString
    Next
    'Der Listbox1 die Schluessel des Dictionarys uebergeben
    ListBox1.List = objDictionary.Keys
    'Objektvariable resetten
    Set objDictionary = Nothing
    End Sub
    
    Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, ByRef probjComboBox  _
    _
    As MSForms.ComboBox)
    'Eine Erklaerung des QuickSorts findest du hier: https://de.wikipedia.org/wiki/Quicksort
    Dim lngIndex1 As Long, lngIndex2 As Long, vntBuffer As Variant, lngTemp As Long
    lngIndex1 = pvlngLBound
    lngIndex2 = pvlngUBound
    With probjComboBox
    lngTemp = CLng(.List((pvlngLBound + pvlngUBound) \ 2, 0))
    Do
    Do While CLng(.List(lngIndex1, 0))  lngIndex2
    End With
    If pvlngLBound 

  • Auch bin ich sehr dafür dankbar, wenn die Codezeile die eingefügt wird wieder aus kommentiert wird, um den Code zu verstehen.
    Besten Dank im Voraus, lg Helmut

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

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Codezeile einfügen
    08.02.2019 15:42:24
    Werner
    Hallo Helmut,
    deine Listbox2 hat 5 Spalten. Der Wert aus welcher Spalte der angeklickten Zeile soll den in Zelle A1 übertragen werden?
    Gruß Werner
    AW: Codezeile einfügen
    08.02.2019 16:46:19
    Helmut
    Servus Werner
    Danke das du dich um mein Problem annimmst. Gerne würde ich die Spalte 5 in Zelle A1 einfügen! Würdest du mir auch den Code(wahrscheinlich nur ein oder zwei Zeilen) auskommentieren um ihn zu verstehen bzw. daraus zu lernen? Besten Dank im voraus
    LG Helmut
    AW: Codezeile einfügen
    08.02.2019 17:20:04
    Werner
    Hallo Helmut,
    der Code gehört ins Codemodul deiner Userform.
    Private Sub ListBox2_Click()
    Range("A1") = Me.ListBox2.List(Me.ListBox2.ListIndex, 4)
    End Sub
    
    Ich bin davon ausgegangen, dass du den Wert aus Spalte 5 der Listbox in das Tabellenblatt eintragen willst, auf dem du dich aktuell befindest. Wenn nicht, dann muß du vor dem Range("A1") noch das entsprechende Tabellenblatt mit angeben.
    Worksheets("DeinTabellenblattname".Range("A1") = ......
    
    Viel zum Code zu sagen gibt es eigentlich nicht.
    Me.ListBox2.List(Zeile, Spalte) gibt den entsprechenden Wert in der Liste der Listbox an.
    Bei
    Me.ListBox2.List(Me.Listbox2.ListIndex, 4) wird über ListIndex die Zeile in der Liste genommen, den du angeklickt hast. Die 4 stellt die entsprechende Spalte dar. Da in einer Listbox die erste Spalte den Index 0 hat, ist es hier dann also die 5. Spalte.
    Gruß Werner
    Anzeige
    AW: Codezeile einfügen
    08.02.2019 19:39:43
    Helmut
    Guten Abend Werner
    Recht herzlichen Dank für deine Arbeit samt Erklärung. Du hast mir wirklich sehr weitergeholfen. Kann jedoch erst am Montag die Codezeile probieren, doch ich gehe davon aus, dass sie funktioniert. Nochmals recht herzlichen Dank und ein schönes Wochenende
    LG Helmut
    Gerne u. Danke für die Rückmeldung. o.w.T.
    09.02.2019 14:19:15
    Werner

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige