[gelöst]Anfänger-Problem mit Array-Bildung

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst]Anfänger-Problem mit Array-Bildung

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von pcdirk91 » Do, 30.01.2020 21:28

Hi Balu, Hi Marcel

habe die neue Fassung meiner Sache unter dem Thread "Crash-Kurs BASIC und Dialoge"?" erneuert

Gruss Dirk

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von marcel_at_work » So, 19.01.2020 00:02

Hey balu,
Wer Anfänger ist, und was nachvollziehbares daraus lernen will, der sollte nicht das PDF nehmen, sondern liebr das ODT.
Das klingt gut, ich werde das zukünftig beherzigen. 8)

Viele Grüße,

Marcel

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von balu » Sa, 18.01.2020 22:50

Ave Marcel,

das hier
Albego hat geschrieben: jedoch die meisten davon müssen auf Englisch angesprochen werden .
bezieht sich darauf, das es auch Calc-Funktionen gibt die auf DEUTSCH angesprochen werden. So ausm Stehgreif gehört da wohl auch WOCHENTAG dazu, also nicht WEEKDAY. Ich will mich da jetzt nicht festlegen welche da nicht auf Englisch, sondern auf Deutsch angesprochen werden. Das war hier im Forum schon öfters mal ein Thema. Und das brauchen wir jetzt hier nicht weiter behandeln. Ich wollte nur mal allgemein darauf hingewiesen haben.

Und, danke fürs Angebot wegen Datenbanken. Aber ich persönlich bleib bei Calc, da dies für meine persönlichen Zwecke vollkommen ausreicht.

Noch was zu der deutschen Version von Andrew. Wer Anfänger ist, und was nachvollziehbares daraus lernen will, der sollte nicht das PDF nehmen, sondern liebr das ODT. Grund dafür ist, im ODT sid nämlich die Beispiel Codes direkt ausführbar. Wenn man etwas aus dem PDF kopiert und ausführn will, der sieht sich dann manchmal mit einem besonderen Problem konfrontiert: Es hagelt Fehlermeldungen.
Das kommt daher, weil einige Code-Listings andere Codes aus dem Dokument aufrufen. Und wer das nicht weiss, wird das PDF verfluchen. Denn dann muss man nämlich genau hinschauen was angemäääckert wird, das fehlende Listing suchen rauskopieren und erneut starten. Aber selbst dann kann das gleiche wieder von vorne losgehen, weil das zusätzliche Listing wiederum einen anderen Code aufruft.

Feierabend.



Gruß
balu

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von marcel_at_work » Sa, 18.01.2020 22:05

Hallöchen Mädels, :lol:

@mikeleb:

Danke auch von mir, für die Beschreibung der obigen Funktion - ich hab' mir jetzt diese Tools-Funktion adaptiert, die ist echt gut.

@balu:

1) Ich hab' das Wikipedia zu OOo mal durchgestöbert. Sehr interessant..., besonders die Timeline, die man wohl als etwas "verstrikt" bezeichnen könnte. :shock:
... jedoch die meisten davon müssen auf Englisch angesprochen werden .
Dies ist nicht ganz* zutreffend.

Die Calc-Formel RUNDEN(x) kann man doch mittels Makro auch wie folgt schreiben?:
Function RUNDEN(x) : RUNDEN() = ROUND(x) : End Function > ... und Voilà! > = RUNDEN(x).

@Dirk:
Das nachfolgende ist für die meisten von Eich wahrscheinlich eher uninteressant aber ich wollte Balu und Marcel mal versuchen zu erklären was ich vorhabe. Ob das realisierbar ist wird sich für mich erst rausstellen. Aber von der Grundidee müsste das funzen.
1) Weitere Erklärungen zum Projekt waren nicht nötig, da wir dies alles schon im November detailiert erörtert haben. :lol:

2) Das ist alles gar nicht weiter wild, nur Fleißarbeit - und wenn du deine Hausaufgaben (zumindest die Grundlagen in der Dokumentation) gemacht hast, löst du das am Ende sogar alles noch allein.

Ich nehme hier immer wieder einen gewissen Schwermut zum Thema Datenbanken wahr und möchte dazu nur bemerken, daß ich die Syntax und den Umgang mit grundlegenden Datenbank-Funktionen in OOo, persönlich weitaus verständlicher empfinde, als z.B. die Bearbeitung von irgendwelchen Tabellenblättern.
Ich bin momentan dabei Sachen zu überarbeiten. Wie ich schon vorgestern schrieb will ich erst einen gewissen Stand fertig haben um Ihn Marcel zur Überprüfung zu verfügung zu stellen *falls er sich dieser noch annehmen möchte *.
Wenn du brav bist, ja. 8)

Ich kann mich mikeleb am Ende nur anschließen, daß du nach Fertigstellung des Dialogs mit den restlichen Daten rausrücken musst.

Bis denne...

Marcel

EDIT:

@balu/Dirk: Wenn ihr mögt, kann ich euch ja mal einen einfachen Datenbank-Zugriff, analog zum Tabellenblatt, zeigen - und ihr würdet sehen, alles keine Zauberei. 8)

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von balu » Sa, 18.01.2020 20:09

Hallo Dirk,

nur zur kurzen Nebeninfo.
Wohl nicht aufgebaut, aber dennoch bin ich im Besitz einer H0 Modelleisenbahn.

Meine geäußerte Beobachtung bezüglich einer Datei von dir, sollte nur deutlich machen das ich schon erahnte wohin die Reise gehen wird, das MEGA EXTREM viel Arbeit und Zeit auf dich zukommen wird.

Natürlich hatte ich aber auch schon deswegen Sachgerechte Kritik geäußert, die man aber braucht um das eine oder andere vielleicht doch anders anzugehen. Und nein, es ist nicht unbedingt so das eine Tabellenzelle langsamer rechnet als ein Makro, auch wenn es hin und wieder mal Ausnahmen geben kann. Jedoch die Interaktion zwischen Tabellenblatt und Makro die kann irgendwann ein Hindernis darstellen. Ich versuche das mal Verbal zu Skizzieren.

=> Makro schreibt was in eine Zelle
=> Zelle berechnet etwas
=> Makro greift auf das Ergebnis der Zelle zu
=> Makro verarbeitet das Ergebnis
=> Makro schreibt das dann wieder in die Zelle

Das ist eine nicht Ideale Interaktion zwischen Makro und Tabellenblatt. Und das wird über kurz oder lang das Makro und damit die Datei stark ausbremsen, es wird alles irgendwie so unwahrscheinlich zäääääääh und trääääääääääge das man schnell die Lust verliert mit der Datei zu arbeiten. Ab dann spielt es auch keine Rolle mehr ob man selber viel Zeit hat, die richtige Freude will gar nicht aufkommen, es entsteht Frust, und das nicht zu knapp.

Ich gebe so gesehen nur meine persönlich gemachten Erfahrungen weiter. Und deshalb kann ich noch etwas zu dem Thema Zeit und Interaktion berichten.

Bei meinem einzigen Großprojekt, das ich erst vor kurzem hier zur hälfte so nebenbei vorgestellt hatte, war im wesentlichen nicht so viel kompliziertes dabei, zu Anfangs. Jedoch sollte folgendes durchgeführt werden.
Aus einem Dialog heraus sollten dort erfasste Daten in ein Tabellenblatt reingeschrieben werden, und anschließend der Dialog geschlossen werden, oder aber auf eine andere Dialogseite umgeschaltet werden. Hört sich Harmlos an. Doch wo steckt der Herr Deiwel?

Richtig!

Er steckt im Detail.

Bei einem Klick auf den zuständigen Button im Dialog für schließen, oder die eben genannte alternative, wurden die Daten auch ins Tabellenblatt eingetragen. Dumm nur, das dort der benannte Herr wohnte, denn er fing jetzt zu Rechnen an, beziehungsweise Berechnungen durchzuführen. Dies dauerte aber einen kurzen Augenblick. Und dieser kurze Augenblick reicht aus um jemandem zum Grübeln zu bringen: "Habe ich jetzt den Button gedrückt, oder nicht!?"

Also habe ich diese Berechnungen gleich im Makro ausführen lassen, und dann die Daten ab ins Tabellenlatt rein. Das Ergebnis war verblüffend. Klick auf Button, und gut ist.
Damals war mein Rechensklave einiges Langsamer als mein aktueller. Aber wenn man auf einem "langsameren" Sklaven Geschwindigkeitszuwachs erlebt, ist das schon fast berauschend. :-)

Soll jetzt aber auch reichen.
Und nein es gibt kein Patentrezept für die Steigerung der "Performenz". Bis auf eins.
Calc kann rechnen, ein Makro auch. In Calc gibts vorgegebene Funktionen, wie z.B. ZÄHLENWENN, gibts im Makro auch jedoch die meisten davon müssen auf Englisch angesprochen werden (das jetzt nur so als Randnotiz).



Gruß
balu

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von mikeleb » Sa, 18.01.2020 18:40

Hallo,
dachte ich mir: Prima Zeichne im CAD exporier die Eck-Punkte der Trasse importier Sie ins Libre-Office bereite sie dort so auf wie das Modellbau Progamm sie braucht exportier Sie dorthin
Richtig gedacht.
Wenn du uns jetzt noch verrätst (per Beispieldatei), wie die exportierte CAD-Datei aussieht und wie das Modellbauprogramm sie braucht, könnten wir genauer helfen ...
Sprich wie sehen die ursprünglichen Daten aus und wie möchtest du sie gern haben?

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von pcdirk91 » Sa, 18.01.2020 18:27

Hey Ihr da,
da ich heute vielleicht wieder etwas klarer im Kopf bin habe ich mir die letzten Einträge des Threads nochmal durchgelesen.

Ergebnis: oh Mann oh Mann watt habe icke da nur losgetreten!!!!!!

Das nachfolgende ist für die meisten von Eich wahrscheinlich eher uninteressant aber ich wollte Balu und Marcel mal versuchen zu erklären was ich vorhabe. Ob das realisierbar ist wird sich für mich erst rausstellen. Aber von der Grundidee müsste das funzen


Aber von Anfang an, vielleicht kann ich über die Dimension meiner Idee sowohl Balu als auch Marcel etwas versuchen zu erklären.
Wie Ihr beiide wisst bin ich nur ein einfacher "Schreinermeister" der mittlerweile auch in die Jahre gekommen ist.
Mein Computerwissen hane ich aus Learning by Duing mir erworben. Als ich eine kleeine EDV-Firma aufgemacht habe(Gesundheits-Gründe) war ich un Excek zuemlich futt. Habe ettliche Sachen aufgebaut wie zum Bleistift eine Variable Stückliste im Möbelbau buw. ein kleines Fensterbauprogramm.
Damals noch mit der Makroprogrannierung.
Der Grund das in Excel zu machen war der Das ich mit Datenbanken nie richtig Warm geworden bin. Die waren und sind mir einfach zu undurchsitlich.
(Das ist für mich so!!!)
beide
Ihr beide wisst das das Material in meiner Tabelle einen Stä#rken-Bereich zwischen 2 mm und 28 mm hat. Wobei bei vielen Materialien nicht jede Stärke erhältlich ist. (Massivholz wird in meiner Anwendung auf Grund von "Holz lebt" nicht berücksichtigt.
Da di Anwendung später fir den Model-Bahnbau gedacht ist kommen wenn es hochkommt maximal 20 Plattenwerkstoffe wenn überhaupt zum Tragen .
wenn ich aus 20 Plattenwerkstoffe mit einer Materialstärke zwischen 2 und 28 mm ausgehe dann kpmme ich im Material bereich auf 560 Datensätze
Da dachte ich prima 560 Datensätze reicht für Tabellen kalkilation dicke aus
Das ist ja ber auch nur ein kleiner Teil meiner Idee . Das ganze soll zum Berechnen von Körpern (Trassenbrettern die für Kurven und Geraden von Gleisen Gebaut werden dienen). Das Programm das diese Trassenbretter in einem Modelbahnprogramm darstellen soll benötigt durch die Kurven- und Geraden-Gleise sogenannte Hexaeder-Punkte) . Wenn das ganze dann in einer STeigung benötogt wird musst du mit millimeterpapier die einzelnen Punkte er rechnen, um diese dann für mich sehr imständlich per Hand in fplgender Form

hexaeder -10,-29,0, 10,-29,0, 10,29,0, -10,29,0, -8,-29,220, 8,-29,220, 8,29,220, -8,29,220
eingeben. Da ich meine Modelbahn auch im CAD plane dachte ich mir: Prima Zeichne im CAD exporier die Eck-Punkte der Trasse importier Sie ins Libre-Office bereite sie dort so auf wie das Modellbau Progamm sie braucht exportier Sie dorthin und du hast die Schreibarbeit nicht(Fehler beim eingeben der Daten incl.)
hier dann im unteren Abschnitt das Ergebnis nach der Bearbeitung in Libre-Office


color 0.75,0.75,0.75//25%Grau
verschieben 0.0,67.4,0.0
hexaeder -172.0,-10.75,1.5, 172.0,-10.75,1.5, 172.0,-6.75,1.5, -172.0,-6.75,1.5, -172.0,-9.25,3.4, 172.0,-9.25,3.4, 172.0,-7.75,3.4, -172.0,-7.75,3.4
hexaeder -172.0,6.75,1.5, 172.0,6.75,1.5, 172.0,10.75,1.5, -172.0,10.75,1.5, -172.0,7.75,3.4, 172.0,7.75,3.4, 172.0,9.25,3.4, -172.0,9.25,3.4


// Rem Meine Datei zwar gleiche Werte aber damit du mal sieht das die Werte jetzt genau untereinander stehen

Hexaeder -10000.001, -10000.002, -10000.003, -10000.004, -10000.005, -10000.006, -10000.007, -10000.008, -10000.009, -10000.010, -10000.011, -10000.012, -9996.001, -996.002, -996.003, -996.004, -996.005, -996.006, -996.007, -996.008, -996.009, -996.010, -996.011, -996.012
Hexaeder -10000.001, -10000.002, -10000.003, -10000.004, -10000.005, -10000.006, -10000.007, -10000.008, -10000.009, -10000.010, -10000.011, -10000.012, -9996.001, -996.002, -996.003, -996.004, -996.005, -996.006, -996.007, -996.008, -996.009, -996.010, -996.011, -996.012
Hexaeder -10000.001, -10000.002, -10000.003, -10000.004, -10000.005, -10000.006, -10000.007, -10000.008, -10000.009, -10000.010, -10000.011, -10000.012, -9996.001, -996.002, -996.003, -996.004, -996.005, -996.006, -996.007, -996.008, -996.009, -996.010, -996.011, -996.012
Die Libre-office Datei soll alle Materialien enthalten die Erstellung der Hexaeder-Formatiereung sollk aber in einzelne Dateien abgelegt werden So meine Vorstellung. Ich kalkuliere das ich für eine 90-Grad Kurve so etwa 200 Zeilen je 8 Hexaeder-Einträge benötige also ca. 1600 Einträge

Ich denke das müsste in einer Tabellenkalkulation möglich sein.

Soweit die Grund-Idee.
Du Balu hast eine Versuin meiner Datei gesehen in der Ich vieles noch nicht wusste was die Programmierung betrifft. Viele Ideen habe ich auch wieder verworfen (Dank einiger *Rüffler von Marcel) Ich hoffe er schminmzelt jetzt etwas wenn er das lesen sollte.
Da ich am Anfang sogut wie keine Erfahrung in Starbasic oder wie auch immer das heisst hatte (Für mich schon verwirrend zwischen Libroffice und Openoffice zu unterscheiden) muss ich halt noch vvvviel Lernen und habe nicht die Erfarung wie Ihr. Mir war nicht klar das brechnungen un einer Tabelle langsamer sind als ein Progrann Code *Oder habe ich da was nicht verstanden???.
Jedenfalls kommt es mir nicht auf die Sekunde an die ein Programm braucht * Bin ja Rentner und habe Zeit . Aber ich bin für Eure Tipps und Anregungen sehr dankbar.

Ich bin momentan dabei Sachen zu überarbeiten. Wie ich schon vorgestern schrieb will ich erst einen gewissen Stand fertig haben um Ihn Marcel zur Überprüfung zu verfügung zu stellen *falls er sich dieser noch annehmen möchte * mal verschämt um die Ecke schaue aber er hat ja geschrieben wenn er leine Kust mehr hat Helfen mir die anderen :lol:


so Ich habe hoffentlich nichts vergessen War jetzt Zwar etwas ausführlich aber ich hoffe es hat mehr klarheit erzeugt was ich vorhabe.
So mich wieder in mein Bett verkrauche und versiche endlich diese Scheiss Grippe los zu werden. Nicht das mein Rechner sich noch anstecckt

Schönen Abend an Euch und ein erholsames Rest-Wochenende

Gruss DIrk

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von balu » Sa, 18.01.2020 14:53

Hallo

@mikeleb
Prima erklärt. Danke dafür *daumen-hoch* 8)


@Marcel
... allerdings reicht deren Indexbereich irgendwie nur bis 32767.
Ist doch logisch.

Code: Alles auswählen

Function GetLastUsedRow(oSheet as Object) as Integer
INTEGER nimmt halt nicht mehr auf als der von dir bobachtete Wert.

Bei der Variablen deklaration muss man halt aufpassen was man nimmt. In sehr vielen Fällen reicht beispielsweise der INTEGER. In anderen Fällen muss man sich andere Typen nehmen. Es gibt ja auich Typen die nicht wie INTEGER nur mit ganzen Werten arbeiten, sondern auch mit Nachkommastellen. Und bei denen gibt es dann eine extrem hohe aufnahmekapazität an Werten. Da muss man aber schon mit bedacht rangehen, da diese das Office belasten können. Ich sage extra können, weil ich nicht weiss wie sich das so auf modernen PC-Systemen so verhällt.

A-propo modern.
Ich glaube das in diesem Falle das mit dem INTEGER noch ein überbleibsel aus der Zeit von der aller ersten OpenOffice.org, genauer gesagt von der StarOffice 6 Version stammt. Denn beide stammen von dem damals deutschem StarOffice 5.2 ab. Und damals war in einer Tabelle bei der Zeile 32.000 Schluß mit Lustig (bei den Spalten bei IV = 255), mehr ging nicht. Und nein! Nicht irgendwo bei 32.000 und ein paar kaputte, sondern exakt bei 32.000.
Also warum einer Variablen einen Typ zuordnen die mehr aufnehmen kann, wenn das Sinnlos ist? Deshalb INTEGER.

Falls Du mehr über die Historische Geschichte von AOO, oder aber auch LO, wissen willst, da alle von dem StarOffice 5.2 abkömmlinge sind, schau mal hier rein.



Gruß
balu

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von mikeleb » Sa, 18.01.2020 14:18

Hallo,
zum Code

Code: Alles auswählen

x = oBlatt.Columns(1).queryEmptyCells()
liefert die freien Bereiche der Spalte B. Solange diese Spalte von oben herab (sagen wir bis Zeile 10) vollständig gefüllt ist, gibt es nur einen freien Bereich (nämlich ab Zeile 11). wenn die Spalte aber lückenhaft gefüllt ist, suchen wir nach dem letzten freien Bereich und darin der ersten Zeile. Deswegen liefert:

Code: Alles auswählen

iLetzte = x(x.Count-1).RangeAddress.StartRow - 1
die letzte Zeile, in der etwas steht.
Damit ist klar, dass diese Variante versagt, wenn in der allerletzten Zeile etwas steht.
Dann bliebe auch noch die (Standard-)Variante über den Cursor:

Code: Alles auswählen

  oObj1 = oBlatt.createCursor()
    oObj1.gotoEndOfUsedArea(False)
  aRangeAddress = oObj1.getRangeAddress()

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von marcel_at_work » Sa, 18.01.2020 02:26

@balu:

Aus reiner Neugier hab' ich mal kurz in der Tools-Bibliothek gestöbert und es gibt analog unter misc auch schon eine fertige Funktion dafür: getLastUsedRow()

... allerdings reicht deren Indexbereich irgendwie nur bis 32767.

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von balu » Sa, 18.01.2020 02:22

Moinsen Marcel,

Na das mit der Schande kannst stecken lassen. Hier geht es ja nicht nur um das Helfen, sondern auch um Erfahrungaustausch.

Ich hatte hier im Forum nur mit Calc angefangen, und dann auf Dialoge in Calc "umgesattelt", also haben wir eins gemeinsamn, die Dialoge. Aber eins verspreche ich dir, ich werde mich hüten in deinem Jagdrevier Datenbanken rumzuwildern, das ist nicht meine Welt :lol:.

Ja! Unterschiede gibts, die muss man selber erstmal Beobachten und Erfahren. Denn sonst denkt man sich "Is ja eh alles nur dummes Geschwätz" ;-)
Und von daher freuts mich das Du was dazu lernen konntest. *daumen-hoch*

Die Sache mit dem Code von Stephan wird er dir besser erklären können.

Rationalisierungen sind immer gut, so fern sie einem guten zweck dienen.

Das mit dem Maßstab nehmen kann man getrost vergessen, wenn man das geignete Werkzeug an der Hand hat. Das schützt vor bösen Überraschungen, so wie bei mir damals. Erst hieß es; Mit 32 Einträgen kommen wir gut aus. Und etwas später dann; NÖ! Müssen auf 96 erhöhen. Und dann wieder das Ruder zurück auf 32. :roll:

Ich bin wohl nicht mehr der Jüngste. Aber "Ein alter Hase" in Bezug auf Programmierung bin ich nicht. Ich bin da ehern der LED-Anfänger. Ich leuchte wohl, aber ich überstrahle nicht 8) . Dennoch danke fürs Kompliment.



Gruß
balu

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von marcel_at_work » Sa, 18.01.2020 01:35

Hey balu,

"Schande über mein Haupt." :shock:

Ich muss sagen, daß ich im Umgang mit Calc gar nicht wirklich gut bin - seit meiner ersten Begegnung mit OpenOffice arbeite ich fast ausnahmslos nur mit Dialogen und Datenbanken. Ich sollte wohl ab und an auch mal andere Sachen ausprobieren, was?!
Mit wievielen befüllten Zeilen hast Du das getestet?
Ich nehme alles zurück. Ich habe meine Aussage unter anderem aus der Annahme heraus gemacht, daß getDataArray() mehr Spalten abarbeiten muss - aber alles war falsch und ich kann es immer noch nicht glauben:

Ich habe jetzt beide Funktionen allein mit der Array-Deklaration und -Definition/Wertzuweisung getimed, also einmal die FOR mit zwei und dann getDataArray() mit 4 Spalten.

Bei 100.000 Elementen benötigt getDataArray() knapp eine Sekunde und die FOR fast zehn - hätte ich nie gedacht, oh wei. :shock:
Ich hatte einmal sehr kurz in eine Version von Dirk seiner Datei reingeschaut, und da fiel mir ziemlich schnell auf: Das Ding wird noch imens Wachsen. Nicht nur von den Inhalten der einzelnen Zellen im Tabellenblatt, nein, auch das Makro wird sehr "Fättleibig". Soll heißen, der Umfang nimmt rasch zu.
Dies ist mir bewusst. Und jetzt stell dir das mal vor - ich habe mit Dirk letztens schon einen großen Teil wegrationalisiert. :lol:
Nun, zu der Schleife über alle Zellen um die letzte Zeile zu finden, gibt es da noch einen kleinen aber "unscheinbaren" Pferdefuß. Denn es muss ja eine "Endzeile" zuvor festgelgt werden in der "For n = 3 To 250".
Dirk schrieb, daß es etwa 150 Einträge werden können - dies nahm ich als Maßstab.

Ich habe deine angegebene Funktion auch mal in der Dokumentation angeschaut und getestet, aber folgendes ist mir aufgefallen:

Code: Alles auswählen

x = oBlatt.Columns(1).queryEmptyCells()
iLetzte = x(x.Count-1).RangeAddress.StartRow - 1
1) Count ist scheinbar ein Zähler für enthaltene Bereiche oder so (bin grad zu faul zum Suchen) - dieser ist bei mir aber standardmäßig 1.

Code: Alles auswählen

x = oBlatt.Columns(1).queryEmptyCells()
x(0).RangeAddress.StartRow - 1
... wäre also die bessere Wahl?

2) Bei Zeilenindex MAX, also Zeile 1.048.576 gibt es einen Stapelüberlauf - Index außerhalb des definierten Bereiches. Hab' mir das jetzt nicht genauer betrachtet, aber da sollte man wohl noch eine Prüfung, oder Ähnliches einbauen?

Ansonsten eine wirklich grandiose Funktion (für Tabellenblatt-Benutzer). Bei 1.000.000 Elementen um Welten schneller als die analoge FOR.

Puh......... und wieder einmal ein Tag voll großer Entdeckungen vorbei. Vielen Dank' (auch an Stephan)! :lol:

Eine wundervolle Nacht,

Marcel

Ps:
Manchmal muss man in einem Makro ein paar Zeilen mehr tippen, um schneller voran zu kommen.
Ich habe früher einige Jahre Mikrocontroller programmiert und kann dies so nur bestätigen. Software in z.B. Assembler-Sprache ist zwar kaum zu lesen und sagenhaft lang - aber effektiver geht es nur noch in Maschinencode.
Das Wissen über die interne Umsetzung der Befehle in OOo habe ich aber leider nicht und so hilft nur ausprobieren oder z.B. solch' alten Hasen, wie dir, ein paar kleine Tricks aus dem Ärmel locken... :lol:

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von balu » Fr, 17.01.2020 22:31

Hallo Marcel,

wie kommst Du denn darauf das sich hier irgendwer gestritten hat? *kopschütteltztztz*
Ich glaube, ich kann etwas Licht ins Dunkel bringen
Danke. Das hast Du jetzt auch geschafft.

du musst diese also mittels einer zusätzlichen Schleife herausfinden.
Warum bitte schön?
Warum mittels Schleife über alle Zellen einer Schleife wandern, vergleichen eine Aktion ausführen, und die nächte Zelle büdda schee.

Die Funktion getDataArray() finde ich zwar ganz übersichtlich und schick, aber eine reine Schleife über die Tabellenzeilen ist zumindest in Dirk's Situation, mit den zwei 'unnötigen' Spalten zwischen den eigentlichen Abfragesequenzen, mindestens doppelt so schnell.
Mit wievielen befüllten Zeilen hast Du das getestet?
Hast Du das auch in Dirk seiner aktuellen "Hauptdatei" getestet?
Da werden in meinen Augen einfach zu viele Interaktionen zwischen Makro und Tabellenblatt ausgeführt, und das kostet Zeit.

Ich hatte nämlich auch mal so nach der Devise gehandelt:
"Ach Watt solls? Die paar Zeilen kann man ruhig so per Makro abarbeitrn."

Tja und irgendwann merkte ich, je länger das gesamte Makro wurde, und je mehr dieser unnötigen Interaktionen statt fanden, dabei waren nicht sehr viele Zeilen in interaktion, um so länger dauerte das Öffnen der Datei und umso länger dauerten viele weitere Aktion. Also fing ich an zu Optimieren. Habe wohl nicht so optimieren können wie es hier die Profis es geschafft hätten, aber das was ich gemacht hatte, das brachte spürbare Geschwindigkeitvorteile. Die mir auch von einer anderen Person bestätigt wurden.

Ich hatte einmal sehr kurz in eine Version von Dirk seiner Datei reingeschaut, und da fiel mir ziemlich schnell auf: Das Ding wird noch imens Wachsen. Nicht nur von den Inhalten der einzelnen Zellen im Tabellenblatt, nein, auch das Makro wird sehr "Fättleibig" :lol:. Soll heißen, der Umfang nimmt rasch zu.

Und was hatte ich da gesehen?
Es wurden sehr viele Rechenoperationen im Tabellenblatt durchgeführt, worauf dann das Makro irgendwie zugriff, beziehungsweise damit weiter arbeitet/rechnete. So was ähnliches hatte ich auch gemacht. Aber ich merkte, das dauert. Und so wurde halt im Makro gerechnet, und schon wieder etwas flotter.

Nun, zu der Schleife über alle Zellen um die letzte Zeile zu finden, gibt es da noch einen kleinen aber "unscheinbaren" Pferdefuß. Denn es muss ja eine "Endzeile" zuvor festgelgt werden in der "For n = 3 To 250". Und was ist wenn Dirk mal nicht daran denkt, und aus irgendwelchen Gründen die "Endzeile" überschritten wird? Die folgenden Zeilen werden dann nicht berücksichtigt, und wenn das auffällt, beginnt das große Suchen:
"Warum? was ist da los? Wo ist da was los?....."

Das ist kein guter Plan. Nein wirklich nicht.

Also für die letzte benutzte Zeile benutze ich einen kleinen, aber seeeeehr schnellen Code. Die Original Version stammt von Stephan.
Hier ist er.

Code: Alles auswählen

SUB GGG

oBlatt= ThisComponent.Sheets.getByName("Material")

	With oBlatt ' Letzte Zeile der Spalte B ermitteln
		x = .Columns(1).queryEmptyCells()
		iLetzte = x(x.Count-1).RangeAddress.StartRow - 1
	End With
	
	print iLetzte
	
end sub
Dieser Code ist sehr vielseitig anwendbar. Ich nehme ihn immer wieder zu gerne, weil er auch so schön kurz ist. Auf seine Lösung wär ich mein Lebtag nicht gekommen. Also einfach ausprobieren.

Ach ja, noch ne kleinigkeit zum Schluß.

Manchmal muss man in einem Makro ein paar Zeilen mehr tippen, um schneller voran zu kommen.



Gruß
balu

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von marcel_at_work » Fr, 17.01.2020 20:16

@all:

Hallöchen erstmal, ihr Zankäpfel :lol: ...

@balu:

Ich glaube, ich kann etwas Licht ins Dunkel bringen, da ich den Code von Dirk's Projekt mehrere Male analysieren und testen musste/wollte.

Dirk möchte nichts in irgendeine Zelle schreiben. Das Ergebnis der Funktion, über die wir hier philosophieren, ist für die reine Anzeige auf einem Dialogfeld bestimmt und dient Informationszwecken - nur deshalb hat er auch den String "mm" in sein Ausgabe-Objekt geschrieben (scheinbar möchte er damit nichts weiter berechnen). Ziel war, das Schreiben in das Tabellenblatt zu verhindern.

@Dirk:

Vielen Dank, dir auch... und keine Sorge - ich muss dir ja nicht antworten. Die anderen werden sich dir dann schon annehmen! 8)
Dein Vorschlage habe ich kopiert aber noch nicht verstanden.
1) Die Daten in deiner Materialliste sind dynamisch, werden sich also stetig ändern.
2) Wenn du die enthaltenen Zellen abfragen möchtest, musst du dafür die Zeilennummer der letzten belegten Zeile wissen. In deinem Beispiel hast du dafür deine Variable bz mit 10 definiert. Aber auch diese Nummer wird sich mit dem Inhalt deiner Tabelle verändern - du musst diese also mittels einer zusätzlichen Schleife herausfinden.

Beispiel:

Code: Alles auswählen

For n = 3 To 250
	If oBlatt.getCellByPosition(1, n).Value <> "" Then 'Prüfung auf vorhandenen Inhalt	
		... 'wenn Zeile belegt, irgendeinen Code ausführen
	Else
		'... in deiner Beispieltabelle nach 16 Zeilen:
		Exit For ''... ab der ersten leeren Zeile ist n = gesuchter Zeilenindex: also Schuhe anziehen und den Raum verlassen ;-)
	End If
Next
Und wenn du sowieso schon eine Schleife über deine Tabellenzeilen hast, sind die zwei zusätzlichen Zeilen mit der Array-Erstellung und Wertezuweisung eben gar nicht mehr so viel Mehraufwand:

Code: Alles auswählen

Dim arrMaterial() As Variant
Dim n As Integer
Dim m As Integer : m = 0

For n = 3 To 250
	If oBlatt.getCellByPosition(1, n).Value <> "" Then 'Prüfung auf vorhandenen Inhalt
		Redim Preserve arrMaterial(m) As Variant 'Neudimensionierung des Arrays
		arrMaterial(m) = oBlatt.getCellByPosition(1, n).Value & " " & oBlatt.getCellByPosition(4, n).Value & " mm" 'Extrahierung des Spalteninhalts
		m = m + 1
	Else
		Exit For
	End If
Next
Wenn du der Variable bz vorher einen festen Wert, mit z.B. 150, zuweist, sind auch im Ergebnis der Funktion getDataArray() 150 Elemente enthalten, wobei diese dann (bei leeren Zeilen in deiner Tabelle) eben auch leer sind - aber vorhanden. Du hast dann dort also 600 einzelne Elemente!
Es hilft also nicht einmal, in der getDataArray()-Funktion mit demselben Array weiterzurechnen - es muss ein zweites Array, mit einem vom ersten Array ungebundenen Zeilenindex erstellt werden, so wie Tom es schon erwähnte.

@all:

Die Funktion getDataArray() finde ich zwar ganz übersichtlich und schick, aber eine reine Schleife über die Tabellenzeilen ist zumindest in Dirk's Situation, mit den zwei 'unnötigen' Spalten zwischen den eigentlichen Abfragesequenzen, mindestens doppelt so schnell.

Liebe Grüße,

Marcel

EDIT:

@Stephan:

Code: Alles auswählen

Sub testArray
	Dim vz As Integer : vz = 3
	Dim bz As Integer : bz = 5
	Dim oBlatt As Object
	Dim A_Daten2 As Object
	Dim i As Integer
	Dim tmp
	Dim tmp2(1)

	oBlatt = thisComponent.Sheets.getByName("Material")
	A_Daten2 = oBlatt.getCellRangeByPosition(1, vz, 4, bz).getDataArray()
 
	For i = 0 To uBound(A_Daten2)
		tmp = A_Daten2(i)
		tmp2(0) = tmp(0)
		tmp2(1)= tmp(3) & " mm"
		A_Daten2(i) = tmp2
	
		MsgBox join(A_daten2(i), "/")
	Next
End Sub
Wenn ich deine erste Funktion wie oben abfrage, bekomme ich ein korrektes Ergebnis?! Mache ich etwas falsch?

Re: [gelöst]Anfänger-Problem mit Array-Bildung

von balu » Fr, 17.01.2020 14:13

Hallo Dirk.
Tut mir leid das ich vielleicht die Sache etwas zu ungenau beschrieben habe.
Und es ist noch nicht wirklich besser geworden. Denn Du hast jetzt ein Array, okay, aber WOHIN schreibst Du das Array im Tabellenblatt rein? Etwa in die Spalten K und L, oder aber an den Ursprungsort wieder zurück?

Wenn wieder Ursprungsort, dann brauchst Du kein "Mehrspaltiges" Array. Denn dann must Du nur die Spalte E mit der Stärke bearbeiten, also ein "Einspaltiges" Array. Und von dem was ich mir bis jetzt so zusammengereimt habe, willst Du ja nur in dieser Spalte E die Maßeinheit anhängen.

Für dich mag das jetzt vielleicht fast nebensächlich sein, wenn die nicht veränderte Spalte B trotzdem mit verarbeitet wird, obwohl es ja nur um die Spalte E geht. Aber auch die schnelle Methode mit Array zu arbeiten kann man durchaus in die Knie zwingen, wird also alles sehr langsam.

Also, warum willst Du die Spalte B mit verarbeiten lassen, und WOHIN schreibst Du das Array im Tabellenblatt?



Gruß
balu

Nach oben