"Spalten Formatieren mit Text in Spalten" - als Makro realisieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Fr, 05.03.2021 11:02

Wie verspochen nach einiger Testzeit hier das vorläufige Endergebnis:
  • Es gibt keine Möglichkeit, den im Titel des Threads genannten Befehl
    "Spalten Formatieren mit Text in Spalten" als Makro nachzubilden, um
    alle Formate einer Spalte zu entfernen.
  • Alternativ kann man reine Werte mit folgendem Makro aus einem mit <Strg> + <c>
    kopierten Bereich an beliebiger Stelle einfügen. So werden die allermeisten
    Formatierungen nicht mit kopiert.

Code: Alles auswählen

sub Werte_einfuegen  

dim document   as object
dim dispatcher as object

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

rem ----------------------------------------------------------------------
dim args1(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVD" 
args1(1).Name = "FormulaCommand"
args1(1).Value = 0
args1(2).Name = "SkipEmptyCells"
args1(2).Value = false
args1(3).Name = "Transpose"
args1(3).Value = false
args1(4).Name = "AsLink"
args1(4).Value = false
args1(5).Name = "MoveMode"
args1(5).Value = 4

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

ocell = ThisComponent.getCurrentSelection
osr=ocell.createReplaceDescriptor
osr.SearchRegularExpression=true
osr.searchstring="^(.*)$"
osr.replacestring="$1"
ocell.replaceAll(osr)
	
End sub   'Werte_einfuegen

Tausen Dank an die Geduld und Hilfe von mikeleb und Stephan!

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Mi, 24.02.2021 16:32

Hi mikeleb,

habe es jetzt nochmal Schritt für Schritt so gemacht wie Du geschrieben
hast - es scheint zu funktionieren. (Will diesmal nicht zu voreilig schreien...)

Weiss nicht, was ich dann die letzten Tage hier hin und her ausprobiert habe.

Ich werde das ein paar Tage beobachten und schauen, ob es noch Sonderfälle gibt.

Falls nicht, werde ich die Lösung dann hier reinstellen.

TAUSEND DANK - erstmal bis hierher!!! ;-)

:) :D

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von mikeleb » Di, 23.02.2021 14:08

Hallo,
das Ende ist fast das Wichtigste: es soll natürlich sortiert werden. Das funktioniert aber nur, wenn die zu sortierenden Zellen als Text formatiert sind.
Also:
1. Die Zellen in die eingefügt werden soll, als Text formatieren (das musst du sicherstellen oder am Ende das Format auf Text+weitere gewünschte Formatierungen setzen, wie in meinem Post Mi, 10.02.2021 18:11 bereits vorgeschlagen)
2. Inhalte einfügen ... Text, Zahlen (Datum und Uhrzeit)
3. harte, alte Textformatierungen entfernen
Genau das (2.+3.) leistet Stephans Makro vom Sa, 20.02.2021 11:02 für deine Ursprungsdaten (und ja, ich habe es getestet).
Am Ende immer wieder herausgefunden, dass es einfach nicht für alle Fälle funktionieren will.
Welche anderen problematischen Fälle gibt es?

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von Stephan » Di, 23.02.2021 11:44

Hoffe, meine Erklärungen sind selbsterklärend und Logik-fehlerfrei.
Sonst einfach nachfragen.
Ist mir zu kompliziert, ich klinke mich jetzt aus
Du hattest mir das doch im vorletzten Post vorgeschlagen...:
UND ich hatte "ggf." davorgeschrieben, weil NUR DU überhaupt einschätzen kannst ob mein Vorschlag sinnvoll war. Es liegt in Deiner Verantwortung diese Einschätzung so zu treffen wie es für Deine Zwecke sinnvoll ist.
Kann man irgendwie dieses "calcext:value-type="float">" in calcext:value-type="string"> mit Hilfe einer Codezeile umwandeln?[/i]
ja, insofern Du jeden Text per Makro verändern kannst wie Du ihn brauchst.
Wäre das nicht ein Ansatz?
Nach meinem Verständnis nein, denn der Text müsste ja zunächst einmal aus der XML-Quelle (=Datei content.xml) extrahiert werden und ich weiß nicht wie man das mit vertretbarem Aufwand machen will.


Gruß
Stephan

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Di, 23.02.2021 10:08

So, jetzt alles mal zusammengestellt.

Hier die Datei mit den Ursprungsdaten incl. einiger Möglichkeiten
bis hin zum gewünschten perfekten Ergebnis.

Hoffe, meine Erklärungen sind selbsterklärend und Logik-fehlerfrei.
Sonst einfach nachfragen.

Werte_einfügen_Übersicht.ods
(29.83 KiB) 140-mal heruntergeladen

AUSDRÜCKLICH hatte ich diese Zeile auskommentioert. WARUM Du sie benutzt und Dich dann wunderst das sie genau das tut wofür sie da ist (aber was Du u.U. garnicht brauchst/willst) weiß ich auch nicht.
Tja, was soll ich dazu jetzt sagen?!?
Du hattest mir das doch im vorletzten Post vorgeschlagen...:
ggf. aktiviere zusätzlich die Code-Zeile "ocell.clearcontents(1016)" indem Du das Hochkomma am Anfang der Zeile entfernst.

Am Ende funktioniert einzig die Überschrift dieses Threats: "Daten / Text in Spalten", um die
Zellen von allen unbrauchbaren Formatierungen (oder wie immer ihr das nennt) zu befreien und
eine "natürliche Sortierung" hin zu bekommen.

Bin auch immer noch gedanklich hier - Was haltet Ihr von meiner Idee mit mikelebs Fundstück:

Kann man irgendwie dieses "calcext:value-type="float">" in calcext:value-type="string"> mit Hilfe einer Codezeile umwandeln?[/i]

Wäre das nicht ein Ansatz?

:?

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von Stephan » Mo, 22.02.2021 18:14

Habe erst frohlockt und dann ettliche Stunden gestern und heute probiert.
Habe z.B. erst in der Ursprungstablle die "^(.*)$" ersetzt. Nur einzelne Bereiche, dann alles,
Wie sollte "alles" gehen? Es geht meines ERachtens nur ein getrennter Bereich auf einmal, denn jeder Versuch mehrere Bereiche gleichzeitig zu kopieren und einzufügen führt bei Calc zur Fehlermeldung "Diese Funktion lässt sich nicht auf Mehrfachselektionen anwenden", sonst hätte ich im Makro extra eine Nachbearbeitung meherer Bereichen vorgesehen.
dann
die Codezeile wie vorgeschlagen "ocell.clearcontents(1016)" aber dann sind alle Formatierungen im Ziel weg
AUSDRÜCKLICH hatte ich diese Zeile auskommentioert. WARUM Du sie benutzt und Dich dann wunderst das sie genau das tut wofür sie da ist (aber was Du u.U. garnicht brauchst/willst) weiß ich auch nicht.
Aus meiner Sicht ist die Zeile, in auskommentierter Form, nur deshalb im Makro verblieben weil sie im Makro von "mikelleb" enthalten war, ihr damals nicht widersprochen wurde und ich persyönlich aber garnicht verstehe wozu die Formatierungen alle entfernt werden sollten.
... usw usf.
Und was konkret noch?

Am Ende immer wieder herausgefunden, dass es einfach nicht für alle Fälle funktionieren will.
Also für Text, für Zahlen und für die hier:

Wir hatten doch weiter oben die "harte interne Text Formatierung", wo in Zellen zwar
sichtbar "4016" (am Anfang hieß das noch "316L") steht, beim Vergleich der Zellen sie aber ungleich sind.
Dann stelle bitte eine Beispieldatei zur Verfügung und nenne die konkreten Arbeitschritte für doiese Beispieldatei, für die das zuletzt gepostete Makro nicht zum gewünschten Ergebis führt.



Gruß
Stephan

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Mo, 22.02.2021 17:52

Hi Stephan,

danke für die Antwort!

Habe erst frohlockt und dann ettliche Stunden gestern und heute probiert.
Habe z.B. erst in der Ursprungstablle die "^(.*)$" ersetzt. Nur einzelne Bereiche, dann alles, dann
die Codezeile wie vorgeschlagen "ocell.clearcontents(1016)" aber dann sind alle Formatierungen im Ziel weg ... usw usf.


Am Ende immer wieder herausgefunden, dass es einfach nicht für alle Fälle funktionieren will.
Also für Text, für Zahlen und für die hier:

Wir hatten doch weiter oben die "harte interne Text Formatierung", wo in Zellen zwar
sichtbar "4016" (am Anfang hieß das noch "316L") steht, beim Vergleich der Zellen sie aber ungleich sind.

Mein Problem ist eben, dass ich die Daten nicht "natürlich" sortiert bekomme, weil erst oben die Zahlen und darunter,
obwohl gleich aussehend, die intern als Text formatierten Zellen kommen.

(Könnte für alles nochmal eine Beispieldatei reinstellen, falls das so zu abstrakt ist).


Ich komme am Ende immer wieder auf meinen allerersten Post und die Überschrift dieses Threats zurück

Abhilfe schafft:

Spalte "A" markieren
Daten -> Text in Spalten...
Unten im Spaltenkopf Spalte "A" markieren
Spaltentyp "Text" auswählen
OK

Es scheint das Einzige zu sein, was alles beseitigt. Bekommt man das denn wirklich nicht als Makro hin???


Habe jetzt noch diese Hoffnung:

mikeleb hatte doch herausgefunden:
mich hat es noch interessiert, warum es überhaupt zu dem "FALSCH" kommt, da doch A1 und A2 scheinbar gleich sind (beide zeigen 4016 an, beide sind als TEXT formatiert). Mittels der Option "Werte hervorheben" erkennt man, dass intern eines ein Wert und eines ein Text ist.
In der internen Struktur (context.xml) sieht das dann so aus:

<table:table-cell table:style-name="ce1" office:value-type="float" office:value="4016" calcext:value-type="float"><text:p>4016</text:p></table:table-cell>

<table:table-cell table:style-name="ce1" office:value-type="string" calcext:value-type="string"><text:p>4016</text:p></table:table-cell>

Kann man irgendwie dieses "calcext:value-type="float">" in calcext:value-type="string"> mit Hilfe einer Codezeile umwandeln?

Dann hätte man doch vielleicht das Übel an der Wurzel gepackt...

:?

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von Stephan » Sa, 20.02.2021 11:02

Aus den "Zahlenwerten" z.B. in "B1" = 0,358 wird 358
Dann verzichte auf meinen Vorschlag (die eine Codezeile) und nutze stattdessen einfach das Makro das "mikelleb" bereits gepostet hat, insgesamt also:

Code: Alles auswählen

sub Werte_einfuegen

dim document   as object
dim dispatcher as object

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


rem ----------------------------------------------------------------------
dim args1(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVD" 
args1(1).Name = "FormulaCommand"
args1(1).Value = 0
args1(2).Name = "SkipEmptyCells"
args1(2).Value = false
args1(3).Name = "Transpose"
args1(3).Value = false
args1(4).Name = "AsLink"
args1(4).Value = false
args1(5).Name = "MoveMode"
args1(5).Value = 4

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

ocell = ThisComponent.getCurrentSelection
'ocell.clearcontents(1016)
osr=ocell.createReplaceDescriptor
osr.SearchRegularExpression=true
osr.searchstring="^(.*)$"
osr.replacestring="$1"
ocell.replaceAll(osr)
	
End sub
ggf. aktiviere zusätzlich die Code-Zeile "ocell.clearcontents(1016)" indem Du das Hochkomma am Anfang der Zeile entfernst.



Gruß
Stephan

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Fr, 19.02.2021 20:48

Excel hat genau das gleiche Problem: Werte einfügen macht aus einer hart als Text formatierten Zahl auch keine Zahl!
Stimmt, wusste ich nicht: Die Zellen mit Apostroph bleiben tatsächlich auch in Excel Text...

da die Daten in der Zwischenablage so oder so nicht einfach als Array herumliegen.
Wichtiger Hinweis, danke!
Dann könnte man ja vielleicht die Zwischenablage auslesen und zu einem passsenden Array zusammenfügen!?
Ich erinnere mich, so etwas hast Du weiter oben schon mal angedeutet.
Wie hast du es denn probiert?
Das könnte jetzt peinlich werden, weil ich blind im Nebel stoche und eigentlich nicht weiß, was ich da mache...

Habe z.B. versucht, aDataArray durch oData oder Datas (aus dem clipboard-Makro) zu ersetzen...

daher ja meine Frage, woher die Daten stammen,
Ja richtig. Hatte ich ja weiter oben mal erzählt, dass die Daten ursprünglich über
die Zwischenablage aus einer vermutlich durch SAP erzeugten XLS-Datei stammen.

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von mikeleb » Fr, 19.02.2021 19:22

Hallo,
Excel hat genau das gleiche Problem: Werte einfügen macht aus einer hart als Text formatierten Zahl auch keine Zahl!
Dann unten die Spalte wo "Standard" steht klicken
Erst jetzt kann man darüber den Spaltentyp "Text" auswählen.
Das erscheint nur, wenn Daten aus anderen Anwendungen eigefügt werden sollen. Damit hast du indirekt mitgeteilt, dass es eben nicht (nur) um das Einfügen von Zellen oder Zellwerten aus kopierten Calc-Zellen geht, sondern (evtl. auch) um anderes. Daher ja meine Frage, woher die Daten stammen, den dementsprechend verhält sich auch die Zwischenablage und auch das manuelle Einfügen anders.
Das ist aber unerheblich, da die Daten in der Zwischenablage so oder so nicht einfach als Array herumliegen.
Also müsste man doch "nur" das Zwischenablagen-Array auslesen. Das ist mir aber noch nicht gelungen...
Wie hast du es denn probiert?

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Fr, 19.02.2021 18:10

Hi mikelleb
hast du immer noch.
Das gibt's doch gar nicht.
Du hast völlig recht, mit der alten Tabelle hatte
ich nicht mehr ausprobiert...

Jetzt war ich erst geschockt und dann ist mir eingefallen, dass wir doch als erstes
Dein "Un-fomatierungsmakro" / ersetzen von "^.*$" drüber fahren lassen.

Danach funktioniert aber dann wirklich mein neues oCursor.setDataArray(aDataArray)
und macht nicht mehr aus 0,358 --> 358.

Also können wir mit dem oCursor.setDataArray(aDataArray) weiterarbeiten,
wenn ich voher "^.*$" ersetze.

So, es bleibt das Problem der Position der Zwischenablage.

Aber: Vielleicht braucht man die Position gar nicht.

Neue Idee:
Die Zwischenablage liegt doch irgendwo als Array vor.
Und mit meinem "oCursor.setDataArray(aDataArray)" spucken wir ein Array aus.

Sehe ich das Falsch?

Also müsste man doch "nur" das Zwischenablagen-Array auslesen.
Das ist mir aber noch nicht gelungen...

Idee? :shock:


Mal kurze Erklärung:
Wollte das böse Wort bislang nicht in den Mund nehmen, aber im Prinzip versuche ich den
total wichtigen und total einfachen "EXCEL"-Befehl "Werte einfügen" nachzubauen.
Hätte nicht gedacht, dass das so kompliziert wird...

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von mikeleb » Fr, 19.02.2021 17:32

Hallo,
Den zweiten Teil, nämlich das variable Einfügen ausschließlich der Daten ohne jede Formatierung und das auch noch an beliebiger aktueller Cursor-Position ist inzwischen fertig.
Eben leider nicht. (und gleich hinzugefügt: ich habe es getestet!)
Das ursprüngliche Problem
Es kommt nun vor, dass die Grundformatierung der Zellen dieser Spalte "A" sich ändert.
Z.B.
"A1" = "316L"
"A2" = "316L"
Mit "B2": '=A1=A2' erhält man ein "FALSCH"
hast du immer noch.
Was mir immer noch nicht gelingt, ist die Bestimmung der Position dessen,
was für die Zwischenablage markiert wurde.
Das ist, nur aus der Zwischenablage heraus, nicht möglich.

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Fr, 19.02.2021 12:16

So, habe jetzt ein paar Stunden weitergebastelt, denn ein neuer Spaß des Systems
ist aufgetreten:

Hier die Beispieldatei
Werte_einfügen.ods
(12.57 KiB) 153-mal heruntergeladen
Ich kopiere den Bereich "A1" bis "B4" händisch mit Str + "c" in die Zwischenablage und
positioniere den Curser an beliebiger neuer Stelle z.B. "D5"

Altes Problem:
A1 bis A4 haben Text mit vorangestelltem Hochkomma " ' "
Lösung:
Dieses verschwindet bei Ausführen des Makros "Werte_einfuegen".
Genau wie gewünscht und weiter oben hier als Lösung bereits herausgefunden.

Neues Problem:
Aus den "Zahlenwerten" z.B. in "B1" = 0,358 wird 358
Ooops!

Code: Alles auswählen

sub Werte_einfuegen

dim document   as object
dim dispatcher  as object

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


rem ----------------------------------------------------------------------
dim args1(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVD" 
args1(1).Name = "FormulaCommand"
args1(1).Value = 0
args1(2).Name = "SkipEmptyCells"
args1(2).Value = false
args1(3).Name = "Transpose"
args1(3).Value = false
args1(4).Name = "AsLink"
args1(4).Value = false
args1(5).Name = "MoveMode"
args1(5).Value = 4

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

ThisComponent.getCurrentselection.setFormulaArray(ThisComponent.getCurrentselection.getDataArray())
	
End sub   'Werte_einfuegen


Mein Ansatz:
Den zweiten Teil, nämlich das variable Einfügen ausschließlich der Daten ohne jede
Formatierung und das auch noch an beliebiger aktueller Cursor-Position ist inzwischen
fertig. 8) (Dank an die, wo ich mir Schnipsel ausleihen dufte!)

Was mir immer noch nicht gelingt, ist die Bestimmung der Position dessen,
was für die Zwischenablage markiert wurde.
Derzeit markiere ich noch im Makro FIX "A1:B4"

Das soll aber ja variabel sein: Das Makro soll selber rausfinden, welchen
Bereich ich händisch vorweg mit Str + "c" kopiert habe.


Code: Alles auswählen

sub Werte_einfuegen_aus_Zwischenablage

dim document   as object
dim dispatcher as object

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

oSheet         = thiscomponent.sheets(0) ' Tabelle 1

' -> Das soll variabel aus dem fürdie  Zwischenablage markierten Bereich kopiert werden:
oQuellRange    = oSheet.getCellRangeByName("A1:B4") 


'Rest funtioniert variabel wie es soll an aktueller Cursor-Position:

'Auslesen der aktuellen Cursor-Position:
zelle_Column = ThisComponent.getCurrentSelection().getCellAddress().column
zelle_Row    = ThisComponent.getCurrentSelection().getCellAddress().row

oZielZelle = oSheet.getCellByPosition(zelle_Column,zelle_row) 'Ziel der Kopieraktion
aDataArray = oQuellRange.getDataArray() 'Das Array enthält nun die Variant-Daten des Bereiches
oCursor    = oSheet.createCursorbyRange(oZielZelle) 'Erstelle einen Cursor auf der Zielzelle

oCursor.collapseToSize(ubound(aDataArray(0))+1, ubound(aDataArray)+1) 'Erweitere den Cursor so weit, dass er das Daten-Array aufnehmen kann

oCursor.setDataArray(aDataArray) 'schreibe das Daten-Array in den Cursor. Das entspricht "Bearbeiten-Inhalte einfügen" Text, Zahlen und Datum&Zeit


End sub

Falls jemand eine Idee hätte...?!?!

Ich bleibe dran...

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von FraWie » Fr, 19.02.2021 10:14

"sonst"? Du hättest sehr wohl auch dann fragen müssen wenn Du keine ähnlichen (unbeantworteten) Fragen gefunden hättest.

Dein ganzes Tun war nur darauf gerichtet schneller eine Antwort zu bekommen, nach dem Motto: 'schaut her wie wichtig meine Frage ist, da fragen ganz viele Leute auch danach'.

Stephan
Wow - Donnerwetter - Starker Tobak!!!

Du machst das, was Du mir vorwirfst, aber auf einer persönlichen Ebene:
Unbewiesene Behauptungen aufstellen.

Das ist Deiner nicht würdig!

Sorry, ich habe mir nichts derartiges vorzuwerfen und bleibe lieber beim Thema.

Re: "Spalten Formatieren mit Text in Spalten" - als Makro realisieren

von Stephan » Mi, 17.02.2021 09:56

Bin mir sicher, dass ich mehrere ähnliche Anfragen gefunden hatte und dort
über Seiten keine Lösung stand - sonst hätte ich ja hier nicht fragen müssen.
"sonst"? Du hättest sehr wohl auch dann fragen müssen wenn Du keine ähnlichen (unbeantworteten) Fragen gefunden hättest.

Dein ganzes Tun war nur darauf gerichtet schneller eine Antwort zu bekommen, nach dem Motto: 'schaut her wie wichtig meine Frage ist, da fragen ganz viele Leute auch danach'.


Stephan

Nach oben