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

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

mikeleb
*******
Beiträge: 1023
Registriert: Fr, 09.12.2011 16:50

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

Beitrag von mikeleb »

Hallo Stephan,
allein ist es merkwürdig das in der Datei, wenn sie normal in Calc geöffnet ist, nichts zu sehen ist
Das Ganze wird sichtbar, wenn man die Formatierung der Zellen von Text auf Standard zurücksetzt. Ursprüngliche Zahlen werden wieder Zahlen, hart als Text formatierte Zahlen erhalten nun (wieder) ein Apostroph. In der Formatierung "Text" wird der Apostroph nicht angezeigt (ist ja auch nicht nötig, da ja eh' Textformat)
Gruß,
mikeleb
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

@Stephan

Ich wollte niemanden angreifen.

Browserverlauf hatte ich auch direkt gedacht, leert sich aber nach jeder Sitzung aus
Sicherheitsgründen. :(

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.

Steht der Aufwand der Suche nach den Links in keinem Verhältnis mehr zum
Nutzen - schließlich habe ich jetzt eine Lösung und alles andere ist "Freizeit" -
werde ich meine Aussage zurückziehen.

Aber wie gesagt, gib mir die Zeit und ich wühle mich nochmal da durch, interessiert
mich jetzt selbst...


@mikeleb:

Danke nochmal dafür!

Alles gelöst, jetzt :-)
Stephan
********
Beiträge: 12045
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

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

Beitrag von Stephan »

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
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

"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.
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

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) 20-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...
mikeleb
*******
Beiträge: 1023
Registriert: Fr, 09.12.2011 16:50

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

Beitrag von mikeleb »

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.
Gruß,
mikeleb
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

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...
mikeleb
*******
Beiträge: 1023
Registriert: Fr, 09.12.2011 16:50

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

Beitrag von mikeleb »

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?
Gruß,
mikeleb
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

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.
Stephan
********
Beiträge: 12045
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

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

Beitrag von Stephan »

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
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

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

:?
Stephan
********
Beiträge: 12045
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

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

Beitrag von Stephan »

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
FraWie
**
Beiträge: 42
Registriert: So, 12.04.2020 18:37

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

Beitrag von FraWie »

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) 15-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?

:?
Stephan
********
Beiträge: 12045
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

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

Beitrag von Stephan »

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
mikeleb
*******
Beiträge: 1023
Registriert: Fr, 09.12.2011 16:50

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

Beitrag von mikeleb »

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?
Gruß,
mikeleb
Antworten