🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] getDataArray im Macro, Fragen zu Indizes

Alles zur Programmierung im LibreOffice.
Antworten
Fischreiher
Beiträge: 17
Registriert: Mi 24. Feb 2016, 15:48

[gelöst] getDataArray im Macro, Fragen zu Indizes

Beitrag von Fischreiher » Mi 24. Feb 2016, 16:01

Ich möchte den Inhalt eines Tabellenblatts in ein Array holen, um schneller auf einzelne Zellen zugreifen zu können.

Unten steht der vereinfachte Code, der lediglich den String "A7" im Feld A7 voraussetzt, diesen auf verschiedene Weisen ausgibt und danach sucht.

Verwendet wird
aSheetA1 = oSheetA1.getCellRangeByPosition(0,0,60,999).getDataArray

Dabei ist mir aufgefallen:
1. Die Index-Syntax aSheetA1(6)(0) wird in Sub myPrint verstanden, in Main nicht (Syntaxfehler: Dimensionsangaben passen nicht zueinander)
2. Die Index-Syntax aSheetA1(6,0) wird in Main und myPrint verstanden, in Function MyMatchInCol führt sie zu einem Laufzeitfehler, Objektvariable nicht belegt
3. Die ungewöhnliche Syntax aSheetA1(6,dummy)(0) wird an allen drei Stellen verstanden und liefert korrekte Ergebnisse.

Kann mir das freundlicherweise jemand erklären?

Für einen zusätzlichen Tipp, wie man das Array auf die Größe des benutzten Tabellenbereichs begrenzen kann, wäre ich auch dankbar.

Code: Alles auswählen

Global Const dummy = 0
'arrays holding sheets
Global aSheetA1(0 to 60, 0 to 999) As String

Sub Main
'sheets
oSheetA1 = thisComponent.getSheets.getByName( "Tabelle1" )
'get sheets into arrays
aSheetA1 = oSheetA1.getCellRangeByPosition(0,0,60,999).getDataArray

'access field A7
print "Main 1",aSheetA1(6,dummy)(0) 'ok, but why?
'print "Main 2",aSheetA1(6)(0)      'Syntaxfehler: Dimensionsangaben passen nicht zueinander
print "Main 3",aSheetA1(6,0)        'ok here

myPrint(aSheetA1)

print "Wert A7 in Spalte A gefunden in Zeile",MyMatchInCol(aSheetA1,0,"A7")+1

End Sub

Sub myPrint (aSheet)
	print "myPrint 1",aSheet(6,dummy)(0) 'ok, but why?
	print "myPrint 2",aSheet(6)(0)       'ok here
	print "myPrint 3",aSheet(6,0)        'ok here
End Sub

Function MyMatchInCol(aSheet,iCol,sValue)
	found = 0
	ret   = 0
	for row = 0 To 999
		if aSheet(row)(iCol) = sValue then       'ok
		'if aSheet(row,iCol) = sValue then	      'Laufzeitfehler,Objektvariable nicht belegt
		'if aSheet(row,dummy)(iCol) = sValue then  'ok, but why?
			found = 1
			ret   = row
		 	exit for
		end if
	next row
	if found = 0 then
		print sValue,"not found in column",iCol
	end if
	MyMatchInCol = ret
End Function
Zuletzt geändert von Fischreiher am So 6. Mär 2016, 10:14, insgesamt 1-mal geändert.

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: getDataArray im Macro, Fragen zu Indizes

Beitrag von karolus » Mi 24. Feb 2016, 17:09

Hallo

Vergiss erstmal dieses hier:

Code: Alles auswählen

aSheetA1(0 to 60, 0 to 999) As String
damit erzeugst du ein 2-dimensionales Array das ist etwas anderes als das verschachtelte Array von Array's das über die Methode ...getDataArray eines Zellbereiches zurückgeliefert wird.
Vergiss bei der Gelegenheit auch gleich Global und reiche deine Objekte stattdessen als Argument durch.

Für einen zusätzlichen Tipp, wie man das Array auf die Größe des benutzten Tabellenbereichs begrenzen kann, wäre ich auch dankbar.

Code: Alles auswählen

doc = thisComponent
sheet = doc.Sheets.getByName("Tabelle1")
cursor = sheet.createCursor()
used_area = cursor.gotoEndOfUsedArea(True)
Extratipp:
hole dir MRI und arbeite damit.


___
Liebe Leute:
Achtet doch mal darauf euren Kram vernünftig zu kommentieren, und benutzt semantisch brauchbare Namen, z.B.

Code: Alles auswählen

Sub Main
'sheets '#Was soll der Plural, es handelt sich um eine Tabelle
oSheetA1 = thisComponent.getSheets.getByName( "Tabelle1" ) #'blöder Name wieso nicht einfach `sheet`
'get sheets into arrays
aSheetA1 = oSheetA1.getCellRangeByPosition(0,0,60,999).getDataArray 
'# noch blöder incl. Verwechsulunggefahr, wieso nicht einfach `data`
Kurz gesagt, ich würde das so schreiben:

Code: Alles auswählen

Sub main
    doc = thisComponent
    sheet = doc.Sheets.getByName("Tabelle1")
    cellrange = sheet.getCellRangeByPosition(0, 0, 60, 999)
    data = cellrange.DataArray    
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Fischreiher
Beiträge: 17
Registriert: Mi 24. Feb 2016, 15:48

Re: getDataArray im Macro, Fragen zu Indizes

Beitrag von Fischreiher » Mi 24. Feb 2016, 19:42

Vielen Dank für Deine ausführliche und treffende Antwort. Nachdem ich die falsche Definition von aSheetA1 entfernt habe und immer mit aSheetA1(6)(0) zugreife, klappt es einwandfrei.

Meine differenzierenden Namen und der Plural im Kommentar "sheets" rühren überigens daher, dass mein Gesamt-Code im Gegensatz zum hier veröffentlichten reduzierten Ausschnitt mehrere Sheets verwaltet.

Kannst Du mir noch einen Tipp geben, wie ich aus Deiner "used_area" eine Range in dem Format mache, dass sie für die Verwendung in

Code: Alles auswählen

aSheetA1 = oSheetA1.getCellRangeByPosition(0,0,60,999).getDataArray
geeignet ist? Dazu habe ich nichts geeignetes finden können.

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: getDataArray im Macro, Fragen zu Indizes

Beitrag von karolus » Mi 24. Feb 2016, 20:18

Hallo

Das ist bereits der Zellbereich der benutzt wird, auf dem gibtst dann logischerweise auch wieder die Methode .getDataArray:

Code: Alles auswählen

used_data = used_area.getDataArray()
(auch diese Frage nebst vielen anderen könnte dir MRI beantworten wenn du es denn mal installieren und benutzen würdest)
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Fischreiher
Beiträge: 17
Registriert: Mi 24. Feb 2016, 15:48

Re: getDataArray im Macro, Fragen zu Indizes

Beitrag von Fischreiher » Do 25. Feb 2016, 19:07

Leider liefert

Code: Alles auswählen

Sub Main
	doc = thisComponent
	sheet = doc.Sheets.getByName("Tabelle1")
	cursor = sheet.createCursor()
	used_area = cursor.gotoEndOfUsedArea(True)
	used_data = used_area.getDataArray()
End Sub
einen Laufzeitfehler: Objektvariable nicht belegt.

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: getDataArray im Macro, Fragen zu Indizes

Beitrag von karolus » Do 25. Feb 2016, 20:32

Hallo

Entschuldige bitte - dummer Fehler meinerseits - so gehts richtig:

Code: Alles auswählen

Sub main
   doc = thisComponent
   sheet = doc.Sheets.getByName("Tabelle1")
   cursor = sheet.createCursor()
   cursor.gotoEndOfUsedArea(True) '#die Methode ändert das `cursor`-object gibt aber nichts zurück'
   used_area = cursor
   used_data = used_area.getDataArray()
End Sub
Das kommt davon wenn man sowas einfach aus dem Kopf hinschreibt
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Fischreiher
Beiträge: 17
Registriert: Mi 24. Feb 2016, 15:48

Re: getDataArray im Macro, Fragen zu Indizes

Beitrag von Fischreiher » Fr 26. Feb 2016, 09:20

Perfekt, vielen Dank nochmal.


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten