Seite 1 von 1

getDataArray auslesen

Verfasst: Mi, 17.12.2014 19:45
von clag
Hallo Kenner und Könner ,

mit "getDataArray" habe ich einen Tabellenbereich von 3Spalten und 20Zeilen "eingelesen"
aber ich schaffe es nicht die einzelnen Werte zu lesen.
Mit

Code: Alles auswählen

myArray(15,2)
wie bei einem multidimensionalen Array tut es nicht

Code: Alles auswählen

myArray(15(2))
myArray(15,(2))
und solche und ähnliche versuche produzieren Fehler

dies hier gibt brave die gesamte Zeile aus

Code: Alles auswählen

print join(myArray(15), " ")
wie bekomme ich Zugriff auf ein einzelnes Element ?

Schonmal danke fürs Lesen.

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 19:58
von Stephan
mit "getDataArray" habe ich einen Tabellenbereich von 3Spalten und 20Zeilen "eingelesen"
das gibt ein Array der Form myArray(19) und in jeder Zelle des Arrays (myArray(0) bis myArray(19) ein Unterarray myArray2(2).

Lesen ist deshalb wie folgt möglich:

Code: Alles auswählen

For i = 0 To UBOUND(myArray())
	myArray2 = myArray(i)
	For j = 0 To UBOUND(myArray2())
		txt = txt & "|" & myArray2(j) 'in eine Zeile
	Next j
	txt = txt & CHR(13) 'neue Zeile	
Next i
Msgbox txt
Gruß
Stephan

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 20:26
von Karolus
Hallo

in python wäre das schlicht:

Code: Alles auswählen

doc = desktop.CurrentComponent
sel = doc.CurrentSelection
data = sel.FormulaArray
print('\n'.join('|'.join(row) for row in data)) 
ipython_noterbook.png
ipython_noterbook.png (13.75 KiB) 4570 mal betrachtet



Karolus

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 20:29
von clag
Hallo Stephan,

danke für die schnelle Antwort,

habe jetzt dies daraus gemacht

Code: Alles auswählen

aData2() = aData(15)
print  aData2(2)
um im Array "eingelesener Bereich A1:C20" die Zelle "C16" anzusprechen

kann man das auch noch in einer Zeile zusammenfassen?

Edit:
aha der Karolus (Pytolus) ;) war auch da
aber mit Python sieht das bei mir noch viel schlimmer aus, wie mit Basic.

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 21:21
von Stephan
naja, die spitzfindige Antwort ist das eine Zeile so ginge:

Code: Alles auswählen

aData2() = aData(15) : print  aData2(2)
aber das meinst Du natürlich nicht.

Deshalb: ich weiß es nicht.
Es gibt aber nach meiner Erinnerung zumindest ein Codebeispiel hier im Forum wie man es für GetData-Arrays schreiben kann wenn des ausgelesene Bereich nur einspaltig ist, aber das hilft Dir im KOnkreten ja nichts.

Persönlich muss ich ohnehin sagen das ich es immer so schreibe wie ich es hier gepostet hatte weil das für mich gedanklich am Einfachsten zu verstehen ist, und Letzteres ist doch wichtiger als 'kurzer' Code [1], weil es in Praxis doch immer nur darauf ankommt Fehler im Code schnell zu finden oder Code anzupassen und erweitern.

[1]
Ich schreibe das so weil ich zu Zeiten Basic programmieren gelernt habe wo auf den damaligen 8-Bit 'Kisten' [2] tatsächlich eine Rolle spielen konnte wieviele Zeilen und/oder Code ein Makro hatte weil jede zusätzliche Zeile (Auch wenns nur ein Kommentar war) das Makro u.U. merklich bremste (merklich meint hier Werte irgendwo im Milisekundenbereich), was dadurch kommt das bei damals sehr üblichen GOTOs und GOSUBs der Basic-Interpreter immer jede Zeile 'durchlas' bis er zu der gewünschten Stelle kam.
Heute ist schon rein die Hardware so schnell das _diese_ Dinge nicht mehr 'auffallen', ob sie überhaupt noch existent sind müsste man mal testen.


[2]
das hier war der erste Computer mit welchem ich Basic programmieren gelernt habe:
http://de.wikipedia.org/wiki/Z_9001,_KC_85/1,_KC_87

Lustigerweise hieß das Betriebssystem "CAOS" (Cassette Aided Operating System):
http://www.kcclub.de/index.php?option=c ... &Itemid=88


Gruß
Stephan

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 21:48
von Karolus
Hallo

@clag:
wieso greifst du zuerst auf ..DataArray zu, wenn du dann doch wahlfrei einzelne Zellen darin ansprichst?

Karolus

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 21:57
von clag
Hallo Strephan,

danke für deine ausführliche Antwort, daraus schließe ich eine direkte Adressierung wie bei dem multidimensionalen Array ist nicht möglich.
Wenn man also direkten Zugriff auf den Array Inhalt möchte, weil man einzelne Daten manipulieren will, ist es angebracht die Daten gleich per Schleife in ein multidimensionales Array einzulesen, dann muss die Schleife nur einmal beim lesen durchlaufen!?

Und Ja manchmal ist "mehr" eben doch besser und viel mehr noch besser, vor allem beim Takt von Bus und Prozessoren ;)

Kann mich auch entsinnen, irgendwann hatte ich mal einen neuen Rechner und glaubte meine Batches wären nicht mehr funktionsfähig,
aber nein sie waren nun nur so schnell, das man keine Ausführungszeit mehr bemerkte. :D

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 22:03
von clag
Hallo Karolus,

sehe gerade deine Frage,
Karolus hat geschrieben:wieso greifst du zuerst auf ..DataArray zu, wenn du dann doch wahlfrei einzelne Zellen darin ansprichst?
weil ich vorher nicht auf dem Schirm hatte das es da so gravierende Unterschiede gibt.

Aber jetzt erscheint es mir klarer,
get DataArray nur wenn man das "Ganze" bearbeiten will
multidimensionales Arrays für wahlfreien Zugriff!?

Danke für eure Hilfe

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 22:22
von Stephan
danke für deine ausführliche Antwort, daraus schließe ich eine direkte Adressierung wie bei dem multidimensionalen Array ist nicht möglich.
ich bin jetzt mal pingelig: im Zweifel meint meine Antwort nur das ich es tatsächlich nicht weiß, meine Antwort meint hingegen nicht das ich mir sicher wäre das es keinen Weg dafür gibt.
Wenn man also direkten Zugriff auf den Array Inhalt möchte, weil man einzelne Daten manipulieren will, ist es angebracht die Daten gleich per Schleife in ein multidimensionales Array einzulesen, dann muss die Schleife nur einmal beim lesen durchlaufen!?


Ehrlich gesagt ich verstehe nicht Dein Anliegen, wenn Du nur den Wert in C16 ändern willst, dann sprich doch nur diese Zelle direkt an:

Code: Alles auswählen

ThisCompoment.Sheets(0).getCellRangeByName("C16").Value = <Dein neuer Wert>
Wenn Du hingegen den Wert explicit nur im Array ändern wolltest, wozu macht das Sinn bei einem Array bei dem Du vor Kurzem noch garnicht wusstest wie Du damit umgehen solltest, was irgendwie ausschliesst Du wolltest das geänderte Array weiterverarbeiten.
Wenn Du das geänderte Array hingegen an eine andere Stelle zurückschreiben wolltest ginge das doch auch indem Du das unverändete Array schreibst und anschliessen die Einzelzelle änderst (die an der neuen Position ggf. durch eine andere Adresse repräsentiert ist).

Es ist natürlich nicht falsch das Du es so machen willst wie Du es machen willst, einzig könnte es sein mir fiele doch noch etwas Anderes ein, wenn ich denn Dein eigentliches Ziel kennen würde.


Gruß
Stephan

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 23:07
von clag
hallo Stephan,

das getDataArray habe ich unbedarft gewählt weil es einfach erschien den Zellbereich zu lesen.

der Zellbereich enthält Daten in der 1.Spalte die durch SVERWEIS() Formeln generiert werden und in der 2.Spalte teile weise manuell eingegebene Daten. die in der Quelltabelle, die per SVERWEIS() ausgegebenen ersetzen sollen.

Nun wollte ich beide Spalten einlesen und vergleichen wenn in der 2.Spalte ein "Ersatzwert" steht sollte dieser in die 1.Spalte des Arrays übernommen werden.
Danach den geänderten Datensatz aus der 1.Spalte in die Quelltabelle schreiben.

Na das geht bestimmt auch besser oder einfacher aber ich bin ja auch noch weit entfernt von "Könner"

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 23:11
von Karolus
clag hat geschrieben:multidimensionales Arrays für wahlfreien Zugriff!?
Nein, direkt über .getCellByPosition(....) oder ..getCellRangeByName(..)

Aber ich lese aus deinem letzten Beitrag, das du eigentlich doch keinen wahlfreien Zugriff möchtest

Re: getDataArray auslesen

Verfasst: Mi, 17.12.2014 23:41
von clag
hallo Karolus,

haha ja jetzt wo ihr mir steckt, das es nicht so einfach geht wie von mir gedacht,
werde ich jetzt wohl gleich beim einlesen die Prüfung vornehmen und die Werte in ein einfaches Array schreiben.