Variable nicht definiert

Alles zur Programmierung im OpenOffice.org
Ulko38
Beiträge: 13
Registriert: Do 26. Nov 2015, 09:03

Variable nicht definiert

Beitrag von Ulko38 » Fr 2. Dez 2016, 09:50

Hi,

vor Jahren viel mit VBA in Exel gearbeitet.
Jetzt bleibe ich schon im Ansatz hängen UND sehe den Fehler nicht.
__________________
sub AnzahlZeilen
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object

dim oDoc,oSheet, oRange, oCell, oCursor as object
Dim iErsteZ As Integer
Dim iLetzteZ As Long
Dim iLfdZ As Long
Dim i as integer
Dim nRow as Long
Dim nEndCulumn

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper"


oDoc = thisComponent
oSheets=oDoc.Sheets(i) <--- Variable nicht definiert
_______________
Danke für die Hilfe
ulko

Benutzeravatar
craig
Beiträge: 112
Registriert: Sa 14. Mai 2016, 12:36

Re: Variable nicht definiert

Beitrag von craig » Fr 2. Dez 2016, 11:42

Hallo,

Code: Alles auswählen

oDoc =thiscomponent
	oSheet =oDoc.Sheets().getByindex(i)
Gruß

Craig
Gruß

Craig
═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.3 • LO 5.2.4.2

Ulko38
Beiträge: 13
Registriert: Do 26. Nov 2015, 09:03

Re: Variable nicht definiert

Beitrag von Ulko38 » Di 6. Dez 2016, 12:38

Danke Craik
Ich habe aber noch andere Fragen.
Bis Später

ulko

Ulko38
Beiträge: 13
Registriert: Do 26. Nov 2015, 09:03

Re: Variable nicht definiert

Beitrag von Ulko38 » Di 6. Dez 2016, 13:18

Hi Craig

Mußte erst nachsehen welchen Dispatcher mir vorgeschlagen wurde.
Da ich versuche meine Aufgabe im vorhinein mit dem "Aufzeichnen" auszuprobieren bekomme ich nur diesen Dispatcher :
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper"
2. Meine Frage ist nun: Reicht der um eine Calc-Tabelle zu bearbeiten
3. Die Aufgabe: Erhöhe den Wert der oberen Zelle um 8 wird mit einem Arai.
Ich habe bisher nur Schleifen benutzt. Die brauche ich hier auch, da ich mit einer If abfrage überwachen muss, ob das Ergebnis >59 (Sekunde) ist. Wenn ja: minus 60 und 1 (Minute) in nebenstehender Zelle adieren.
Mit meinen früheren Exeltab. (vor 6 J. ging das).

Hoffe habe mein Problem einigermaßen beschrieben.
Grüße ulko
PS.: Wo findet man Praxisbeispiele für Oo-Calc

Benutzeravatar
craig
Beiträge: 112
Registriert: Sa 14. Mai 2016, 12:36

Re: Variable nicht definiert

Beitrag von craig » Di 6. Dez 2016, 14:53

Hallo ulko,
ulko hat geschrieben:2. Meine Frage ist nun: Reicht der um eine Calc-Tabelle zu bearbeiten
Ein klares und eindeutiges NEIN.

Der Makrorekorder zeichnet ausschließlich Dispatch Commands auf.
Dies sind im wesentlichen nur die Maus- und Tastaturbefehle welche Du nacheinander eingibst.
https://wiki.documentfoundation.org/Dev ... chCommands
Damit stößt man sehr schnell an die Grenzen des Machbaren.

Wenn Du Dich mit der Thematik des Programmierens auseinandersetzen möchtest kann
ich Dir folgende Seiten und Dokus zur Basic-Programmierung empfehlen.
https://www.uni-due.de/~abi070/count.ph ... eutsch.pdf
http://www.starbasicfaq.de/index.html
Libreoffice Handbücher.
Ganz unten auf der Seite befindet sich auch ein Handbuch zur Makro-Programmierung.
https://de.libreoffice.org/get-help/documentation/

Objektinspektor:
http://www.openoffice-forum.de/viewtopi ... 3&start=10
MRI ist ein unverzichtbares Tool. Damit kann man den Quellcode in
alle Richtungen und Ebenen untersuchen.

So sieht mein Anfangscode für gewöhnlich aus:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub xBasics
Dim oDoc as Object
Dim oCC As Object
Dim oSheet as Object
Dim oRange as Object
Dim oSel as Object
Dim mArray as Variant

REM MRI laden
REM Kann man auch beim Start von LO gleich mit laden,
REM dann entfällt diese Zeile. Siehe dazu die MRI Doku
	Globalscope.BasicLibraries.LoadLibrary ( "MRILib")
	' aktuelles Dokument
	oDoc =thiscomponent
		' Current Controller
		oCC=oDoc.getCurrentcontroller()
		
			' Welches Sheet soll angesprochen werden
			oSheet =oDoc.Sheets().getByindex(0)
			
				' aktuelle Markierung in der Tabelle
				oSel=oDoc.CurrentSelection
				
				' ODER per Range (Zelle A1 = 0,0)
				oRange=oSheet.getCellByPosition(0,0,3,5)	
'mri odoc
'mri oCC
'mri oSel
'msgbox "Test Text", 64, "Meine Message"
End Sub
Letzte Zelle ermitteln:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub letzteZelleInBereich
Dim odoc as Object
Dim oSheet as Object
Dim oCellRange as Object
Dim oEmptyCells as Object
Dim oFirstEmptyCell as Object
Dim sColumn as String
Dim aCelladdress 

    odoc = thiscomponent
    oSheet = oDoc.Sheets(0)
    oCellRange = oSheet.getCellRangeByName("A2:A10")
    oEmptyCells = oCellRange.queryEmptyCells

    oFirstEmptyCell = oEmptyCells(0).getCellByPosition(0,0)
    sColumn = oFirstEmptyCell.Columns(0).Name

    aCelladdress = oFirstEmptyCell.Celladdress
    msgbox ("Ergebnis:" & CHR$(10) & "Spalte " & oFirstEmptyCell.Columns(0).Name & " (Nr. " &aCelladdress.Column + 1 &")" & CHR$(10) & "Zeile " & aCelladdress.Row + 1,64,"Erste leere Zelle")
End Sub
Wenn Du noch Fragen hast, kein Problem :D

Gruß

Craig
Gruß

Craig
═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.3 • LO 5.2.4.2

Ulko38
Beiträge: 13
Registriert: Do 26. Nov 2015, 09:03

Re: Variable nicht definiert

Beitrag von Ulko38 » Di 6. Dez 2016, 18:28

Hi Craig
Danke für deine schnelle Antwort.

Zwischenzeitlich habe ich weiter gesucht und probiert.

Diese Schleife wird zwar durchlaufen, bringt aber kein sichtbares Ergebnis.
________________
do until x = 15
for y = 3 to 15
Rem oZelle = oTabBlatt.GetCellbyPosition(x, i)
oZelle = oTabBlatt.getCellRangeByName("$H$"+x)
Rem Beide Zeilen schon versucht

oZelle.Value = "=$H$+nZe" + nSek
x = x +1
nZe = nZe +1
next y
loop
____________________________

weder das aktive Feld wird verändert, noch irgendwohin etwas eingefügt.
Eigendlich sollte in Spalt H 15 zeilen durchlaufen werden und die Zelleninhalte jeweils um 8 erhöht werden.
______________________
Irgend wie bin ich blind und habe die Umstellung noch nicht geschnallt.
Grüße ulko

Benutzeravatar
craig
Beiträge: 112
Registriert: Sa 14. Mai 2016, 12:36

Re: Variable nicht definiert

Beitrag von craig » Di 6. Dez 2016, 21:11

Hallo ulko,
ulko hat geschrieben:Irgend wie bin ich blind und habe die Umstellung noch nicht geschnallt.
Das kenne ich nur zu gut :lol:

WIRKLICH wichtig ist es bei AOO- und LO-Basic mit dem MRI-Tool zu arbeiten.
Zugegeben auch ich hatte und habe meine Schwierigkeiten, weil ich zuvor in
Assembler, C, Visual Basic und VBA gearbeitet habe.

Schmeiß einfach vieles über Bord und befasse Dich mit der besonderen Struktur
dieser Basic Variante. MRI ist hier sehr, sehr hilfreich :!:

Lade Dir MRI herunter und installiere die Extension.
Dann am besten wie folgt.
  1. Öffne die Basic-IDE
  2. Suche in der ComboBox links oben diesen Eintrag: [Meine Makros & Dialoge].Standard
  3. Erstelle dort ein neues Modul und schreibe nachfolgenden Code hinein:

    Code: Alles auswählen

    REM  *****  BASIC  *****
    REM Bibliotheken laden
    Sub LoadingLibraries
    	Globalscope.BasicLibraries.LoadLibrary ( "MRILib")
    End Sub
  4. In der IDE gehst Du auf Menü Extras --> Anpassen... Register Ereignisse
  5. Markiere auf Programmstart und wähle rechts unterhalb von Zuweisen Makro...
  6. Es öffnet sich der Makroselektor
  7. Öffne Im Fenster Bibliothek, mittels des + den Ordner Meine Makros
  8. Suche nun nach dem Eintrag Standard und öffne diesen Ordner ebenfalls.
  9. Suche nun in der Liste den Eintrag Modul1, oder wie auch immer Du Dein Modul benannt hast..
  10. Im rechten Fenster sollte nun LoadingLibraries markiert sein.
  11. Klicke auf OK
  12. Starte OpenOffice neu, damit wird MRI standardmäßig bei Programmstart mitgeladen.
Dies bedeutet Du kannst MRI in Deinem Code unmittelbar zur Inspection verwenden.
Wie?
Siehe in meinem nächsten Codeabschnitt, die auskommentierten
Zeilen wo MRI nach dem Hochkomma steht.
Also Hochkomma entfernen, Code starten, Es öffnet sich das MRI-Fenster.
Bei vielen der Einträge unter Properties und Methods, kannst Du per Doppelklick
auf einen Eintrag entweder ein Ebene weiterschalten oder Du erhälst ein Ergebnis.
In einigen Fällen erwartet MRI eine EIngabe von Parameten.
Beispiel:
MRI oDoc.Sheets()
Du kannst nun unter Methods getByIndex() doppelanklicken.
MRI öffnet einen Dialog und erwartet die Eingabe eines Indexes.
Tipps Du 0 ein, dann schaltet MRI auf das erste Tabellenblatt.
Schau Dir die Werte unter Properties an.
Dort steht der Tabellenblattname als String.
Klicke auf DataArray in den Properties, dann werden Dir Zellinhalte von Blatt1 angezeigt und so weiter.
Kannst auch auf getDataArray unter Methods aufrufen

MRI ist für unverzichtbar :!:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
Dim oDoc as Object
Dim oTabBlatt as Object
Dim oRange as Object

Dim mArray as Variant
Dim lb as Integer, ub as Integer, i as Integer
		
		' akteuelles Dokument
		oDoc =thiscomponent
			' Blatt 0
			oTabBlatt =oDoc.Sheets().getByindex(0)
				
			' Range
			 oRange=oTabBlatt.getCellRangeByName("H1:H15")
				' Daten aus Range in Array
				mArray= oRange.getDataArray()
'mri odoc
'mri oTabBlatt
'mri oCC
'mri oSel
'mri mArray

' Array Untergrenze
lb= lBound(mArray())

' Array Obergrenze
ub= uBound(mArray())		
		
		' Zählen von Untergrenze bis Obergrenze
		for i = lb to ub
			' Array mit neuen Daten befüllen
			mArray(i)(0)=mArray(i)(0)+8
		next i

	'Arrayinhalt in Range schreiben
	oRange.DataArray =mArray
'mri oRange
'mri mArray
End Sub
Denke in Objekten. Objekte brauchen zeitweise andere Services, Strukturen und
Interfaces die extra geladen werden müssen, sonst hat man auf gewisse
Eigenschaften und Methoden keinen Zugriff.
Welche sind das?
Da muss ich selbst noch oft genug suchen; im Netz und in der API.

Gruß

Craig
Gruß

Craig
═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.3 • LO 5.2.4.2

Ulko38
Beiträge: 13
Registriert: Do 26. Nov 2015, 09:03

Re: Variable nicht definiert

Beitrag von Ulko38 » Di 6. Dez 2016, 21:45

Hi raig
Was bist du schnell.

Ich hab mich gerade noch einmal hingesetzt.
Und dann hab ich zumindest ein Problem geschafft.
danke für deine Hilfe. Daich Quereinsteiger bin fällt mir das Studium der aufgelisteten Info-Adressen nicht so leicht.
Aber ich werde mich daran machen.
Um die TIME-Zeiten in gpx-Dateien zu ändern oder anzupassen brauche ich 2-ziffrige Zahlen die dann ohne ":" Doppelpunkt zusammen gesetzt werden müssen. Das ist der Grund, warum ich als Opa (78) nochmal anfange meine Kenntnisse in calc-Basic aufzufrischen.

Nun hier noch meine bisherige Lösung
____________________________________


nStun = 0
nMinu = 0
nSek = 8
nAr = 0
nZe = 2
x = 2
y = 3
nZellW = 0
' for nLetsteZ = 1 To ActiveSheet.UsedRange.Rows.Count
do until x = 10
for y = 3 to 10
' oZelle = oTabBlatt.GetCellbyPosition(x, i)
oZelle = oTabBlatt.getCellByPosition(6,x)
nZellW = oZelle.Value
if nZellW +nSek > 59 Then
oZelle = oTabBlatt.getCellByPosition(5,x)
nZellW = nZellW - 60
nMinu = nMinu +1
if nMinu = 60 Then
oZelle = oTabBlatt.getCellByPosition(4,x)
oZelle.Value = nStun
nMinu = 0
nStun = nStun +1
Endif
oZelle = oTabBlatt.getCellByPosition(5,x)
oZelle.Value = nMinu
endif
x = x +1
' msgbox nZellW
oZelle = oTabBlatt.getCellByPosition(6,x)
oZelle.Value = nZellW + nSek
msgbox nZellW


nZellW = 0
x = x +1
nZe = nZe +1
next y
loop
______________________________________________
Danke für die Hilfe
Bei weiteren Fragen werde ich mich wieder melden.

Grüße ulko

Benutzeravatar
craig
Beiträge: 112
Registriert: Sa 14. Mai 2016, 12:36

Re: Variable nicht definiert

Beitrag von craig » Di 6. Dez 2016, 22:44

Hallo ulko,
ulko hat geschrieben:
Das ist der Grund, warum ich als Opa (78) nochmal anfange meine Kenntnisse in calc-Basic aufzufrischen.
Schön das ich Dir als junger Spund von 57 Jahren, etwas beibringen kann :lol:
ulko hat geschrieben:
Um die TIME-Zeiten in gpx-Dateien zu ändern oder anzupassen brauche ich 2-ziffrige Zahlen die dann ohne ":" Doppelpunkt zusammen gesetzt werden müssen.
Mit GPS-Daten kenne ich mich nicht aus, aber mit Datenverarbeitung.
Ich nehme an, dass in jeder Zelle eine komplette Zahl steht.
In etwa so?
2011-01-16T23:59:01Z

Frage: Wie soll das Ergebnis aussehen?

Arbeite mit Array‘s. Ist schneller in der Verarbeitung und bietet auch andere Vorteile.
z.B. Daten-/ Text-Manipulation im Turbomodus
Mit Deinem Code beschreibst Du jede Zelle einzeln. Mittels Array wird erst berechnet und dann werden die Daten in einem Rutsch in das Blatt geschrieben.

Wenn Du mal eine Beispieldatei hochlädst, dann kann ich Dir das Prinzip zeigen.

Gruß

Craig
Gruß

Craig
═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.3 • LO 5.2.4.2

Ulko38
Beiträge: 13
Registriert: Do 26. Nov 2015, 09:03

Re: Variable nicht definiert

Beitrag von Ulko38 » Mi 7. Dez 2016, 14:07

Hi Craig
Ok Gerne hänge ich hier eine Datei an. .
Testdatei.ods
(12.68 KiB) 51-mal heruntergeladen
Leider kann eine *.gmx im nachhinein nicht verändert werden. Allso habe ich diese in *.csv umgewandelt. Aus "hh:mm:ss"
wird dabei leider "hhmmss" als zusammengesetzte hexagesimalzahl. Aus 59 +01 wird 0100.
Die Spalten E - H habe ich eingefügt um TIME mit der Funktion RECTS(), bzw LINKS() aufzuspalten.
Die Zeitlüccken fangen aus welchen Gründen auch immer irgendwo an und sind unterschiedlich groß.
Da ich zum Glück Zwischenzeiten (von (Tour)-Foto's) möchte ich die Lücken scließen.
Die Variablen müssen entsprechend (hier Zeile 30)angepasst werden.

Die Idee mit Array zu arbeiten werde ich anpacken. Vor Jahren habe ich mit der Programierung aufgehört, weil es kaum
noch deutschsprachige Erlklärungen gab. Englisch habe ich leider niicht gelernt
Grüße ulko

Antworten