Seite 1 von 1

CALC: auf ausgewählte Zeilen anwenden

Verfasst: Mo, 15.05.2017 12:31
von bitEx33
Hallo,

derzeit versuche ich ein Makro, das ich gerade eben erstellt habe, auf mehrere Zeilen, die ich auswähle, in meinem Calc-Dokument zu formatieren. Könnt ihr mir dabei womöglich helfen? Wenn ich das Makro ausführe, dann wird die Formatierung ausschließlich in der Zeile gemacht, in der ich die Aufzeichnung des Makros genutzt hatte. Allerdings soll das Makro auf die Zeilen angewendet werden, die ich auswähle.

Zusätzliche Frage: Edit: Bei meiner Formatierung erscheint als Beispiel dieses Fenster mit der Meldung:

"Soll der Inhalt der verdeckten Zellen in die erste Zelle verschoben werden?"

Kann man dieses Fenster in das Makro aufzeichnen, dass es nicht immer wieder auftaucht und die bestimmten Zellen richtig verbindet?

Vielen Dank vorab für Rückmeldungen und hilfreiche Antworten.


Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst

Re: Makro auf ausgewählte Zeilen anwenden

Verfasst: Mo, 15.05.2017 13:03
von Stephan
Wenn ich das Makro ausführe, dann wird die Formatierung ausschließlich in der Zeile gemacht, in der ich die Aufzeichnung des Makros genutzt hatte. Allerdings soll das Makro auf die Zeilen angewendet werden, die ich auswähle.
Dann hast Du das Makro faslsch aufgezeichnet, nämlich erst die Makroaufzeichnung gestartet und dann die Zellen marrkiert, statt erst die Zellen zu markieren und danach erst die Makroaufzeichnung zu starten.
Zusätzliche Frage: Edit: Bei meiner Formatierung erscheint als Beispiel dieses Fenster mit der Meldung:

"Soll der Inhalt der verdeckten Zellen in die erste Zelle verschoben werden?"

Kann man dieses Fenster in das Makro aufzeichnen, dass es nicht immer wieder auftaucht und die bestimmten Zellen richtig verbindet?
Nein, das kann man augenscheinlich nicht aufzeichnen, das der Dialog nicht mehr erscheint. Man muss es selbst programmieren, z.B.:
http://www.dannenhoefer.de/faqstarbasic ... inden.html

z.B. kann so die aktuelle (zusammenhängende) Zellauswahl verbunden/getrennt werden:

Code: Alles auswählen

  oBereich = ThisComponent.getCurrentSelection
  If oBereich.getIsMerged() then
    oBereich.merge( false )
   Else
    oBereich.merge( true )
  End If
Gruß
Stephan

Re: Makro auf ausgewählte Zeilen anwenden

Verfasst: Mo, 15.05.2017 14:21
von bitEx33
Damit du mich nicht falsch verstehst, erkläre ich es nochmal etwas anders. Als Beispiel habe ich ein Calc-Dokument, das gewisse Daten enthält wie z. B. Projekt, Person, Datum und Zeiten. Diese sind jeweils in den Spalten A(Projekt) verbinden -->> Spalte B, Spalte C(Person),Spalte D <<-- verbinden Spalte E(Datum) und Spalte F(Zeiten) aufgeteilt. Damit ich die Formatierung, die ich brauche für die unterschiedlichen Punkte, die ich genannt habe, habe ich eine Makroaufzeichnung gestartet und z. B. bei der Zeile 17 die Formatierung korrekt erstellt. Jetzt ist es aber so, dass das Makro beim Ausführen entsprechend auch nur die Zeile 17 formatiert. Mein Ziel ist es aber meinen Auswahlbereich per Makro zu formatieren. Z. B. wähle ich die Zeile 30 mit Spalte F bis Zeile 43 auch in Spalte F aus und möchte das Makro auf diesen Auswahlbereich anwenden. Ich besitze keine Basic-, VBA-Kenntnisse, nur JavaScript, C# etc.

Hier mein Code:

Code: Alles auswählen

Sub Main

End Sub


sub TineFormatierung
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object

rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
           
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = oRange

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Bold"
args2(0).Value = false

dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$A$18:$B$18"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ToggleMergeCells", "", 0, Array())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$A$18"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "ToPoint"
args6(0).Value = "$A$18:$C$18"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args6())

rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "VerticalAlignment"
args7(0).Value = 1

dispatcher.executeDispatch(document, ".uno:VerticalAlignment", "", 0, args7())

rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "HorizontalAlignment"
args8(0).Value = com.sun.star.table.CellHoriJustify.LEFT

dispatcher.executeDispatch(document, ".uno:HorizontalAlignment", "", 0, args8())

rem ----------------------------------------------------------------------
dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "WrapText"
args9(0).Value = true

dispatcher.executeDispatch(document, ".uno:WrapText", "", 0, args9())

rem ----------------------------------------------------------------------
dim args10(0) as new com.sun.star.beans.PropertyValue
args10(0).Name = "ToPoint"
args10(0).Value = "$D$18:$E$18"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args10())

rem ----------------------------------------------------------------------
dim args11(0) as new com.sun.star.beans.PropertyValue
args11(0).Name = "MoveContents"
args11(0).Value = true

dispatcher.executeDispatch(document, ".uno:ToggleMergeCells", "", 0, args11())

rem ----------------------------------------------------------------------
dim args12(0) as new com.sun.star.beans.PropertyValue
args12(0).Name = "ToPoint"
args12(0).Value = "$D$18:$F$18"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args12())

rem ----------------------------------------------------------------------
dim args13(0) as new com.sun.star.beans.PropertyValue
args13(0).Name = "VerticalAlignment"
args13(0).Value = 1

dispatcher.executeDispatch(document, ".uno:VerticalAlignment", "", 0, args13())

rem ----------------------------------------------------------------------
dim args14(0) as new com.sun.star.beans.PropertyValue
args14(0).Name = "HorizontalAlignment"
args14(0).Value = com.sun.star.table.CellHoriJustify.RIGHT

dispatcher.executeDispatch(document, ".uno:HorizontalAlignment", "", 0, args14())

rem ----------------------------------------------------------------------
dim args15(0) as new com.sun.star.beans.PropertyValue
args15(0).Name = "ToPoint"
args15(0).Value = "$D$18"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args15())

end sub

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Di, 16.05.2017 08:26
von Stephan
Ohne Programmierkenntnise wirst Du wohl nicht weiterkomnmen. Das aufgezeichnete Makro ist im Speziellen wenig hilfreich, da u.A. wegen der Anforderung das kein Dialog beim Verbinden von Zellen erscheinen soll, soviele händische Änderungen am Makro notwendig sind, das es einfacher ist das Makro gleich völlig neu zu schreiben.

Unklar sind mir einige TEile des Makros, weshalb ich annehme Du hast da selbst bereits Anpassungen vorgenommen. Ist das so?

Worum geht es?
Die Zeile:

Code: Alles auswählen

args1(0).Value = oRange

wurde garantiert nicht aufgezeichnet und oRange ist ohne Inhalt.



Gruß
Stephan

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Di, 16.05.2017 11:13
von bitEx33
Tatsächlich habe ich selbst versucht mittels Codeschnipseln irgendwie das hinzubekommen. Offenbar ohne Erfolg.

Das unten aufgeführte Bild zeigt, was ich mit dem Makro erreichen möchte. Zu sehen ist, dass mein Standard-Dokument eine unschöne Formatierung hat, die ich beheben möchte, da ich die gefordete Formatierung für ein bestimmtes Programm übernehmen möchte und es auch nur so übergeben kann. Mithilfe des Makros möchte ich es mir leichter machen, die Zellen zu formatieren. Speziell das Verbinden der Zellen ist eine mühsame Arbeit, da ich jede Zelle A mit der Zelle B daneben makieren und verbinden muss. Bei 1000 solcher Zellen kann das extrem viel Zeit nehmen, daher brauche ich das Makro damit das vereinfacht wird, indem ich alle Zellen A's und B's auswähle und das Makro ausführe.

Projekt:
soll...
  • keine Füllung haben
  • Zeilenumbruch haben
  • linksbündig sein und Ausrichtung "oben" haben
  • kein "fettdruck" haben
  • mit Spalte B verbinden
Person
soll...
  • Zeilenumbruch haben
  • linksbündig sein und Ausrichtung "oben" haben
Datum
soll...
  • mit Spalte D verbinden (links davon)
  • rechtsbündig sein und Ausrichtung "oben" haben
Zeiten
soll...
  • rechtsbündig sein und Ausrichtung "oben" haben

Bild

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Di, 16.05.2017 11:38
von Stephan
Speziell das Verbinden der Zellen ist eine mühsame Arbeit, da ich jede Zelle A mit der Zelle B daneben makieren und verbinden muss. Bei 1000 solcher Zellen kann das extrem viel Zeit nehmen, daher brauche ich das Makro damit das vereinfacht wird, indem ich alle Zeilen A und B's auswähle und das Makro ausführe.
Verständlich.

OK, dann beschränke ich mich mal auf diesen Teil, das hilft Dir dann zumindest ein Stück weiter.

Folgendes Makro verbindet die jeweils 2 horizontal nebeneinanderliegenden Zelle eines, beliebig großen, zweispaltigen Zellbereichs und übernimmt die Inhalte beider Zellen.

Code: Alles auswählen

Sub Zellen_verbinden()
	sel = ThisComponent.getCurrentSelection
	tc = ThisComponent
	With sel(0).RangeAddress
		sZ = .StartRow
		eZ = .EndRow
		sSp = .StartColumn
		eSp = .EndColumn
		blatt = .Sheet
	End With
	If Not(eSp-sSp = 1) Then
		Msgbox "Kein zweispaltiger Zellbereich markiert.", 16, "Abbruch"
		Exit Sub
	End If
	
	For i = sZ To eZ
		tmp1 = tc.Sheets(blatt).getCellByPosition(sSp,i).String
		tmp2 = tc.Sheets(blatt).getCellByPosition(eSp,i).String
		tc.Sheets(blatt).getCellRangeByPosition(sSp,i,eSp,i).merge(true)
		tc.Sheets(blatt).getCellByPosition(sSp,i).FormulaLocal = tmp1 & " " & tmp2
	Next i
	
	Msgbox "Fertig.", 64, ""
End Sub

Gruß
Stephan

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Di, 16.05.2017 11:55
von Rocko
bitEx33 hat geschrieben: Di, 16.05.2017 11:13Das unten aufgeführte Bild zeigt, was ich mit dem Makro erreichen möchte. Zu sehen ist, dass mein Standard-Dokument eine unschöne Formatierung hat, die ich beheben möchte, da ich die gefordete Formatierung für ein bestimmtes Programm übernehmen möchte und es auch nur so übergeben kann.
Wenn ich mir deine Screenshots so anschaue, hast du die potentiellen Helfer auf den falschen Weg gelockt. Du hast den Weg (Makro) vorgegeben, bevor dein eigentliches Ziel (Umformatieren) klar war.

Zunächst frage ich mich, wieso du eine gefüllte Zelle mit einer leeren Zelle (im Spaltenbereich) verknüpfen willst, wo es doch viel einfacher wäre, die leere Spalte zu löschen und die gefüllte Spalte auf die gewünsche Breite einzustellen.

Falls ich das Standard-Dokument richtig interpretiere, wäre es besser, du würdest im Unterforum Calc deine Anfrage auf Formatierungshilfe neu stellen und als Arbeitsgrundlage einen Ausschnitt deines Standard-Dokuments als Datei mitliefern.

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Di, 16.05.2017 11:56
von bitEx33
Wow, vielen Dank, Stephan. Was wäre ich nur ohne dich? [-:

Ist es rein theoretisch möglich, alle Formatierungen in einem Makro umzusetzen oder würde das zu Fehlern führen? Ich würde mich nämlich gerne mal mit der Sprache auseinandersetzen, damit ich für die Zukunft das Wissen für solche Probleme nutzen kann.

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Do, 18.05.2017 17:41
von bitEx33

Code: Alles auswählen

Sub Zellen_verbinden()
	sel = ThisComponent.getCurrentSelection
	tc = ThisComponent
	With sel(0).RangeAddress
		sZ = .StartRow
		eZ = .EndRow
		sSp = .StartColumn
		eSp = .EndColumn
		blatt = .Sheet
	End With
	If Not(eSp-sSp = 1) Then
		Msgbox "Kein zweispaltiger Zellbereich markiert.", 16, "Abbruch"
		Exit Sub
	End If
	
	For i = sZ To eZ
		tmp1 = tc.Sheets(blatt).getCellByPosition(sSp,i).String
		tmp2 = tc.Sheets(blatt).getCellByPosition(eSp,i).String
		tc.Sheets(blatt).getCellRangeByPosition(sSp,i,eSp,i).merge(true)
		tc.Sheets(blatt).getCellByPosition(sSp,i).FormulaLocal = tmp1 & " " & tmp2
	Next i
	
	Msgbox "Fertig.", 64, ""
End Sub

Hallo, Stephan, da ich gerne auch VBA lernen möchte, kannst du mir daher deinen obigen Code ein wenig erläutern, damit ich ihn besser nachvollziehen kann?

Re: CALC: auf ausgewählte Zeilen anwenden

Verfasst: Do, 18.05.2017 18:22
von Stephan
der (Objekt-)Variable sel wird die aktuelle Selektion zugeordnet (also der markierte Bereich).

Code: Alles auswählen

sel = ThisComponent.getCurrentSelection
der Objekt-)Variable tc wird das Dokumentobjekt (also das gesamte aktuelle Calc-Dokument) zugeordnet

Code: Alles auswählen

tc = ThisComponent
vom ersten Bereich (es gibt hier nur einen) der aktuellen SElektion werden aus dem zugehörigen Range-Objekt die werte für erste und Letzte Zeile und erste und letzte Spalte ausgelesen und Variablen zugeordnet:

Code: Alles auswählen

	With sel(0).RangeAddress
		sZ = .StartRow
		eZ = .EndRow
		sSp = .StartColumn
		eSp = .EndColumn
		blatt = .Sheet
	End With
Prüfen ob zweispaltiger Bereich, wenn nein dann Fehlermeldung ausgeben und abbrechen, wenn ja weitermachen.

Code: Alles auswählen

If Not(eSp-sSp = 1) Then
		Msgbox "Kein zweispaltiger Zellbereich markiert.", 16, "Abbruch"
		Exit Sub
	End If
Für jede Zeile im aktuell markierten Bereich:
-Den Inhalt der ersten Zelle in Variable tmp1 speichern
-Den Inhalt der zweitenZelle in Variable tmp2 speichern
-die erste und zweite Zelle verbinden
-den Inhalt von tmp1 und tmp2 in die veerbundene Zelle schreiben:

Code: Alles auswählen

	For i = sZ To eZ
		tmp1 = tc.Sheets(blatt).getCellByPosition(sSp,i).String
		tmp2 = tc.Sheets(blatt).getCellByPosition(eSp,i).String
		tc.Sheets(blatt).getCellRangeByPosition(sSp,i,eSp,i).merge(true)
		tc.Sheets(blatt).getCellByPosition(sSp,i).FormulaLocal = tmp1 & " " & tmp2
	Next i
Fertig-Meldung anzeigen:

Code: Alles auswählen

	Msgbox "Fertig.", 64, ""
Gruß
Stephan