Laufzeitfehler mal ja mal nein

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm Label ListBox TextBox

nach unten

Betrifft: Laufzeitfehler mal ja mal nein
von: AndreAndreAndre
Geschrieben am: 10.05.2021 03:48:42

Hallo
Laufzeitfahler 2147352571 (80020005)
Eigenschaft List konnte nicht gesetzt werden. Typenkonflikt.
wenn ich aber ab Zeile 24 lösche funktioniert es :(
Ich habe keine leeren Zellen
Anbei der Makrotext
https://www.herber.de/bbs/user/146119.txt
und Excel file
https://www.herber.de/bbs/user/146120.xlsm
Danke lg :) Andre

nach oben  nach unten

Betrifft: AW: Laufzeitfehler mal ja mal nein
von: Hajo_Zi
Geschrieben am: 10.05.2021 05:14:32
Hallo Andre,
frage jemand der neben Dir sitzt der hat villeicht gesehen wie Du den Fehler auslöst.
Ich habe es nicht gesehen, da ich nicht auf fremde Rechner schaue.
GrußformelHomepage

nach oben  nach unten

Betrifft: Fehler in I107
von: Klaus M.
Geschrieben am: 10.05.2021 09:50:30
Hallo Andre,
der Text in Zelle I107 ist schlicht zu lang. Wenn du I107 auf die Hälfte oder so reduzierst, läuft das Makro durch.
Ich habe mir nicht die Mühe gemacht herauszufinden WIE lang der Text sein darf :-) Aber generell halte ich es für eine schlechte Idee, so lange Texte in einzelnen Zellen darzustellen.
LG,
Klaus M.

nach oben  nach unten

Betrifft: AW: Fehler in I107
von: Daniel
Geschrieben am: 10.05.2021 10:22:55
Hi
habs grad mal durchgetestet:
in eine Listboxzelle passen maximal 2047 Zeichen.
dann kommt der Fehler.
Gruß Daniel

nach oben  nach unten

Betrifft: Genialer Hinzweis :) Danke
von: AndreAndreAndre
Geschrieben am: 10.05.2021 10:32:42
Super :)
oh danke - das hilft mir total weiter:) super Lösung :) Ich habe es befürchtet :)
Lg Andre

nach oben  nach unten

Betrifft: Das ist der Key ja :)
von: AndreAndreAndre
Geschrieben am: 10.05.2021 10:33:34
wunderbare Hilfe :) Danke

nach oben  nach unten

Betrifft: Danke: Super gelöst durch: Daniel Klaus M. jedoch.
von: AndreAndreAndre
Geschrieben am: 10.05.2021 11:26:50
Danke: Super gelöst durch: Daniel Klaus M. jedoch..
=LÄNGE()
https://tipps.computerbild.de/software/officeprogramme/excel-zeichen-zaehlen-280627.html#:~:text=Geben%20Sie%20in%20eine%20freie,beispielsweise%20A1%2C%20B3%20oder%20C24.
die Länge somit in Spalte ausgegeben - dann nach Größe sortiert.
Dann die Datensätze die über 2047 Zeichen sind in Word gekürzt und Zeichenanzahl unter Wörter zählen ermittelt.
Gekürzten Text eingefügt.
Es geht super.
Es ist leider etwas langsam - kann ich in der Programmierung noch was tun - dass es schneller wird.
lg Andre

nach oben  nach unten

Betrifft: AW: Danke: Super gelöst durch: Daniel Klaus M. jedoch.
von: Klaus M.
Geschrieben am: 10.05.2021 11:35:58
ungetestet:
ListBox1.List(ListBox1.ListCount - 1, 9) = CStr(vba.left(Tabelle1.Cells(lZeile, 9).Text,2047))
sollte nur die ersten 2047 Zeichen übertragen, egal wie lang der Text ist. SOllte der Text unter 2047 Zeichen sein, werden alle übertragen.
LG,
Klaus M.

nach oben  nach unten

Betrifft: Gute Idee jedoch ... gleich langsam sogar mit ...
von: AndreAndreAndre
Geschrieben am: 10.05.2021 13:23:37
Gute Idee
Ich machte sogar 100 und eigentlich ganz gleich langsam.
ListBox1.List(ListBox1.ListCount - 1, 9) = CStr(VBA.Left(Tabelle1.Cells(lZeile, 9).Text, 100))
lg Andre

nach oben  nach unten

Betrifft: AW: Gute Idee jedoch ... gleich langsam sogar mit ...
von: Klaus M.
Geschrieben am: 10.05.2021 13:34:00
Hallo Andre,
das Geschwindigkeitsproblem beim einlesen liegt an der Schleife, nicht an "left". Dazu habe ich weiter unten geantwortet. Wie du beide Probleme (Schleifenlos einlesen und gleichzeitig Left-2047 sicherstellen) unter einen Hut bekommst, ist jetzt deine Hausaufgabe :-)
LG,
Klaus M.

nach oben  nach unten

Betrifft: AW: Gute Idee jedoch ... gleich langsam sogar mit ...
von: Daniel
Geschrieben am: 10.05.2021 13:58:19
Hi
Die Funktion CStr braucht man nicht, die Werte sind ja Text.
Cells().Text ist in Verarbeitung langsamer als Cells().Value.
Das .Text nimmt man dann, wenn man bei Zahlen oder Datumswerten das Zahlenformat der Zelle mit über nehmen will, oder wenn in den Zellen auch Fehlerwerte stehen können.
Stehen in den Zellen immer Texte, reicht .Value ind ist damit etwas schneller.
Gruß Daniel

nach oben  nach unten

Betrifft: AW: Gute Idee jedoch ... gleich langsam sogar mit ...
von: AndreAndreAndre
Geschrieben am: 10.05.2021 17:48:40
also anstatt
zb:
ListBox1.List(ListBox1.ListCount - 1, 1) = CStr(Tabelle1.Cells(lZeile, 1).Text) schreibe ich nur wenn ich eine Zahlen oder Datumswerten das Zahlenformat habe
was schreibe ich wenn ich einen Text habe:
ListBox1.List(ListBox1.ListCount - 1, 1) = (Tabelle1.Cells(lZeile, 1).Value) ?
lg Gruß Andre

nach oben  nach unten

Betrifft: AW: Gute Idee jedoch ... gleich langsam sogar mit ...
von: Daniel
Geschrieben am: 10.05.2021 17:50:53
Probiers doch aus.
Gruß Daniel

nach oben  nach unten

Betrifft: AW: Gute Idee jedoch ... gleich langsam sogar mit ...
von: AndreAndreAndre
Geschrieben am: 10.05.2021 18:52:37
ja hat geklappt dauert statt 60 Sekunden nur 42 - war schon mal guter Tipp :) danke lg

nach oben  nach unten

Betrifft: Hajo_Zi ich habe dich .....
von: AndreAndreAndre
Geschrieben am: 10.05.2021 10:35:31
bisher als sehr konstruktiv erlebt.
Jetzt ist es scheinbar anders
lg Andre

nach oben  nach unten

Betrifft: Schneller kann es werden ?
von: AndreAndreAndre
Geschrieben am: 10.05.2021 12:32:39
Hallo :)
Wenn ich auf das "Auge" klicke kann ich den Datensatz editieren.
Oberhalb sind auch die Spalten
https://www.herber.de/bbs/user/146124.xlsm
Nr old Titel Main Key Sub key Detail key Land Datum
zum selektieren aufgelistet.
Im unteren Bereich sind die Felder des Datensatzes, wo ich sie auch editieren kann.
(Die Zeile in Suchen - soll später eine Schnellsuche ermöglichen) - ist noch nicht programmiert.
Geht es irgendwie einfacher im Makro im userform zu programmieren, damit es auch schneller wird.
Denn bei 9000 Datensätze wird es schon sehr langsam, wenn ich das "Auge" anklicke.
Was macht es so langsam - die Selektierung oben oder unterhalb die Felder zum editieren..
Das Feld Text hat die meisten Zeichen.
lg Andre

nach oben  nach unten

Betrifft: AW: Schneller kann es werden ?
von: Klaus M.
Geschrieben am: 10.05.2021 13:08:03
Hi Andre,
nutze KEINE Schleife, um die Listbox zu füllen! Nutze stattdessen die RowSource Eigenschaft der Listbox, das geht auch bei 9000+ Datensätzen rasend schnell:
Me.ListBox1.RowSource = "main!" & Sheets("main").Range("A" & lCONST_STARTZEILENNUMMER_DER_TABELLE & ":I" & lZeileMaximum).Address
Du musst dann ein bisschen in den Eigenschaften der Listbox spielen. Column.Count einrichten, über "columnwidths" eventuell nicht benötigte Spalten auf breite null stellen. Und : "ColumnHeads = TRUE" nimmt dir gleich die korrekten Überschriften mit, das sieht viel ordentlicher aus als deine Labels!
LG,
Klaus M.
EDIT: Und gewöhn dir an, die Elemente zu bennen! Nicht "ListBox1, TextBox14" sondern "ListBox_Filme, TextBox_Titel" ... sonst steigst du bald durch deinen eigenen Code nicht mehr durch.

nach oben  nach unten

Betrifft: AW: Schneller kann es werden ?
von: Daniel
Geschrieben am: 10.05.2021 15:36:52
HI
die von Klaus beschriebene Befüllmethode hat zusätzlich den Vorteil, dass du
- mehr als 11 Spalten in der Listbox verwenden kannst (bei .AddItem ist die Spaltenanzahl begrenzt)
- die Listbox automatisch die Überschriften anzeigen, wenn der entsprechende Schalter gesetzt ist
verwendet wird die Zeile oberhalb des Zellbereichs der Quelle.
du machst das .AddItem ja nur, um eventuelle Leerzeilen nicht in der Liste drin zu haben.
das Problem könntest du dardurch beheben, dass du die Liste vorher sortierst (Leerzellen werden bei aufsteigender Sortierung ans Ende sortiert) und die letzte befüllte Zeile der Sprungfunktion:
Cells(Rows.Count, 1).end(xlup).row ermittelst
alternativ dazu geht auch das direkte Schreiben der Werte in die Listbox:
Me.ListBox1.List = Sheets("main").Range("A" & lCONST_STARTZEILENNUMMER_DER_TABELLE & ":I" & lZeileMaximum).value
das ist auch sehr schnell und kann mehr Spalten als Additem.
das mit den Überschriften funktioniert hier nicht, auch wird das Zahlenformat nicht übernommen (könnte bei Datumswerten ein problem sein)
Aber auch hier müsstest du sortieren, um die Leerzeilen auszuschließen.
Gruß Daniel

nach oben  nach unten

Betrifft: AW: Schneller kann es werden ?
von: AndreAndreAndre
Geschrieben am: 10.05.2021 16:08:19
^
ganz super ich werde es am Abend gleich umsetzen :) sehr tolle Tipps von Euch danke :))))))
ganz lieben Gruß Andre

nach oben  nach unten

Betrifft: AW: Schneller kann es werden ?
von: Daniel
Geschrieben am: 10.05.2021 16:30:43
wenn du bei der Einlese-Schleife bleiben willst, dann solltest du deine selbstgeschriebene Funktion zum Ermitteln, ob eine Zeile leer ist oder nicht, durch die die Excelfunktion Anzahl2 oder ZählenWenn ersetzen.
Diese Funktionen kann man auch in VBA über Worksheetfunction.CountA und Worksheetfunction.CountIF einsetzen.
Zellbezüge müssen allerdings im VBA-Style (Range(...) angegeben werden.
Gruß Daniel

nach oben  nach unten

Betrifft: deine selbstgeschriebene Funktion ?????
von: Helmut
Geschrieben am: 10.05.2021 16:44:18
Bei seinen Fragen glaube ich das nicht ;-)

nach oben  nach unten

Betrifft: stimmt Helmut
von: AndreAndreAndre
Geschrieben am: 10.05.2021 19:36:17
ich habe sie nicht im Ursprung geschrieben lg Andre

nach oben  nach unten

Betrifft: ja genial :) jedoch wie :)
von: AndreAndreAndre
Geschrieben am: 10.05.2021 18:56:07
nur value . versus txt variablen hat mal echt was gebracht ...
aber da ich die Formel nur adaptierte - bin ich mir nicht sicher was ich da beiden guten beiden Tipps konkret mache :)
Me suena un poco español:)
lg Andre

nach oben  nach unten

Betrifft: AW: Schneller kann es werden ?
von: AndreAndreAndre
Geschrieben am: 10.05.2021 17:44:58
Danke :)
Bei den Texboxen habei ich eine eigene Aufstellung - bin mir nicht sicher was passiert - wenn ich jetzt alle ändern - das mache ich wenn erst später :) zuerst mal die anderen DInge die ihr beschrieben habt .
wo oder anstatt welchem Teil füge ich den ein?
Me.ListBox1.RowSource = "main!" & Sheets("main").Range("A" & lCONST_STARTZEILENNUMMER_DER_TABELLE & ":I" & lZeileMaximum).Address
beite stelle ich ja hier ein:
'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch)
'";;;"
ListBox1.ColumnWidths = "0;30;30;290;60;120;120;120"
'Feste Breiten: ListBox1.ColumnWidths = "0;100;100;100"
lg Andre

Excel-Beispiele zum Thema "Laufzeitfehler mal ja mal nein"