BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das OpenOffice Forum zu erhalten!

DANKE >><< DANKE

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des OpenOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als OO-SUPPORTER gekennzeichnet. 🤗

Variablen mit Makros erstellen und mehr

Alles zur Programmierung im OpenOffice.org
Antworten
MarkusDD
Beiträge: 14
Registriert: Di 22. Mär 2022, 08:22

Variablen mit Makros erstellen und mehr

Beitrag von MarkusDD » Do 31. Mär 2022, 22:25

Hallo Leute, ich bin es mal wieder ;)

Habe heute schon den ganzen Tag damit verbracht im Internet nach einer Lösung für mein "neues Problem" zu suchen, bin aber leider noch nicht fündig geworden und frage daher nochmal hier in die Runde :)

Frage Nummer 1
Ich möchte gern einen Text (Name) aus "Tabelle 1" bei "C35:C35" per Makro in die nächste freie Zelle einer Spalte der "Tabelle 2" übertragen, aber nur dann wenn in der der Text (Name) noch nicht in der Spalte vorhanden ist.

Frage Nummer 2
Würde die Möglichkeit bestehen aus dem Text in "Tabelle 1" bei "C35:C35" eine Variable zu erstellen (falls überhaupt nötig) und aus dieser "Variablen" drei untergeordnete Variablen generieren zu lassen?

Als Beispiel:
Text in "Tabelle 1" bei "C35:C35" = Test
Neue Variable 1 = TestWert1
Neue Variable 2 = TestWert2
Neue Variable 3 = TestWert3
(sozusagen Inhalt von "C35:C35" + "Wert1" (Wert1 bis Wert3 sind konstante Begriffe) = neue Variablenname)

Kann man diese Variablen mit Hilfe vom Text aus "C:35:C35" also definieren, damit man eine Zuordnung bekommt?

Sollte dies funktionieren, müssten diese drei neuen Variablen nur noch rechts, neben dem zuvor kopierten Namen, mit dem Wert 0, eingefügt werden.

Als Beispiel:
Eingefügter Wert aus "Tabelle 1" bei "C35:C35" wird in "Tabelle 2" in Spalte D in der nächsten freien Zelle eingetragen (ich nehme einfach mal "D27" als Referenz) Dann würde ich gern in "E27" die Variable "TestWert1", in "F27" die Variable "TestWert2" und in "G27" die Variable "TestWert3" eingefügt bekommen.

P.S.: Ich habe immer "C35:C35" geschrieben da mir der Begriff in einem Makro für eine einzelne Zelle nicht geläufig ist :roll: benutze zur Zeit "getCellRangeByName("C35:C35")" geht bestimmt auch ohne "Range", oder? :D

Ich hoffe meine Frage ist hier richtig gepostet UND verständlich von mir erklärt :lol: Wenn nicht, dann fragt mich gern noch einmal, dann erläutere ich es noch einmal, wo es Schwierigkeiten gibt :)

Vielen Dank schonmal für's Lesen und helfen!

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

Re: Variablen mit Makros erstellen und mehr

Beitrag von craig » Fr 1. Apr 2022, 20:49

Hallo Markus,

eine Beispieldatei wäre für mich sehr hilfreich.

Dir empfehle ich diese Website:
DE/Makro Basic Tutorial
Folgende Links verweisen auf dieselbe Seite:
  1. Konventionen für die Variablen, insbesondere die Präfixe, denn bei Ver-
    wendung von Präfixen wird der Code für Dich und für die Helfer lesbarer.
  2. Ganz besonders empfehle ich Dir das Xray-Tool.
    Dieses dient der Codeinspektion. Es handelt sich dabei um ein Writer-Dokument
    welches Installations-/ Deinstallations Makros enthält und gleichzeitig
    das deutschsprachige Handbuch für Xray ist.
    Hier ein Beispiel wie Xray verwendet wird:

    Code: Alles auswählen

    Sub Main
    Dim oDoc as Object
    	oDoc=ThisComponent
    xray odoc
    End Sub
    
    Bei Ausführung dieses Codes erscheint das Xray-Fenster, welches Dir nun
    alle Eigenschaften, Methoden, usw. zum Objekt "ThisComponent" anzeigt.
    Damit die Ausführung funktioniert, muss nach der Installation von Xray die
    Anleitung auf Seite 7 "Automatisches Laden der Bibliothek XrayTool"
    befolgt werden. Nicht vergessen: Office muss neugestartet werden.

    Folgender Code untersucht die erste Tabelle (oSheet11) im Dokument.
    Wähle im Xray-Fenster oben links die Option "Methoden", dann werden
    Dir die verfügbaren Methoden zu ersten Tabellenblatt angezeigt.
    Rechts neben dieser Listbox setze bitte den Haken bei "A-Z" und "Details"

    Such jetzt in der Liste darunter nach den get-Anweisungen:

    Code: Alles auswählen

    REM  *****  BASIC  *****
    
    Sub Main
    Dim oDoc as Object
    Dim oSheet1 as Object
    Dim oRange1 as Object
    
    	oDoc=ThisComponent
    'xray oDoc
    		oSheet1=oDoc.getSheets.getbyIndex(0)
    xray oSheet1
    			oRange1=oSheet1.getCellRangeByName("A2:B51")
    'xray oRange1
    End Sub
    
Folgende get-Anweisung kannst Du zur Referenzierung von Zellen und Zellbereichen verwenden
Aus dem Xray-Fenster kopiert:
  • getCellByPosition → ( nColumn as long, nRow as long )
    Zelle A1

    Code: Alles auswählen

    	oCell=oSheet1.getCellByPosition(0,0)
  • getCellRangeByName → ( aRange as string )
    Zelle A1
    Lass Dich hier nicht von dem englischen Range verwirren!
    Es wird Dir in Xray ein Zellobjekt angezeigt und nicht etwa ein Zellbereichs-Objekt!

    Code: Alles auswählen

    	oCell=oSheet1.getCellRangeByName ("A1")
    ODER
    Zellbereich A1:C5

    Code: Alles auswählen

    	oRange=oSheet1.getCellRangeByName ("A1:C5")
  • Auch dies referenziert einen Zellbereich, wobei hier die "Koordinaten" in Form eines Index angegeben werden.
    getCellRangeByPosition → ( nLeft as long, nTop as long, nRight as long, nBottom as long )
    Das Präfix „n“ deutet darauf hin, dass es entweder der Datentyp Integer oder Long ist. Xray verweist darauf, das der Index auf jeden Fall als Datentyp „Long“ deklariert sein MUSS. Erkennbar an dem Hinsweis „as Long“.
    Ausserdem ist bei der Angabe mittels Index wichtig zu wissen, dass die Spalten-/Zeilenzählung IMMER bei 0 beginnt und die Xray-Hinweise „Left, Top, Right, Bottom“
    Zellbereich A1:C5 per Index:

    Code: Alles auswählen

    	oRange=oSheet1.getCellRangeByPosition(0,0,2,4)
    Zelle A1 → Left, Top → 0,0
    Zelle C5 → Right, Bottom → 2,4
Eine weitere Besonderheit von Xray:
Du kannst bei einigen Eigenschaften Methodden, etc. ein Doppelklick ausführen,
dann schaltet Xray (falls vorhanden) in die nächst darunteriegende Instanz:

Code: Alles auswählen

xray oDoc
Suche im Xray-Fenster unter den Eigenschaften CurrentController und führe eine Doppelklick aus.
Jetzt werden Dir alle Eigenschaften, Methoden, usw. zum CurrrentController angezeigt.

Woher weiß Xray als dies?
Es ist in der OpenOffice-API dokumentiert...
Oh weia, gut das es Xray gibt... :shock:
Markus hat geschrieben:Frage Nummer 1
  • Wert oder String in eine Variable schreiben:

    Code: Alles auswählen

    Dim nWert as Long
    nWert=oCell.Value
    ODER

    Code: Alles auswählen

    Dim fWert as Double
    fWert=oCell.Value
    ODER

    Code: Alles auswählen

    Dim sWert as String
    sWert=oCell.String
  • Zellbereich von Tabelle2 in ein Array einlesen.
    In ein Array einlesen ist die schnellste Verarbeitungsmethode:
    z.B.

    Code: Alles auswählen

    Dim mArr() as Variant
    	oRange2= oSheet2.getCellRangeByName("A1:A20")
    		' Damit werden alle Daten (Strings und Werte) im Array abgelegt:
    		mArr()=oRange2.getDataArray()
    REM Prüfung mit Xray:
    REM Doppelklick auf die einzelnen Array-Felder!
    xray mArr()
    
    REM --------------------------------------------------------------
    ' Hier muss eine Schleife eingebaut werden, welche das Array durchzählt 
    ' und die Datenfelder auf Inhalt prüft.
    ' Wahrheitsprüfung: 
    ' WENN xWert in Array(y,z)-Feld enthalten; DANN mache NICHTS; 
    ' SONST suche letzte Zelle im Bereich und schreibe xWert in Zelle.
    REM --------------------------------------------------------------	
    
Markus hat geschrieben:Frage Nummer 2
Das habe ich noch nicht richtig verstanden.
Gruß

Craig

Nie die Sicherungskopie vergessen!

═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.8 • LO 7.4.5.1 (x64)

MarkusDD
Beiträge: 14
Registriert: Di 22. Mär 2022, 08:22

Re: Variablen mit Makros erstellen und mehr

Beitrag von MarkusDD » Mi 6. Apr 2022, 10:15

Wow Craig - das ist eine sehr ausführliche Antwort von Dir :) Danke dafür. Wird mir bestimmt in Zukunft nochmal hilfreich sein können, wenn ich weiter so an Tabellen rumbastle ;)

Kurz zur Frage 2 in Kurzform:
Ist es möglich eine Variable durch etwas wie: dim text(C35)+Wert1 zu definieren so das am Ende die neue Variable die definiert wird "TestWert1" heißt, wenn der Text aus C35 in diesem Beispiel "Test" lautet :?

-----------------------------------------------------------------------------------------------------

Jetzt benötige ich noch Makros für die Punkte - diesmal auch mit einer Tabelle für euch zum arbeiten daran ;)
Highscore Beispiel.ods
(18.67 KiB) 252-mal heruntergeladen
Vielleicht geht das mit dem Addieren weiter unten im Text einfacher, dann gern Vorschläge machen - sonst auch gern so wie ich es denke, das es funktionieren könnte - anbieten ;) danke schonmal! :)

Bei Klick auf Schlatfläche > Makro ausführen:

1) Nimm Text aus Zelle D2 (Tabelle: Spieler 1) und prüfe ob der Name des Spielers (D2) in der (Tabelle: Highscores) in C33 bis letzte Zeile C vorkommt.

Wenn nein:
Füge den Text / Namen des Spielers aus D2 (Tabelle: Spieler 1)
in erster leeren Zelle in Spalte C und G und K (Tabelle: Highscores)ein.

UND

----- Rang sortierung - Code kopieren -----
Kopiere die Formel / Zelle aus B33 in die erste, freie Zelle in Spalte B
Kopiere die Formel / Zelle aus F33 in die erste, freie Zelle in Spalte F
Kopiere die Formel / Zelle aus J33 in die erste, freie Zelle in Spalte J

----- Rang Sortierung Hilfsspalte - Code kopieren -----
Kopiere die Formel / Zelle aus P33 in die erste, freie Zelle in Spalte P
Kopiere die Formel / Zelle aus S33 in die erste, freie Zelle in Spalte S
Kopiere die Formel / Zelle aus V33 in die erste, freie Zelle in Spalte V

UND

Füge in der ersten, freien Zelle in D und H und L den Wert 0 ein

Wenn ja:
Mache nichts - keine Eintragungen, etc.

2) Bei Klick auf eine Schaltfläche in (Tabelle: Spieler 1)

Wenn D4:D9 (Tabelle: Spieler 1) und D15:D23 (Tabelle: Spieler 1) eine Zahl enthalten, dann:

Suche den Text / Namen des Spielers aus D2 (Tabelle: Spieler 1) in Spalte C33 bis Ende C (Tabelle: Highscores). Als Beispiel: Name des Spielers in (Tabelle: Highscores) in Zelle C56

Addiere +1 zur Zelle D56 (Tabelle: Highscores)
Addiere Wert aus D31 (Tabelle: Spieler 1) zur Zelle H56 (Tabelle: Highscores)
Addiere Wert aus D31 (Tabelle: Spieler 1) zur Zelle L56 (Tabelle: Highscores) wenn Wert aus D31 größer ist als Wert aus L56

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

Re: Variablen mit Makros erstellen und mehr

Beitrag von craig » Mi 6. Apr 2022, 18:37

Hallo Markus,

ich beantworte ersteinmal diese Frage:
Markus hat geschrieben:Kurz zur Frage 2 in Kurzform:
Ich weiß erhrlich gesagt immernoch nicht genau worauf Du hinaus willst, weil ich als
„Hobby-Programmierer“ die Programmierung aus einem anderen Blickwinkel sehe.

Es gibt verschiedene Methoden Variablen zu deklarieren (Dim-Anweisung) und es gibt Variablen mit unterschiedlichsten Datentypen. Deiner Beschreibung entnehme ich, dass es bei dem Inhalt der Variablen um Texte (Strings) geht. Dann würde ich die Variable z.B. so deklarieren:

Code: Alles auswählen

Sub Main1
Dim sText as String

sText = "Mein Haus 1"
	print sText
End Sub
Die 1 in "Mein Haus 1" ist aber keine Zahl(!), sondern eine Ziffer, darausfolgt, dass die 1 z.B. nicht für eine Addition verwendet werden kann. Man muss diese 1 erst von eine Ziffer in eine Zahl wandeln, dazu muss die aber erst vom Text mittel Makro-Text-Runtimefunktionen extrahiert werden. Hier ein einfaches Beispiel:

Code: Alles auswählen

Sub Main2
Dim sText as String
Dim nZahl as Long

sText = "Mein Haus 1"
	
	' a) Lese das ERSTE Zeichen von RECHTS
	' b) wandele das Zeichen in den Datentyp INTEGER (cInt)
	nZahl=Int(Right(sText,1))
	' Jetzt beinhaltet die Variable eine ZAHL
	nZahl = nZahl +199
	print nZahl
End Sub
Dieses Beispiel zeigt wie Du eine bestehende Variable mit weiterem Inhalt füttern kannst.
Es gilt dabei aber zu beachten, dass es Limitationen gibt. D.h. Du kannst eine String-Variablen nicht unendlich viel Text zuweisen. Früher waren es mal max. 256 Zeichen inklusiver Leerzeichen, usw.
Wo die heutige Limitation endet weiß ich nicht.
Beispiel:

Code: Alles auswählen

Sub Main3
Dim sText as String

sText = "Mein Haus 1"
	sText =sText & " --- " & "Meine Straße"
	sText =sText & " --- " & "Mein Auto"
	print sText
End Sub
Bei Fließkommazahlen werden maximal 15-Stellen nach dem Komma berechnet. Ist die Variable als „as DOUBLE“ deklariert, dann wird die 15. Stelle auf- oder abgerundet. Double heißt doppelte Genauigkeit beim Runden in Abhängigkeit von der 16. und weiteren Stellen nach dem Komma.


Und jetzt wird es ein wenig tricky:

Code: Alles auswählen

Sub Main4
Dim mText(2) as Variant

mText(0) = "Mein Haus 1"
mText(1)="Meine Straße"
mText(2)="Mein Auto"

	print mText(0)
	print mText(0) & " --- " & mText(2) &  " --- " & mText(2)
End Sub
Die Variable "mText()" ist keine gewöhliche Variable, sondern ein eindimensionales Array, welches 3 Felder beinhaltet. Die Zählung der Felder beginnt bei 0.
Diese Array besitzt 3 Felder:
Zählung = 0 – 2 = 0, 1, 2
Erstes Feld:

Code: Alles auswählen

mText(0) = "Mein Haus 1"
Zweites Feld:

Code: Alles auswählen

mText(1) = "Meine Straße"
Drittes Feld:

Code: Alles auswählen

mText(2) = "Mein Auto"
In der Print Anweisung erkennst Du die einzelnen Aufrufe.

Das ist aber noch nicht alles.
Statt eines einfachen eindimensionalen Arrays, gibt es auch mehrdimensionale Arrays.
Man kann z.B. einen kompletten Zellbereich in einem Rutsch in ein Array einlesen
Das Array ist als Variant deklariert, somit entscheidet der Basic-Interpreter bei Aufruf des
Makros selbst, welchem Feld welcher Datentyp (String, Long, Double, usw.) zu zuweisen ist.
Sehe Dir mal diese Datei an:
Daten aus Tabelle in Ausdruck übertragen (calc)

Wenn Du die Datei öffnest, könnte es sein, dass Du bei OpenOffice einen Meldung erhälst, dass Du Updaten musst. Diese Meldung kannst Du ignorieren. Liegt nur daran, weil ich die Datei mit LibreOffice gespeichert habe.
Im dritten und vierten Tabellenbllatt bin ich kurz auf das Thema „Arrays“ eingegangen. Im Code erkennst Du die Arbeitsweise der Arrays. Und wie man diese mit Daten aus einem Zellbereich befüllt.

Nun ich könnte hier ein kleines Buch zur Verwendung von Arrays schreiben, deshalb kann ich Dir nur anraten Dich selbst mit meiner Starthilfe zu befassen und Dich im Netz weiter zu informieren.

Mit Deinen weiteren Wünschen werden ich mich auch befassen, und ja ich werde auch dort mit Arrays arbeiten, weil die Abarbeitung des Codes wesentlich schneller ist, als wenn man einzelne Zellen der Tabelle mittels Code durchklickert. D.h. die Abarbeitung und Vergleiche der Arrayinhalte geschieht ausnahmslos im Arbeitsspeicher.

Ausser den "gewöhnlichen" Variabeln und den Arrays gibt es noch sogenannte
Type-Anweisungen, aber da möchte ich hier nicht näher drauf eingehen.
https://help.libreoffice.org/latest/de/ ... 90413.html

Weiteres später, wird aber noch eine kleine Weile dauern.
Gruß

Craig

Nie die Sicherungskopie vergessen!

═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.8 • LO 7.4.5.1 (x64)

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

Re: Variablen mit Makros erstellen und mehr

Beitrag von craig » Do 7. Apr 2022, 16:50

Hallo Markus,

kurze Nachfrage:

Hast Du in Deiner Originaldatei für jeden Spieler ein separates Tabellenblatt angelegt?
Gruß

Craig

Nie die Sicherungskopie vergessen!

═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.8 • LO 7.4.5.1 (x64)

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

Re: Variablen mit Makros erstellen und mehr

Beitrag von craig » Fr 8. Apr 2022, 19:30

Hallo Markus,

kurze Nachfrage:

Hast Du in Deiner Originaldatei für jeden Spieler ein separates Tabellenblatt angelegt?

Speichere von Deiner Originaldatei unbedingt eine Sicherungskopie!

Das Makro in meinem Beispiel bitte vorerst nur in der Beispieldatei anwenden :!:
Hier ein erstes Beispiel:
Highscore Beispiel v2_1.ods
(27.41 KiB) 253-mal heruntergeladen
Makro-Ablauf in Kurzform:
  1. Inhalte aus Tabelle "HIghscores" Spalte C,G und K werden in Arrays eingelesen.
  2. Es folgt der Namenvergleich, also ist Name in Highscore-Liste vorhanden?
    • WENN JA, DANN keine Aktion
    • WENN NEIN, DANN:
      • Nächst freie Zelle in Spalte C ermitteln
      • Nächst freie Zelle in Spalte G ermitteln
      • Nächst freie Zelle in Spalte K ermitteln
    • Schreibe nicht vorhandenen Namen in die Highscore-Liste.
Prüfe das Makro, in dem Du in die Tabelllen "Spieler 33" und "Spieler 1"
neue Namen einsetzt und jeweils das Makro startest.

Habe auf Tabelle "HIghscores" eine Button zum Makrostart hinterlegt.
Gruß

Craig

Nie die Sicherungskopie vergessen!

═══════════════════════════════════════
WIN 10 Pro 64-Bit • AOO 4.1.8 • LO 7.4.5.1 (x64)

Antworten