🙏 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. 🤗

VBA anstelle von händischen Makro, Hilfe bitte.

Alles zur Programmierung im LibreOffice.
mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA anstelle von händischen Makro, Hilfe bitte.

Beitrag von mikele » Sa 2. Mai 2020, 17:07

Hallo,
Es sollte so sein als ob er auf die frisch beschriebene Zeile 2 klickt und sagt Zeile oberhalb einfügen.
Anstelle von

Code: Alles auswählen

oRows.insertbyindex(0,1)

Code: Alles auswählen

oRows.insertbyindex(1,1)
Und die Fertigmeldung am Ende bräuchte ich auch nicht, die ist im Ablauf eher störend.
Entferne die Zeile oder kommentiere sie aus.
Gruß,
mikele

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: VBA anstelle von händischen Makro, Hilfe bitte.

Beitrag von craig » Sa 2. Mai 2020, 17:30

Hallo Dave,
Es sollte so sein als ob er auf die frisch beschriebene Zeile 2 klickt und sagt Zeile oberhalb einfügen.
Und die Fertigmeldung am Ende bräuchte ich auch nicht, die ist im Ablauf eher störend.
Ich habe diese Code-Anweisung falsch interpretiert:

Code: Alles auswählen

 oRows.insertbyindex(0,1)
Die Syntax lautet nicht (Zeile, Spalte), sondern:
( [in] long nIndex, [in] long nCount )

Daraus folgt:
Index = Zeile
Count = Anzahl der einzufügenden Zeilen.
Demnach funktioniert diese Änderung:

Code: Alles auswählen

oRows.insertbyindex(1,1)
Hier nochmal der gesamte Code inkl. Änderung:

Code: Alles auswählen

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

Sub Datenliste2
	oDoc = ThisComponent
	oCC = oDoc.CurrentController
		' Hier ggf. die Tabellenblattnamen anpassen
		oSheet1 = oDoc.Sheets.getByName("Tabelle1")
		oSheet2 = oDoc.Sheets.getByName("Tabelle2")
   
REM ------------------------------------------------------------------
REM C4; normales Eingabefeld Inhalt ist eine Zahl (Ziel Tabelle2 A2)
REM C4 --> A2
REM Zahl kopieren
	oSheet2.getCellRangeByName("A2").Value=oSheet1.getCellRangeByName("C4").Value

REM ------------------------------------------------------------------
REM E4; Wenn/Zeit Feld Inhalt zum Übertragen Datum und Zeit (Ziel Tabelle2 C2)
REM E4 --> C2
REM 	Nur Werte (Datum und Uhrzeit) kopieren
	With oSheet2
		.getCellRangeByName("C2").Value = oSheet1.getCellRangeByName("E4").Value

REM Zelle formatieren (Datum und Uhrzeit)
	' 50 = TT.MM.JJ HH:MM
	' 107 = TT.MM.JJJJ HH:MM
		.getCellRangeByName("C2").NumberFormat=50
REM Zell-Hintergrundfarbe
'		.getCellRangeByName("C2").CellBackColor=16777126			' Farbangabe per long
'		.getCellRangeByName("C2").CellBackColor=RGB(255,255,166)	' Farbangabe per RGB(n,n,n)
	End With
	
REM ------------------------------------------------------------------
REM F4; Sverweisfeld, Inhalt den ich brauche ist der Text (Ziel Tabelle2 B2)
REM F4 --> B2
REM Text kopieren
	oSheet2.getCellRangeByName("B2").String=oSheet1.getCellRangeByName("F4").String

REM ------------------------------------------------------------------
REM C7; Sverweisfeld, Inhalt den ich brauche ist der Text (Ziel Tabelle2 D2)
REM Text --> C7 --> D2
REM Text kopieren
	oSheet2.getCellRangeByName("D2").String=oSheet1.getCellRangeByName("C7").String
	
REM ------------------------------------------------------------------
REM I4; Wenn/Zeit Feld Inhalt zum Übertragen Datum und Zeit (Ziel Tabelle2 E2)
REM I4 --> E2
REM 	Nur Werte (Datum und Uhrzeit) kopieren
	With oSheet2
		.getCellRangeByName("E2").Value = oSheet1.getCellRangeByName("I4").Value

REM Zelle formatieren (Datum und Uhrzeit)
	' 50 = TT.MM.JJ HH:MM
	' 107 = TT.MM.JJJJ HH:MM
		.getCellRangeByName("E2").NumberFormat=50

REM Zell-Hintergrundfarbe
'		.getCellRangeByName("E2").CellBackColor=16777126			' Farbangabe per long
'		.getCellRangeByName("E2").CellBackColor=RGB(255,255,166)	' Farbangabe per RGB(n,n,n)
	End With

REM ------------------------------------------------------------------
REM Eine Zeile innerhalb Tabelle2 oberhalb Zeile 2 einfügen

  oRows=oSheet2.getRows
' Zeile einfügen
' Syntax: ' ( [in] long nIndex, [in] long nCount )
' daraus folgt:
' 	(1 	--> oberhalb welcher Zeile soll eingefügt werden
' 	,1) 	--> Anzahl der einzufügenden Zeilen
  oRows.insertbyindex(1,1)

REM ------------------------------------------------------------------
REM Zellinhalte leeren. 
REM 	Betrifft Formeln, Zahlen und Strings, keine Formate.

' Tabelle1 Zellen C4;H5;H8 und A10 leeren
	oZiel = oSheet1.getCellRangeByName("A10")
	oZiel.String=""

	oZiel = oSheet1.getCellRangeByName("C4")
	oZiel.String=""	

	oZiel = oSheet1.getCellRangeByName("H5")
	oZiel.String=""	

	oZiel = oSheet1.getCellRangeByName("H8")
	oZiel.String=""	
	
REM ------------------------------------------------------------------
REM Cursor positionieren
REM Position (2,3) =
REM 2 = Spalte C
REM 3 = Zeile 4
	oCell =  oSheet1.getCellByPosition(2,3)
	oCC.Select(oCell)

REM ------------------------------------------------------------------
REM Programmende
Msgbox "Aktion abgeschlossen!" & CHR(10) & _
			"Das Programm wird beendet", 64, "Programmende"
End Sub
Zu Deiner neuen Anfrage:
Leider bringt mir das nicht viel wenn das Dokument minimiert ist.
Deshalb suche ich noch eine Möglichkeit das Libre bei Ablauf des Countdowns auf sich aufmerksam macht, PopUp oder Blinken in der Taskleiste z.B.
Gibt es da vielleicht eine Möglichkeit?
Die oberste Instanz der Starbasic-Programmierung ist der StarDesktop.
Diese Instanz spiegelt im Grunde alle geöffneten Office-Applikationen, bzw. Dokumente
wieder, welche gerade geöffnet sind. Dazu gehört auch ein geöffnetes BASIC-IDE-Fenster.
Die Dokumente werden hier mit Frames bezeichnet.
Jedes Frame besitzt einen Index, welcher variabel ist.
Variabel in der Hinsicht, als dass es von der Reihenfolge abhängig ist, wie die
einzelnen Dokumente geöffnet wurden.
Zugriff auf ein Frame:

Code: Alles auswählen

Dim oSD as Object
	oSD =Stardesktop
		oFrm2=oSD.getFrames.getByIndex(2)
Damit ist aber noch nicht klar was oFrm2 für eine Fenster/ Dokument ist!
Dieses muss im Anschluss geprüft werden oder man nutzt eine Schleife über alle Frames
und filtert so das gesuchte Frame heraus.
Ein Beispiel:

Code: Alles auswählen

Sub FrameTest
Dim oSD as Object
Dim nCnt as Integer
Dim i as Integer
	oSD =Stardesktop
	
	' Die Count-Eigenschaft nutzen, um die Anzahl aller geöffneten Frames zu ermitteln
	nCnt=oSD.getFrames.count
msgbox "Anzahl Frames = " & nCnt ,64, "Zählen aller geöffneten Frames"
	For i = 0 to nCnt-1
		oSD.getFrames.getByIndex(i)
			msgbox oSD.getFrames.getByIndex(i).Title, 64, "Auslesen der Titel-Eigenschaft der einzelnen Frames"
	Next i
End Sub
So kann die Titel-Eigenschaft dazu genutzt werden, dass gewünschte Dokument zu erfassen und den Fokus darauf zu setzen.
Jetzt kann man über den Stardesktop die Window-Eigenschaften beeinflussen.
z.B.
oSD.getFrames.getByIndex(2).windowNormalized
oSD.getFrames.getByIndex(2).Hidden
usw.

Jetzt benötigt man einen Listener. Dieser Zuhörer/ Überwacher läuft nach Makrostart permanent im Hintergrund und wartet auf das ihm zugewiesene Event (Ereignis). Sobald das Event eintritt, wird der Listener aktiv und führt eine Aktion aus.
Das könnte z.B. dieses Ereignis sein:
oSD.getFrames.getByIndex(2).windowNormalized

Soviel zur Theorie.
Ich persönlich stehe etwas auf dem Kriegsfuss mit diesen Listenern.
Im Prinzip einfach, ABER...
Auch bin ich mir nicht sicher, ob der Listener korrekt funktioniert, wenn das Fenster minimiert ist,
da der Fokus auf dem Betreibssystem oder einem anderen Programm liegt.

Deshalb stelle die Frage nochmals in einem eigenen Thread.
Gruß

Craig

Nie die Sicherungskopie vergessen!

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

Librenoob81
Beiträge: 11
Registriert: Mi 22. Apr 2020, 20:21

Re: VBA anstelle von händischen Makro, Hilfe bitte.

Beitrag von Librenoob81 » Di 5. Mai 2020, 10:29

Hallo Craig,

erstmal vielen vielen Dank du hast mir schon extrem gut geholfen :)

Würde deinen Lösungsansatz dann mal in das neue Thema übernehmen um vielleicht zu einer schnelleren Lösungsfindung beizutragen :)

Mfg Dave


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