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

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

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

Beitrag von pcdirk91 »

Erstellung Array.ods
sol ist das Blatt aufgebaut
(16.55 KiB) 229-mal heruntergeladen
Erstellung Array.ods
sol ist das Blatt aufgebaut
(16.55 KiB) 229-mal heruntergeladen
Hallo Ihr Experten,
Ich habe eine Tabelle mit dem Namen Material. Dort gibt es folgende Spalten Nr., Bezeichnung,Material-Nr und Stärke
Die Anzahl der Zeilen hängt von der Anzahl der angelegten Materialien ab. Es können hier bis zu 150 Zeilen oder mehr belegt sein.

Jetzt möchte ich ein Array mit den Spalten B und E erstellen. Dies habe ich auch zustande bekommen.

Code: Alles auswählen

Option Explicit

Sub ErstellungArray
 Dim ocell as Object
 Dim vz as integer : vz=3
 Dim bz as integer : bz=10
 Dim oBlatt as Object
 Dim A_Daten2 as Object
 Dim i as Integer
 Dim tmp

 oBlatt= ThisComponent.Sheets.getByName("Material")
 A_Daten2= oBlatt.getCellRangeByPosition(1,vz,1,bz).getDataArray										'			' Aus dem  aktiven Blatt alle Datensätze in der 1.Spalte in das Array A_Daten_2 aufnehmen
 oBlatt.getCellRangeByPosition(10,vz,10,bz).setDataArray(A_Daten2)													' Das Array "A_Daten2" in dem aktiven Blatt in die Spalte "K" einfügen
 A_Daten2= oBlatt.getCellRangeByPosition(4,vz,4,bz).getDataArray													' Aus dem  aktiven Blatt alle Datensätze in der 4.Spalte in das Array A_Daten_2 aufnehmen
 oBlatt.getCellRangeByPosition(11,vz,11,bz).setDataArray(A_Daten2)													' Das Array "A_Daten2" in dem aktiven Blatt in die Spalte "L" einfügen
 A_Daten2 = oBlatt.getCellRangeByPosition(10,vz,11,bz).GetDataArray													' Aus dem  aktiven Blatt alle Datensätze in den Spalten "k" bis "L" in das Array A_Daten_2 aufnehmen
 For i = 0 To UBOUND(A_Daten2)																						' Die Schleife solange durchlaufen solange Datensätze vohanden sind
	tmp = A_Daten2(i)																								' Den aktuellen Datensatz in der Schleife in die Variable "tmp" schreiben
	tmp(1) = tmp(1) & " mm"																							' Bei der Materialstärke noch die Buchstaben "mm" hinzufügen
	A_Daten2(i) = tmp																								' Die Variable Tmp in das Datenaaray A_Daten schreiben
 Next																												' Den Zähler "i" umm den Wert 1 erhöhen
 ocell =oBlatt.getCellRangeByPosition(10,vz,11,bz)																	' Die Object Var. "oCell" mit dem Breich des Arrays A_Daten2 belegn
 oCell.clearContents(com.sun.star.sheet.CellFlags.VALUE _
				   +com.sun.star.sheet.CellFlags.STRING)															' Die in der Object Var. "oCell" enthaltenen Zellen von Werten und Strings leeren
End Sub


Das passende Array wird auch erstellt, aber ich frage mich ob dieses Array auch erstellt werden kann, ohne die entsprechenden Spalten zu lopieren und nach Erstellung des Arrays wieder die Ich nenne es mal "Hilfsspalten" wieder zu löschen.

Ich habe schon einige Stunden versucht das zu lösen, aber bin leider zu keinem Ergebnis gekommen.
Für Euch ist das sicher ein klacks. Ich würde mich freuen von euch einen Weg aufgezeigt zu bekommen. Ich wünsche Euch noch einen schönen Tag.
Gruss Dirk
Zuletzt geändert von pcdirk91 am Fr, 17.01.2020 13:33, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Stephan »

Folgendes sollte funktionieren, tut es aber nicht:

Code: Alles auswählen

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
 Next
Fehler ist das A_Daten2() in allen Zellen die jeweils gleichen WErte enthält und zwar entsprechend dem letzten Inhalt von tmp2(), so als erfolge die Wertzuweisung dynamisch.


Ich stelle das hier nur ein damit meine grundsätzliche Lösungsidee ersichtlich ist und das mir jemand sagt was ich falsch mache.


Gruß
Stephan
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Toxitom »

Hallo Dirk,

nur mal als Anregung: Du weisst schon, dass Du einfach die Spalte E mit einer Zellformatierung belegen kannst? Formatcode: # " mm" - da brauchste kein Makro und rechnen kannste auch noch:)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Anfänger-Problem mit Array-Bildung

Beitrag von balu »

Hallo

@Dirk
Mal etwas ganz einfaches.
Warum machst Du dir hiermit

Code: Alles auswählen

ocell =oBlatt.getCellRangeByPosition(10,vz,11,bz)	
oCell.clearContents(com.sun.star.sheet.CellFlags.VALUE _
				   +com.sun.star.sheet.CellFlags.STRING)
dir das Leben unnötig schwer?
Geht bei dir in deinem Office etwa das folgende nicht?

Code: Alles auswählen

REM Das folgende könntest Du dir sparen.
REM ocell =oBlatt.getCellRangeByPosition(10,vz,11,bz)
REM oCell.clearContents(com.sun.star.sheet.CellFlags.VALUE _
REM				   +com.sun.star.sheet.CellFlags.STRING)	

REM Es müsste nur die folgende Zeile reichen.
oBlatt.getCellRangeByPosition(10,vz,11,bz).clearContents(4)
Da ich dein Office nicht kenne, ksnn ich nur sagen; Probiers einfach mal aus! Und wenn mein Vorschlasg nicht funzt, dann nimm deine Methode.
Hier noch ein Link wo weitere Nummernparameter nachzulesen sind.
http://www.starbasicfaq.de/Zelleloeschen.html
Also ich persönlich hatte bis jetzt bis zu LO 5.1.5.2 keine Probleme damit.


@Stephan
Folgendes sollte funktionieren, tut es aber nicht:
Willkommen im Club.
Vom Grundprinzip war ich auf die gleiche Idee gekommen, also Array einlesen, Arrayzeile für Arrayzeile zu ändern, anschließend an gleicher Stelle im Tabellenblatt sofort das Array wieder zurückschreiben. Jedoch hatte ich gestern abend auch einen Knoten im Gehirn. Dachte ich doch das dies ganz simpel sein müsste, aber dem war nicht so. Und der Knoten ist noch immer vorhanden.

Ich kann wohl in meiner Grabelkiste Fättplatte rumstöbern und dann Arrays erstellen, kopieren, verschieben, löschen, Filtern, und nach einem Suchbegriff suchen, oder mir eine Zeilennummer ausm Array zurückgeben lassen, und das auch mit mehrdimensionalen Arrays (oder Array in Array). Aber ändern und sofort wieder zurückschreiben, da hakts bei mir aus.

Klar bin ich nicht der Könner wie Du oder Tom, aber es nervt mich schon gewaltig, das ich es nicht so einfach hinberkomme. :-x


@Tom
da brauchste kein Makro und rechnen kannste auch noch:)
Du Spielverderber Du :lol:
Du hast aber etwas vergessen.
Im groben weiss ich wobei es sich bei der Datei von Dirk handelt. Und deshalb kann ich sagen, das die vorgenommene Formatierungslösung auch in einem Textfeld in einem Dialog angezeigt wird.Auch wenn in der Tabellenzelle z.B. 10,05 steht, aber durch die Formatierung 10,05 mm angezeigt wird, so wird das auch in dem eben besgten Textfeld angezeigt.

Okay, das habe ich mal eben auf die schnelle hier für mich getestet, deshalb weiss ich das es zumindest bei mir funzt.

Was ich jetzt aber nicht getestet habe, aber logischerweise (nach meiner Logik her) nicht funktionieren wird ist, das "Rechnen im Dialog" mit dem Textfeld. Denn dazu muss ja erstmal der Eintrag des Textfeldes in einen Wert umgewandelt werden. Aber in diesem vorliegendem Fall muss ja zu erst die Maßeinheit samt vorlaufendem Leerzeichen entfernt werden, und dann kann die Umwandlung von Text zu Wert vorgenommen werden. Aber dieses "Problem" mit der Umwandlung hätte Dirk auch, wenn er es geschafft hätte die Maßeinheit direkt in einer Tabellenzelle zu schreiben.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Anfänger-Problem mit Array-Bildung

Beitrag von marcel_at_work »

Hallöchen Dirk,

schön mal wieder etwas von dir zu lesen. 8)

z.B. ohne getDataArray()

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 '... ab der ersten leeren Zeile, Schuhe anziehen und den Raum verlassen ;-)
	End If
Next
Dieser Vorschlag basiert darauf, daß du zum einen nicht mit den Daten weiterrechnen möchtest und zum anderen, daß du die Variable bz in jedem Fall sowieso über eine Schleife herausfinden musst - warum dann also nicht gleich bei der Zeilenabfrage deren Werte abspeichern?!

@Tom:
nur mal als Anregung: Du weisst schon, dass Du einfach die Spalte E mit einer Zellformatierung belegen kannst? Formatcode: # " mm" - da brauchste kein Makro und rechnen kannste auch noch:)
Dies ist wohl wahr, aber die Tabellen scheinen Dirk ausschließlich als Datenbank zu dienen - die optische Anzeige der Daten erfolgt über die Steuerelemente im Dialog, soweit ich das letztens mitbekommen habe.

Viele Grüße,

Marcel
Zuletzt geändert von marcel_at_work am Do, 16.01.2020 21:13, insgesamt 3-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Stephan »

Folgendes sollte funktionieren, tut es aber nicht:
es funktioniert folgende Variante:

Code: Alles auswählen

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)
	A_Daten2(i) = Array(tmp(0), tmp(3) & " mm")
 Next
warum es so geht, aber auf dem anderen Wege nicht verstehe ich nicht.


Gruß
Stephan
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Anfänger-Problem mit Array-Bildung

Beitrag von marcel_at_work »

Hi Stephan,
Auszug aus Andrew Pytoniak's OOME:

getData() + getDataArray()

Liest ... Daten als verschachtelte Wertsequenz aus (Arrays in Arrays).
Der Inhalt eines Elements von A_Daten2 referenziert somit scheinbar wiederum ein Array und keine Daten?

Liebe Grüße,

Marcel
Zuletzt geändert von marcel_at_work am Do, 16.01.2020 21:18, insgesamt 1-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Stephan »

Hallo Marcel,
Der Inhalt eines Elements von A_Daten2 referenziert somit ein Array und keine Daten.
ja, natürlich.

In wieweit erklärt das das Nichtfunktionieren des ersten Codes:

Code: Alles auswählen

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
 Next

A_Daten2 ist eine Array-Variable in der jedes Feld A_Daten2(i) seinerseits ein Array enthält.

tmp wird nun der Inhalt von Feld A_Daten2(i) zugewiesen, also ein Array.

tmp2() ist seinerseits ein Array (hier im Forum hatte ich leider fälschlich das Dim tmp2(1) weggelassen).

Was also ist anderes zu erwarten als das mit A_Daten2(i) = tmp2 dem Feld A_Daten2(i) der jeweils aktuelle Inhalt von tmp2 zugewiesen wird?

Was passiert ist aber merkwürdigerweise das die Zuweisung quasi 'dynamisch' erfolgt, so das am Ende alle Felder A_Daten2(i) das letztaktuelle (und damit inhaltsgleiche) Array tmp2 enthalten.



Gruß
Stephan
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Anfänger-Problem mit Array-Bildung

Beitrag von pcdirk91 »

Hallo Leute,

zunächst einmal vielen Dank für Eure Beiträge. Ich bon gerade erst dazu gekpmmen eure Antworten an zu sehen. *Mich hat die Grippe erwischt

Jetzt zu Euren Antworten
@ Stephan
Ich fonde es klasse wie Du das Problem doch gelöst hat. Vielen vielen Dank dafür. Habe es gerade grob getestet und auf den 1. Blick genau das was ich
wollte. '' :-))

@ Toxitom
nur mal als Anregung: Du weisst schon, dass Du einfach die Spalte E mit einer Zellformatierung belegen kannst? Formatcode: # " mm" - da brauchste kein Makro und rechnen kannste auch noch:)
Danke für den berechtigten Tipp; und ja das mit dem Zellformat weiss ich. hatte es gestern aber nicht in dem Blatt formatiert. *Schande über mich
Aber wenn ich die Spalte "Stärke" in das Arry aufnehme stehen dann die "mm" nicht drinnen. und mir würde es gefallen dann im Grid halt die mm zu sehen. Ich brauche das dür einen DIalog. Aber dennoch danke für den Hinweis
PS. Frag Marceel at Work der schägt sich mit mir schon eine ganze Weile rum *Grins Ich wollte die Frage meinerseits aber nicht ausufern lassen

@Balu
Mal etwas ganz einfaches.
Warum machst Du dir hiermit dir das Leben unnötig schwer?
Geht bei dir in deinem Office etwa das folgende nicht?
Tja Balu "Warum einfach, wenns imständlich auch geht !!!!" und wie schreibst du in Deinem Abspann??? "Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass."
Also Spass beiseite Scherz wo bist Du : Ich habe das löschen von Michiael Dannenhöfer kopiert und das mit "clearContents(4)" nicht verstanden. Jetzt habe ich mir das nochmals duchgelesen und der Groschen it gefallen. *Naja auch ein blindes Huhn findet mal ein Korn !!!"

@ Marcel
Du ich bin nicht untergetaucht , hatte nur viel um die Ohren . Die Feiertage über war ich relativ fleissig. Ich wollte DIch nicht stören. Baue ettliches um und wollte erst einen bestimmten Stand haben und den dann in dem anderen Thread "den ich dann umbenenne dir Schicken. Ich denke das ich das in 2 bis 3 Tagen soweit habe. Bin gespannt wieviele Köpfe ich dann lürzer rumlaufen muss *Gröhl.
Dein Vorschlage habe ich kopiert aber noch nicht verstanden. Aber mir dröhnt heute der Kopf schaue es mir morgen an
Ach und ehe ich es Vergesse Ich wünsche Dir ein erfolgreiches und gesundes neues Jahr !!!


DIe Neujahres-Wünsche gelten natürlich für Euch alle. Ich muss mich für al die Tipps bedanken. Ich habe jede Menge daraus gelernt.
So ich hoffe ich habe niemanden vergessen. Ich verziehe mich wieder in mein Bett mit ner Tasse heisse Zitrone und versuche mal etwas Kraft zu tanken damit ich mirgen wieder etwas mehr zustande bekpmme.

Euch allen noch einen schönen geruhsamen Abend und bis zum nächsten Mal
Liebe Grüße
DIrk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Anfänger-Problem mit Array-Bildung

Beitrag von balu »

Hallo wehrte Mitstreiter.

@Stephan
Du ich glaube Marcel wollte wohl auf was anderes hinweisen. Und nach dem ich heute meinen Rechensklave schon einmal ausm Fenster gerworfen hatte, fiel mir da wieder was ein.

Nein, natürlich hatte ich meinen Sklaven nicht rausgeschmissen, aber alle Testdateien mit etlichen Testmakros geschlossen. Und keine 2 minuten später fiel mir dann das folgende ein.

Du hast dich gleich auf einen 4 Spaltigen Tabellenbereich gestürzt.

Code: Alles auswählen

getCellRangeByPosition(1,vz,4,bz)
Ich wollte für mich das aber Einspaltig angehen.

Code: Alles auswählen

getCellRangeByPosition(1,vz,1,bz)
Und egal was ich auch versuchte, NIX funzte.
Also dachte ich mir mal, versuch mal doch zumindest eine Simple IF-Abfrage einzubauen. Achtung! Pseudo-Code!

Code: Alles auswählen

IF A_Daten2(i) = Suchtext THEN
Aber nö!
Wie sollts auch anders sein, Fehlermeldung: Index außerhalb irgendwas blabla.
Ja *krutzdätürckchen*!
Was ist da los?

In einem anderem Makro funktioniert eine IF-Abfrage in einem Mehrdimensionalem Array (Array in Array) problemlos wie folgt. Pseudo ...

Code: Alles auswählen

IF aArray(z1)(s1) => Suchtext AND aArray(z1)(s1) <= Suchtext THEN
Und hier in einer "Spalte" versagt die IF-Abfrage!?
Nach langem hin und her, wie schon gesagt nach dem alle Dateien geschlossen waren, machte es bei mir KLKICK!

Code: Alles auswählen

IF A_Daten2(i)(0) = Suchtext THEN
Und ich bekam endlich mal eine positive Rückmeldung, da die IF-Abfrage fehlerfrei ausgeführt wurde. Oh man! War für eine schwere Geburt!

Hiermit war ich in meinen Testdateien auch nicht so erfolgreich.

Code: Alles auswählen

A_Daten2(i) = A_Daten2(i) & " mm"
Erst hiermit

Code: Alles auswählen

A_Daten2(i)(0) = A_Daten2(i)(0) & " mm"
kam ich für mich in einem "Einspaltigem" Array etwas weiter.

Aber das nützt bis jetzt auch nicht viel, da ich dein beobachtetes Symptom bestätigen kann. Denn trotz des 'Array in Array'-System wird nicht das zurückgegeben was man sich erhofft. Entweder kommt das bei XRAY raus

Code: Alles auswählen

1 mm mm mm mm mm mm mm mm mm mm
oder aber das

Code: Alles auswählen

1 mm 
mm
mm
mm
....
wenn man nach "mm" im Code noch ein CHR(13) anhängt.

Und das mit 'A_Daten2(i)(0)' war wohl das was Marcel angedeutet hatte.

Da ich aber für mich selbst mit einem "Einspaltigem" Array nicht mein Ziel ereiche, gebe ich es auf.


@Dirk
Humor trotz Rüsselfieber ist immer ein gutes Zeichen für die Genesung. Und deshalb schon mal an dieser Stelle: Viel Gesundheit.

Das mit Dannenhöfer ist ja so eine Sache. Denn es werden dort beide Systeme vorgestellt. Und das kann ein wenig verwirren.
Aber wenn mein Änderungsvorschlag jetzt bei dir auch funzt, dann ist ja alles bestens.

Ich hatte meine Fragen wirklich aus Unwissenheit gestellt, da ich die LO ab der 6er Linie nicht benutzen kann (ist ein anderes Thema, und steht nicht zur Diskussion ;-)), kommen halt solche Fragen. Da ich aber weiss das LO nicht identisch mit AOO ist, auch schon stark bei Makros, ist meine Unwissenheit berächtigt.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Toxitom »

Morgen Stefan,
In wieweit erklärt das das Nichtfunktionieren des ersten Codes:

Code: Alles auswählen

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
 Next
Also, an dem Code fehlst so einiges;)) Das fehlende Dim tmp() hast Du ja schon erwähnt - was aber zusätzlich zwingend ist, sind die Dimensionen! Die müssen passen.

Du list im Code eine Tabelle mit 4 Spalten aus - also muss der Zeilenarray 4 Elemente enthalten: Dim tmp(3) <- ist zwingend!
Dann stimmt die Zeile "tmp2(1)= tmp(3) & " mm"" nicht - das müsste heissen "tmp2(3)= tmp(3) & " mm"" - und außerdem musstest Du den Array tmp2 ebenfalls vorher definieren (zumindest unter LO). Er wäre aber auch überflüssig.

es reicht völlig:

Code: Alles auswählen

dim aZeile(3)
aDaten= oBlatt.getCellRangeByPosition(1,vz,4,bz).getDataArray
For i = 0 to ubound(aDaten)
   redim aZeile(3)   'Zeile nicht zwinged nötig, aber empfehlenswert!!
    aZeile = aDaten(i)
    aZeile(3) = aZeile(3) & " mm"
    aDaten(i) = aZeile
next

Die Redim Zeile ist nicht zwingend nötig, sollte aber unbedingt eingefügt werden aus zwei Gründen:
- Lesbarkeit des Codes - Klarheit der Variablen
- Vermeidung eines evt. Datenfehlers Fehlers - falls einmal ein leerer Zelleninhalt auftaucht, steht der vorherige Wert noch an der Position und wird übernommen. Ein solcher Fehler ist später im Betrieb quasi nicht mehr zu erkennen!

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Stephan »

es reicht völlig:
leider nein, weil ja in das damit erstellte Array wieder die Inhalte aller 4 Spalten Eingang finden (Dimensionierung von aZeile ist aZeile(3)), der Threadstarter aber nur jeweils 2 Spalten in seinem (Unter-)Array haben will und deshalb ursprünglich den komplizierten Weg gewählt hatte und nach möglicher Vereinfachung fragte.

anders gessagt: der Threadstarter will ein Array haben das sich nach z.B. oBlatt.getCellRangeByPosition(1,vz,2,bz) [sic] mit .setDataArray in das Tabellenblatt schreiben ließe.




Gruß
Stephan
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Anfänger-Problem mit Array-Bildung

Beitrag von Toxitom »

Hei Stephan,
..leider nein, weil ja in das damit erstellte Array wieder die Inhalte aller 4 Spalten Eingang finden ..
ja natürlich. Du hast ja auch nur eine Variable (a_Daten2()) - und die ist nun mal eine Matrix mit 4 Spalten. Das kannst Du nicht "on the fly" umdimensionieren.

Mein Kommentar bezog sich lediglich auf Deinen Codeschnipsel - Für de Threadersteller mag das nicht hilfreich sein (gebe ich Dir recht;)).

@Dirk: Nein, das geht nicht in einem Zug. Du brauchst auf jeden Fall 2 Variablen - eine 4-spaltige Matrix (falls Du alles einliest) und eine 2-Stellige Zielmatrix (wohlgemerkt mit der gleichen Zeilenanzahl!!) - in der Du die neuen Daten reinschreibst. Das geht nicht anders.

Bleibt nur die Schleifenvariante:)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
pcdirk91
***
Beiträge: 54
Registriert: Fr, 15.11.2013 18:02
Wohnort: Fürth/bay

Re: Anfänger-Problem mit Array-Bildung

Beitrag von pcdirk91 »

Hallo Stefan, Hallo Tim,
Tut mir leid das ich vielleicht die Sache etwas zu ungenau beschrieben habe. Nur zum Karstellen. Mein Ansatz im Eröffnungsthrad war dieser, das ich die Spalten mit der Nr und die Spalte der Stärke in das Blöatt Material nebeneinander kopiert habe.Dann:
-Mein Array erstellt hane wie ich es brauche
-und den Bereich in der Spalte k:L wieder gelöscht habe

Deen Bereich (K,vz,L,bz) brauche ich dann nie wieder;: Also wieder löschen.
DAs ganze hat mir nicht so gefallen. Erst etwas zusammen kopieren um ein Array zu erstellen und dann das Zusammengestellte wieder köschen bedeutet ja etwas tun und dann wieder köschen !!!

Die Lösung die STefan gestern Abend geschrieben hat:
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)
A_Daten2(i) = Array(tmp(0), tmp(3) & " mm")
Next
ist super. Ich erstelle mein Array ohne irgend etwas erst kopieren zu müssen. Und das Dies durch eine Schleife passiert "das stört mich nicht"

Also ergebnis ist so wie ich es mir gewünscht habe . *Alles gut
Ich wollte das nur klarstellen damit Ihr Euch nicht tja ich nenne das Mal so "nicht wegen mir in die Wolle belpmmt".
Also nochmals vielen Dank an Alle und einen schönen Tag

Gruß Dirk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

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

Beitrag von balu »

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
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten