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

Hallo nepumuk bräuchte mal wieder dein Hilfe

Hallo nepumuk bräuchte mal wieder dein Hilfe
Ron
Hallo nepumuk,
hallo Forum.
Ich habe hier schon sehr viel Hilfe erfahren speziell auch von Nepumuk. An dieser Stelle möchte ich euch erst einmal danke sagen.
Aktuell plagt mich mal wieder ein Problem welches ich irgend wie noch nicht lösen kann. Folgende Situation:
Ich öffne eine Userform mit
'Datenbank_2.Show vbModeless
'Datenbank_1.Hide
~f~
In dieser Datenbank_2 gibt es u.a. eine Listbox die ich mit 5 Spalten und verschiedenen Breiten einrichte.
Diese Listbox befülle ich mit einem Array so.
~f~
'If stg_kz = "x" Then
' 'es ist kein Datensatz in der Datenbank_2 vorhanden
' Call Standardmeldung_v2
' stg_kz = ""
'Else
' anz_datensätze = wks.UsedRange.Rows.Count
' zeile_arr = Application.WorksheetFunction.CountA(wks.Range(wks.Cells(1, 1), wks.Cells(anz_datensätze, 1)))
' anz_ebenen = zeile_arr
' ReDim ArrEbene(zeile_arr, 5)
' zeile_arr = 0
' For zeile = 1 To anz_ebenen
' ArrEbene(zeile_arr, 0) = wks.Cells(zeile, 1).Value
' ArrEbene(zeile_arr, 1) = wks.Cells(zeile, 2).Value
' ArrEbene(zeile_arr, 2) = wks.Cells(zeile, 3).Value
' ArrEbene(zeile_arr, 3) = wks.Cells(zeile, 4).Value
' ArrEbene(zeile_arr, 4) = wks.Cells(zeile, 5).Value
' zeile_arr = zeile_arr + 1
' Next zeile
' zeile_arr = zeile_arr - 1
' .ListBox_Auswahl_Ebenen.List() = ArrEbene
'End If
~f~
Das klappt auch so weit.
Dann klicke ich einen der Datensätze in der Listbox an um diesen weiter zuverarbeiten. Und genau hier ist das Problem.
Der angeklickte Datensatz liefert mir eine ID, die in der Spalte 3 der Listbox steht. So mache ich das.
~f~
'Private Sub ListBox_Auswahl_Ebenen_Click()
''die angeklickte Ebene merken
'With Fahrzeugdatenbank
'.ListBox_Auswahl_Ebenen.TextColumn = 1
'suchbegriff_eb_1 = ListBox_Auswahl_Ebenen.Text
'.ListBox_Auswahl_Ebenen.TextColumn = 2
'suchbegriff_eb_2 = ListBox_Auswahl_Ebenen.Text
'.ListBox_Auswahl_Ebenen.TextColumn = 3
'suchbegriff_eb_3 = ListBox_Auswahl_Ebenen.Text
'.ListBox_Auswahl_Ebenen.TextColumn = 4
'suchbegriff_eb_4 = ListBox_Auswahl_Ebenen.Text
'.ListBox_Auswahl_Ebenen.TextColumn = 5
'suchbegriff_eb_5 = ListBox_Auswahl_Ebenen.Text
''die Listbox Ebenen löschen
'.ListBox_Auswahl_Ebenen.Clear
~f~
Dann lösch ich die Listbox wieder, hole mir anhand der gemerkten ID (suchbegriff_3) neue Daten in das gleiche Array und will dieses Array dann wieder in die gleiche Listbox einspiele. so mache ich das:
~f~
'Set treffer = Sheets("EB").Columns(temp_spalte_eb).Find(suchbegriff_eb_3, lookat:=xlWhole)
'If Not treffer Is Nothing Then
'Set wks = Sheets("EB")
'With wks
'suchbegriff_3 = Datenbank_2.lb_Knotenname_Auswahl.Caption
'anz_datensätze = .UsedRange.Rows.Count
'zeile_arr = Application.WorksheetFunction.CountIf(.Range(.Cells(1, temp_spalte_eb), .Cells(anz_datensätze, temp_spalte_eb)), suchbegriff_3)
'anz_ebenen = zeile_arr
'ReDim ArrEbene(zeile_arr, 5)
'zeile_arr = 0
'For zeile = 1 To anz_ebenen
'If .Cells(zeile, temp_spalte_eb).Value = suchbegriff_3 Then
' ArrEbene(zeile_arr, 0) = .Cells(zeile, temp_spalte_eb).Value
' ArrEbene(zeile_arr, 1) = .Cells(zeile, temp_spalte_eb + 1).Value
' ArrEbene(zeile_arr, 2) = .Cells(zeile, temp_spalte_eb + 2).Value
' ArrEbene(zeile_arr, 3) = .Cells(zeile, temp_spalte_eb + 3).Value
' ArrEbene(zeile_arr, 4) = .Cells(zeile, temp_spalte_eb + 4).Value
' zeile_arr = zeile_arr + 1
'End If
'Next zeile
'End With
'zeile_arr = zeile_arr - 1
'If anz_ebenen > 0 Then Fahrzeugdatenbank.ListBox_Auswahl_Ebenen.List() = ArrEbene
'End If
~f~
Es ist haar genau der gleiche Ablauf mit dem Array wie beim 1. Lauf aber die Listbox füllt sich nicht mit den Werten aus dem Array.
Kann mit einer von euch sagen warum das nicht geht?
Ein zweites Problem habe ich mit der Formatierung dieser Listbox. Einmal stelle ich diese hierrüber ein:
~f~
'Public Sub Listbox_Ebene_einstellen()
'With Datenbank_2
'.ListBox_Auswahl_Ebenen.ColumnCount = 5
'.ListBox_Auswahl_Ebenen.ColumnWidths = "1cm;1cm;1cm;1cm;2cm"
'End With
~f~
Das geht ohne Probleme. Passt.
Nun möchte ich aber in der gleichen Listbox nach dem löschen des Inhalts der Listbox eine Meldung ausgeben das z.B. das zum Suchkriterium noch keine Daten vorhanden sind
Aber wenn ich diese Listbox vorher nach dem gleichen Schema formatiere
~f~
'Public Sub Listbox_Ebene_einstellen()
'With Datenbank_2
'.ListBox_Auswahl_Ebenen.ColumnCount = 1
'.ListBox_Auswahl_Ebenen.ColumnWidths = "4cm"
'End With
...dann geht das nicht. es sind weiterhin 5 Spalten da mit der vorher definierten Breite. Was mache ich da falsch?
Hinweis. Die Userform (Name Datenbank 2) bleibt immer aktiv und es kommt auch nicht der Befehl Datenbank_2.repaint zum einsatz.
Ich hoffe wirklich das zum einen einer von euch da draußen mein Problem versteht und mir helfen kann.
Leider kann ich meine Datenbank hier nicht hochladen, da dieses mittlerweile sehr groß ist und vom VBA-Code her sehr verflochten ist mit allerlei Funktionen und Userforem usw.
Gruß
Ron
AW: Hallo nepumuk bräuchte mal wieder dein Hilfe
07.10.2010 06:00:29
fcs
Hallo Ron,
mehrspaltige List-/Comboboxen wertet man etwas anders aus, indem man über Index-Nummer des gewählten Eintrags die entsprechenden Werte der Liste ausliest.
Sub aatest()
'Mehrspaltige Userform Listbox auswerten
Private Sub ListBox_Auswahl_Ebenen_Click()
'die angeklickte Ebene merken
With Fahrzeugdatenbank.ListBox_Auswahl_Ebenen
'Spaltenzählung in List beginnt bei 0
suchbegriff_eb_1 = .List(.ListIndex, 0)
suchbegriff_eb_2 = .List(.ListIndex, 1)
suchbegriff_eb_3 = .List(.ListIndex, 2)
'Wenn ID nummerisch, dann ggf.
'    suchbegriff_eb_3 = CLng(.List(.ListIndex, 2)) ' oder CDbl(.List(.ListIndex, 2))
suchbegriff_eb_4 = .List(.ListIndex, 3)
suchbegriff_eb_5 = .List(.ListIndex, 4)
''die Listbox Ebenen löschen
.Clear
End With
End Sub

Wird denn das Array bei der Suche nach suchbegriff_eb_3 mit Datengefüllt ?
Hast du in der Prozedur schon mal probiert einen Haltepunkt zu setzen und mit F8 schrittweise die Prozedur abzuarbeiten?
Kommt es dabei zu einem wiederholten/rekursiven Aufruf der Listbox-Clickprozedur? In diesem Fall hat dann die Listbox keinen Indexwert mehr und bleibt leer. Dann wird es allerdings komplitiert gegenzusteuern.
2. Problem:
Warum Breiten nicht zurückgesetzt werden: ? setze Breiten explizit auf 0
Public Sub Listbox_Ebene_einstellen()
With Datenbank_2
.ListBox_Auswahl_Ebenen.ColumnCount = 1
.ListBox_Auswahl_Ebenen.ColumnWidths = "4cm;0cm;0cm;0cm;0cm"""
End With
End Sub

Gruß
Franz
Anzeige
AW: Hallo nepumuk bräuchte mal wieder dein Hilfe
07.10.2010 08:35:06
Ron
Hallo Franz,
danke schon mal für deine Hilfe. Dein Code mit der Auswertung der Listbox ist mir einleuchtend. Danke mal dafür.
Zu deiner Frage zwecks Debuggen. Also wenn ich was programmiere debugge ich den Code grundsätzlich Schrittweise (F8) um Fehler schnell zu finden. Aber die Listbox-Clickprozedur wird nur ein mal aufgerufen. Und ja wenn ich nach dem Suchbegriff 3 suche dann wird das gleiche Array (ArrEbene) wieder mit den Suchergebnissen gefüllt. Und diese Suchergebnisse möchte ich dann wieder in die Listbox "reinkippen" und anzeigen. Aber genau das klappt warum auch immer nicht.
Gruß Ron
Anzeige
AW: Hallo nepumuk bräuchte mal wieder dein Hilfe
07.10.2010 10:30:40
Ron
Hallo nochmals zusammen,
ich habe jetzt noch mal was versucht. Ich habe meine Listbox auf RowSource umgestellt. Doch auch hier ist es das gleiche Ergebnis.
Bei Initilisieren der Userform kommen die Werte aus der RowSource ganz normal rein in die Listbox.
Nach dem Klick-Ereignis in die Listbox wird die Listbox gelöscht (Listbox.clear), das Array neu erstellt, das Array in den vorgesehenen Rowsourcebereich eingetragen, den Rowsourcebereich der Listbox neu angepasst und dann würde ich erwarten das die neuen Werte in meiner Listbox stehen. Tut es aber nicht!!!
Warum nicht? Ich bin schon schier am Verzweifeln?
Gruss Ron
Anzeige
AW: Hallo nepumuk bräuchte mal wieder dein Hilfe
07.10.2010 19:29:13
Ron
Weiß jemand einen Rat für mich?
AW: Hallo nepumuk bräuchte mal wieder dein Hilfe
07.10.2010 22:43:25
fcs
Hallo Ron,
in deinen Codeschnippseln taucht auch ein Objekt namens "Fahrzeugdatendaten" auf ist dies ein anderes Formular?
Jedenfall wird im 2. Durchlauf dein Array mit den Daten hier
If anz_ebenen > 0 Then Fahrzeugdatenbank.ListBox_Auswahl_Ebenen.List() = ArrEbene
End If

der Listbox in diesem UF zugewiesen.
ggf. muss du hier Fahrzeugdatenbank durch Datenbank_2 ersetzen.
Gruß
Franz
AW: Hallo nepumuk bräuchte mal wieder dein Hilfe
08.10.2010 09:31:10
Ron
Hallo Franz,
sorry für die kleine Verwirrung. Wie ich eingangs erwähnte sind das Codeschnipsel, die ich aus der Datenbank herrausgelöst habe die ich aktuell programmiere. Hier in meinem Beispiel ist Fahrzeugdatenbank=Datenbank_2.
Gestern habe ich weiter "getüftelt". Also auch mit Rowsource ließ sich die Listbox nicht aktualisieren bzw. in den Bereich der RowSource wurden die Werte akurat eingetragen aber nicht in der Listbox angezeigt. Ich habe die Vermutung, dass nach dem Clickereignis in der Listbox diese sich von der Bildschirmansicht her nicht aktualisiert. Warum auch immer. Ich habe noch keinen Befehl gefunden mit dem ich eine Userform aktualisieren kann denn auch mit userform.repaint zeigt die Listbox nichts an.
Also bin ich auf den klassischen Weg zurück gegangen und habe mit Additem aus dem Array die Datensätze in der Listbox angezeigt. Das geht komischer Weise problemlos und man sieht auch gleich die neuen Werte. Doch habe ich bedenken wenn mal mehr als 100 Datensätze angezeigt werden müssen, dass der User dann ziemlich lange warten muss bis die neue Auswahl in der Listbox zur Verfügung steht.
Gerne wäre ich aber an der Lösung des Problems interessiert warum sich die Listbox nach dem Clickereignis in der Userform und nach befüllen mit Werten aus einem Array bzw mit RowSource nicht aktualisiert sprich die Werte auch anzeigt.
Was mich auch noch interessiert ist wie kann ich den VBA-Code so posten und anzeigen lassen wie du Franz?
Gruß Ron
Anzeige
Listbox im Userform, Auswahlliste aktualisieren
09.10.2010 01:41:24
fcs
Hallo Ron,
also ich hab jetzt nochmals einiges probiert. Aus irgendeinem Grund werden die neuen Daten für die Listbox nicht angezeigt, wenn die Aktualisierung per Click_Ereignisprozedur erfolgen soll, obwohl die entsprechenden Daten der Listbox zugeordnet sind. Verwendet man ein anderes Steuerelement zur Aktualisierung geht es.
Hier nochmal eine Beispieldatei: https://www.herber.de/bbs/user/71822.xls
Was mich auch noch interessiert ist wie kann ich den VBA-Code so posten und anzeigen lassen wie du Franz?
Wenn du beim Erstellen eines Beitrag/einer Antwort die Schaltfläche "Zitat &lt pre &gt" betätigst dann werden die entsprechenden Steuerzeichen eingefügt. Den Code kopierst du dann zwischen die beiden spitzen Klammern. Du kannst die Steuerzeichen auch einfach eintippen.
Gruß
Franz
Anzeige
AW: Listbox im Userform, Auswahlliste aktualisieren
09.10.2010 10:56:19
Tino
Hallo,
das Problem ist das Click Ereignis, dies muss zuvor abgeschlossen sein.
Mit Application.OnTime oder etwas vergleichbarem warten bis die Prozedur abgeschlossen ist und danach die Listbox über eine separate Prozedur neu füllen, die benötigten Daten in Public Variablen zwischenspeichern.
Sollte funktionieren.
Gruß Tino
AW: hier ein kleines Beispiel...
09.10.2010 17:14:35
Ron
Hallo Tino,
vielen Dank für deine Beispieldatei. Die macht genau das, was ich gesucht habe. ich werde es nächste Woche in meine Datenbank mal einbauen und schauen ob es funktioniert.
Danke.
Gruß Ron
Anzeige
AW: hier ein kleines Beispiel...
09.10.2010 21:24:46
Ron
Hallo Tino,
also ich konnte doch nicht bis nächste Woche abwarten und habe heute schon mal deinen Code auseinander genommen. Mein VBA-Wissen ist nicht so schlecht (habe ich mir alles per learning by doing beigebracht und nie eine Schulung besucht. Nur viel gelesen) aber heute habe ich wieder gemerkt, dass ich doch nicht alles kenne. Ich habe ein paar Fragen an dich zweck den Code und ich hoffe du kannst sie mir beantworten:
Was ist der Unterschied zwischen Value und Value.2? Der ist mir nicht so klar.
ArrayData = .Range("D1", .Cells(.Rows.Count, 4).End(xlUp).Offset(0, 1))

Wieso schreibst du hier kein Set davor? Hier wird doch ein Wertebereich definiert oder nicht?
ReDim Preserve ArrayDataList(1 To 2, 1 To UBound(ArrayData))

Und das in der Klammer bedeutet ja ich habe 2 Spalten und gehe für das Array bis zum letzten Wert in dem Range oder?
Das hier verstehe ich gar nicht?
If nCount > 0 Then
ReDim Preserve ArrayDataList(1 To 2, 1 To nCount)
ArrayDataList = Application.Transpose(ArrayDataList)
EnableTimer 20 'Timer nach 10 Millisekunden ------dieser Befehl startet die Function
End If
Den Befehl Application.Transpose kenne ich nicht. Was macht der?
Und diese Timer-Function (Starten & Beenden) ist, so wie es für mich den Anschein hat eine API-Sache oder? Und von der habe ich leider gar keine Ahnung. Kannst du mir da kurz schildern was hEvent = SetTimer(0&, 0&, msInterval, AddressOf Modul1_FillListBox.Fill_ListBox) alles einstellt und berücksichtigt.
Danke schon mal für deine Nachhilfestunde.
Gruß Ron
Anzeige
AW: hier ein kleines Beispiel...
09.10.2010 22:17:43
Tino
Hallo,
ok. ich versuche es mal mit meinen Worten rüberzubringen.
Was ist der Unterschied zwischen Value und Value.2?

Value.2 gibt den tatsächlichen Wert der Zelle zurück, aber Hauptgrund ist eher das Value2 bereits ein Array ist und nicht erst von VBA umformatiert werden muss und daher geht das schreiben in ein Array auch etwas schneller, Nachteil ein Datumsformat in einer Zelle wird nicht übernommen sondern der Wert dieses Datums also eine normale Zahl.
Wieso schreibst du hier kein Set davor?

ArrayData ist ein Array und kein Objekt das ich zuweise wie in etwa ein Range.

ReDim Preserve ArrayDataList(1 To 2, 1 To UBound(ArrayData))
Hier mach ich nichts anderes als die Größe des Arrays festzulegen, damit es groß genug um entsprechend viele Daten aufzunehmen, dies ist bis zu dieser Zeile noch unbekannt.
Weiter im Code verwende ich nCount, einen Zähler mit dem ich später das Array ArrayDataList auf die richtige Größe zurechtstutze.
If nCount > 0 Then
ReDim Preserve ArrayDataList(1 To 2, 1 To nCount)
ArrayDataList = Application.Transpose(ArrayDataList)
EnableTimer 20 'Timer nach 10 Millisekunden ------dieser Befehl startet die Function
End If
nCount ist der Zähler, ist dieser 0 sind auch keine Daten gefunden wurden.
Mit ReDim Preserve … stutze ich dieses Array zurecht wie oben schon erwähnt.
Da ich ein Mehrdimensionales Array nur nach rechts neu dimensionieren kann,
muss ich dieses nun wieder drehen damit es die richtige Folge oder Richtung für die Listbox hat.
Diese Timer-Function ist eine API Funktion, die es ermöglicht auch nach Millisekunden eine andere Prozedur auszuführen, bei der in VBA (Application.OnTime) geht als Minimum nur eine Sekunde, dies ist eben manchmal etwas zu lang, kannst Du aber auch als alternative verwenden.
Nachteil ist, diese muss bei einmaliger Verwendung schnell wieder aufgehoben werden sonst landet man schnell in einer Endlosschleife oder Excel verabschiedet sich ganz, weil diese immer wieder nach der eingestellten Zeit wieder aufgerufen wird und nicht nur einmal.
hEvent ist hier nur der Fensterhandle der von SetTimer zurückgegeben wird,
dieser wird später beim beenden des Timers wieder benötigt.
So ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.
PS: ich habe mir auch alles selbst beigebracht, bzw. durch lesen oder im Forum.
Also ich bin keiner der das Rad neu erfindet. ;-)
Gruß Tino
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige