[GELÖST] Cursormanipulation per Basic

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

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Cursormanipulation per Basic

Beitrag von balu »

WO IST DAS MAKRO?

WO IST DIE *.Lis?



gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: Cursormanipulation per Basic

Beitrag von StePfl »

balu hat geschrieben: ...Workbook, auch wenn Du 10 Jahre oder wie auch immer mit VBA gearbeitet hast. Das führt hier nur zur Verwirrung.
prima - kein Problem

Weil Du dir wahrscheinlich einen abquälst Daten aus der *.Lis-Datei einzulesen. Denn so habe ich das aus deinen vorigen Beiträgen herausgelesen. Und nach dem einlesen brichst Du dir dann auch noch einen ab, um die Daten irgendwie sortiert (oder wie auch immer) in eine Calc-Datei einzupflegen.
nein - das Einlesen der LisDateien funktioniert inzwischen prima. Mit dem Auswerten hast du zum Teil recht ...
Ferner wollen wir endlich mal deinen Makrocode sehen um endlich voran zu kommen.
Nach den Diskussionen hier ... bin ich etwas schüchtern .... und es ist inzwischen eine ganze Menge Code geworden.
Wenn du dir den Code ansehen willst, kann ich mal die EinleseProceduren anhängen ...
Die LIS-Dateien - Hmmm - ist doch ne Menge Aufwand die zu anonymisieren ....

... und Du müsstest vielleicht auf Python umsteigen.
Daran hatte ich auch schon gedacht - nur (auf meine alten Tage) eine für mich völlig neue Programmiersprache zu lernen ....
ich weiß nicht, ob ich das wirklich packe...
Schon mal was von der richtigen Variablendeklaration (Öffentlich, Privat) gehört, und wie man sie wo richtig einsetzt?
Daran hatte ich auch erst gedacht - Das ginge, wenn in der Sub klar wäre, in welchem TC sich das CellObject befindet - da ist die Übergabe deutlich einfacher. ABER - für die RangeDefinition reicht mir ja das SheetObject - und das bekomme ich per ".getSpredSheet"

Das aller letzte mal das Du darauf hingwiesen wirst dir entweder XRAY oder MRI zu installieren, kannst auch beide nehmen.
Nicht mehr nötig: XRAY ist installiert ... MRI hab ich nicht weiter verfolgt, da der InstallationsVersuch ne Fehlermeldung geliefert hat.
Ich werde es aber noch einmal probieren und ggf. die Fehlermeldung (hier - an anderer Stelle) suchen/posten.
Allerdings muß ich erst noch lernen damit umzugehen - die Inhalte zu verstehen ...

Danke & Gruß,
Stefan
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: Cursormanipulation per Basic

Beitrag von StePfl »

balu hat geschrieben:WO IST DAS MAKRO?

WO IST DIE *.Lis?



gruß
balu
Sorry, dafür brauch ich einige Zeit ...
StePfl
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

Daran hatte ich auch erst gedacht - Das ginge, wenn in der Sub klar wäre, in welchem TC sich das CellObject befindet - da ist die Übergabe deutlich einfacher.
Bitte denke nach, denn Du kannst ja programmieren. Was wir hier im Moment machen ist eine Riesendiskussion die nur darauf beruht das Du meinst StarBasic-Programmierung müsse sein wie VBA-Programmierung bzw. Dir das wünscht.

Meine/unsere Hinweise sind hingegen kein Gesetz sondern geben nur so etwas wie die 'best praxis' unter StarBasic wieder so wie es auch eine 'best praxis' unter VBA gibt. Wenn ich geraten habe die 3 Dokument-Objekte jeweils zum richtigen Zeitpunkt in einer Objekt-Variable zu kapseln dann nur weil das erfahrungsgemäß in StarBasic der zweckmäßigste Weg ist.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

In der Grundebene sind natürlich die WorkbookObjecte (bei dir TC, Tc2, Tc3) bekannt - nur halt nicht in der Sub verfügbar. Ich werde die Sub so aufbohren, dass sie das betreffende Workbook (wie heißt das eigentlich im StarBasic?)
Das "Workbook" heisst wahrscheinlich "Dokument-Objekt", ich habe darüber noch nie nachdenken müssen, aber so würde ich es nennen (gleichzeitig würde ich einen Unterschied zwischen "Dokument-Objekt" und einem möglichen "Datei-Objekt" sehen).



Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

Gesucht war aber die letzte Zelle in einem geschlossenen DatenBlock - wie ich diese Spalte mit dieser Methode finde ??
Dessen war ich mir nicht bewusst denn die Rede war immer nur von STRG+<Pfeiltaste>, nicht das das in einem vorhandenen Bereich stattfinden soll.
Da ich nun auch annehme es könnte mehrere Bereiche geben (denn einen Hinweis zur letzten belegten Zelle im Blatt gab es ja schnon im Thread), muss ich erstmal nachdenken.
Außerdem habe ich leider (noch) nicht verstanden, was an einem CursorObject ungünstiger als an einem Cell-/RangeObject sein soll.
Garnichts, denn es geht nicht um das Objekt sondern eine Selektion und die ist deswegen ungünstig weil Du nicht willst das die Bildschirmanzeige flackert wenn mehrfach die Selektion wechselt.
Zum Einen ist das die FRage das ich doch nicht grundlos etwas per Code mache was zu Nachteilen führt und dann noch etwas WEiteres per Code mache was die Nachteile wieder ausgleicht, zum Zweiten aber das Praxiswissen wie sich:

Code: Alles auswählen

ThisComponent.LockControllers
ThisComponent.UnLockControllers
verhalten, denn entgegen Deiner Begeisterung dafür ist das ERgebnis dessen nicht immer optisch befriedigend, WEIL Du ja am Ende die Bildschirmaktualisierung wieder anschalten musst und OO dann nicht imer schlagartig den Bildschirm aktualisiert sondern u.U. in merklichen Schritten und dann flackerts eben auch wieder.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

Das stimmt so nicht, Stephan hat nur geschrieben das du idR. kein Cursorobjekt benötigst.
Danke, das ist tatsächlich eine wichtige Feststellung.

@StePfl
Es geht dabei darum das man in manchen Ausnahmefällen doch mittels dispatcher kopieren muss, aber genau um die Notwendigkeit dazu zu klären fragte ich nach genaueren Erklärungen oder einer Beispieldatei.

(_Ein_ Beispiel für einen solchen Ausnahmefall ist das Kopieren eines Tabellenblattes mit Inhalt, in OO geht das nur mit dispatcher-code, in LO seit einiger Zeit auch per nativem Basic-Code (wenn ich mich richtig erinnere))


Gruß
Stephan
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: Cursormanipulation per Basic

Beitrag von StePfl »

Hallo Stephan,
Danke für deine (annehmenden) Antworten zu meinen Detail-Fragen/Aussagen.
...eine Riesendiskussion die nur darauf beruht das Du meinst StarBasic-Programmierung müsse sein wie VBA-Programmierung bzw. Dir das wünscht.
Mir ist eigentlich VBA ziemlich egal - Mein Bestreben ist, die umfangreichen Auswertungen, die ich früher sehr Zeitaufwendig, manuell mit entsprechenden Formelstrukturen durchgeführt hatte nun zu automatisieren .... also eher mein DenkModel mit Basic nachzubilden.
... denn die Rede war immer nur von STRG+<Pfeiltaste>....
...es könnte mehrere Bereiche geben
Dann habe ich mich nicht genau genug ausgedrückt.
Ich würde gerne mit Basic den Vorgang nachbilden, den ich bisher manuell mit "Strg+>Pfeiltaste> und inzwischen mit angepassten Dispatcher-Routinen ausführe.
...und - JA - es gibt mehrere Bereiche, deren Anzahl und Größe jedesmal variieren. Genau deshalb suche ich ja nach einer Methode, diese a) zu finden, b) deren Umfang zu ermitteln um diesen Bereichen dann c) eineindeutige Namen zuzuweisen um sie in den Auswerteformeln (als Range) addressieren/ ansprechen zu können.
...sondern eine Selektion und die ist deswegen ungünstig weil Du nicht willst das die Bildschirmanzeige flackert wenn mehrfach die Selektion wechselt...
Ich hatte bisher ein mit "createCursor" erzeugtes Object SO verstanden, dass es sich hierbei um einen virtuellen Cursor handelt, der keine Wirkung auf die sichtbare Oberfläche hat. Anderenfalls macht es wenig Sinn die Dispatcher-Aufzeichnung (die den sichtbaren Cursor manipuliert) durch ein "CreateCursor"-Object zu ersetzen - und ich verstehe jetzt erst meinen Denkfehler und eure Hinweise.
...das Kopieren eines Tabellenblattes mit Inhalt...
Wenn ich Dannenhöfer richtig gelesen habe, kann man das mit starBasic schon:
7.3.6 Wie kann man Zellbereiche kopieren?
und
7.4.4 Wie kann man Arbeitsblätter löschen, erzeugen,kopieren und verschieben?
Erst einmal Danke für die vielen Hinweise/Zurechtrückungen/Erläuterungen. Sie helfen mir dabei mich den Eigenheiten von StarBasic zu nähern.
Am WE bin ich unterwegs und kann hier nicht mitlesen/mitdenken.

Ich wünsche euch ein erholsames und schönes Wochenende,
Gruß
StePfl
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

Wenn ich Dannenhöfer richtig gelesen habe
ja, ist mein Fehler es geht richtigerweise um:

'_Ein_ Beispiel für einen solchen Ausnahmefall ist das Kopieren eines Tabellenblattes mit Inhalt zwischen verschiedenen Calc-Dokumenten [...]'


Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Cursormanipulation per Basic

Beitrag von balu »

Mahlzeit.
Stephan hat geschrieben: Was wir hier im Moment machen ist eine Riesendiskussion die nur darauf beruht das Du meinst StarBasic-Programmierung müsse sein wie VBA-Programmierung bzw. Dir das wünscht.
Ganz ehrlich gesagt, ich habe den Überblick darüber verloren was er früher mit VBA programmiert hat um die *.Lis Dateien einzulesen und was er jetzt mit StarBasic versuchen will um das gleiche zu erreichen oder erst jetzt mit StarBasic das machen will was er sonst nur per Hand mit den *.Lis Dateien gemacht hat und überhaupt nicht mit VBA diesbezüglich gearbeitet hat. Und ferner frage ich mich ob er in Excel nur mit aufgezeichneten Makros gearbeitet hat, oder richtig programmiert hatte?
Ich raffe es nicht mehr. :?

StePfl hat geschrieben:
... denn die Rede war immer nur von STRG+<Pfeiltaste>....
...es könnte mehrere Bereiche geben
Dann habe ich mich nicht genau genug ausgedrückt.
Ich würde gerne mit Basic den Vorgang nachbilden, den ich bisher manuell mit "Strg+>Pfeiltaste> und inzwischen mit angepassten Dispatcher-Routinen ausführe.
...und - JA - es gibt mehrere Bereiche, deren Anzahl und Größe jedesmal variieren. Genau deshalb suche ich ja nach einer Methode, diese a) zu finden, b) deren Umfang zu ermitteln um diesen Bereichen dann c) eineindeutige Namen zuzuweisen um sie in den Auswerteformeln (als Range) addressieren/ ansprechen zu können.
Eigentlich wollte ich einen schönen Bildlichen vergleich erzählen, aber mir fällt momentan nix amüsantes und zutreffendes ein. Also lass ich es, und wiederhole mich noch mal aber diesmal etwas deutlicher.

Wenn man per StarBasic auf die Textdatei .Lis zugreifen kann, dann kann man wohl höchstwahrscheinlich diese Datei z.B. per "LINE-INPUT" untersuchen und filtern. Und gleichzeitig kann man dann auch bestimmt gleich gefundene Filterkriterien in ein Tabellenblatt eintragen und anschließend diesen gefilterten Daten einen Namen zuordnen. Dadurch hat dann dieser Datenbereich einen Namen den man dann auch unter
-> Einfügen
--> Namen (Strg + F3)
nachlesen kann.
Und schon kann man sich das ganze Theater mit Cursorbewegungen, Cursormanipulationen und suchen der Datenbereiche schenken, man kann ja dann direkt die Datenbereiche per vergebenen Namen ansprechen.

Natürlich muss die Untersuchung und Filterung der *.Lis erst programmiert werden, aber ich denke mir das sich das bestimmt realisieren lässt.

Aber nöö! Blos keine angepasste *.Lis Datei anhängen um die möglichen Datenstrukturen zu untersuchen. Stattdessen fragen: "Wozu brauchst Du die?"

Stephan hat geschrieben: ... es geht richtigerweise um:

'_Ein_ Beispiel für einen solchen Ausnahmefall ist das Kopieren eines Tabellenblattes mit Inhalt zwischen verschiedenen Calc-Dokumenten [...]'
Mit Inhalt und Zellformat Vorlagen und Bedingte Formatierung, aber ohne Spaltenbreite und Zeilenhöhe geht via "Übertragbarer Inhalt", nachzulesen in Andrew Pitonyak. Und ja, zwischen zwei Calc-Dokumenten. Eben in OOo 3.3.0 getestet, nachdem ich den Code von Andrew leicht angepasst hatte (weil oDoc1 und oDoc2 nicht definiert sind).



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

Mit Inhalt und Zellformat Vorlagen und Bedingte Formatierung, aber ohne Spaltenbreite und Zeilenhöhe geht via "Übertragbarer Inhalt", nachzulesen in Andrew Pitonyak. Und ja, zwischen zwei Calc-Dokumenten. Eben in OOo 3.3.0 getestet, nachdem ich den Code von Andrew leicht angepasst hatte (weil oDoc1 und oDoc2 nicht definiert sind).
ich bestehe nicht auf dem Wort "Inhalt", ich bestehe nur darauf was ich damit meinte und das ist am Besten [1] damit beschrieben das ich sage will ein Tabellenblatt so kopieren wie das Ergebnis aussähe wenn ich die Kopieraktion per Hand durchführen würde.

[1]
nur "am Besten" weil selbst das jetzt Gesagte wohl noch nicht ganz vollständig ist, denn letztendlich geht es um das was Nutzer immer etwas unscharf formulieren als z.B. 'es soll alles in der Kopie genauso sein wie beim Original-Tabellenblatt' - die Probleme fangen nur bei dieser Art der Definition da an wo es z.B. Streit gibt was denn nun "genauso" ist wie eine Originalzelle mit Formel ... eine Zelle mit Formel die genauso rechnet (aber u.U. zu einem anderen Ergebnis kommt weil die allgemeinen Rahmenbedingungen nicht gleich sind) wie die Originalzelle oder eine Zelle deren Inhalt genauso 'aussieht' wie der der Originalzelle


Gruß
Stephan
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: Cursormanipulation per Basic

Beitrag von StePfl »

Hallo Balu und Stephan,

gut - IHR WOLLT ES SO ... :?
ich habe also nun eine *.Lis-DemoDatei (EINE von ca 8 verschiedenen Möglichkeiten - ich hoffe, das genügt) erstellt,
und den aktuellen Stand meiner EinleseRoutinen und VorformaierRoutinen in eine Muster.org verschoben.

@Balu:
Die Idee einer fest programmierten VorFormatierung innerhalb der EinleseRoutine ist deshalb schwierig, denn das Format der Lis-Dateien entspricht der Druckmaske des Hausverwaltungsprogramms unterliegt dem Geschmack der dortigen Programmierer und ändert sich (bei Gleichem Inhalt) nahezu bei jedem Upgrade).

Ich bin sehr gespannt auf eure Reaktionen.

Außerdem: Darin sind auch meine Versuche einer CursorManipulation mittels StarBasic - nach einigem Probieren scheint es nun zu funktionieren
Ich habe nur Probleme, wenn das übergebene Object "optional" übergeben wird - da bekomme ich Fehlermeldungen, die ich nicht verstehe.
z.B. in "oStrgDownStarBasic_2(optional oCell as Object)" stört sich das Prg an "oSheet = oCell.getSpreadSheet"
und meldet:BASIC-Laufzeitfehler. Variable nicht definiert, obwohl die Datei "oCell" im Beobachter vorhanden und mit Inhalten eingesehen werden kann.

viel Vergnügen damit...

Gruß
StePfl

PS: ich höre das Stöhnen von Balu schon jetzt ... :(

PS2:
in "Dateianhänge" wird die Datei "Muster.lis" mit dem Hinweis auf "Ungültige Dateierweiterung: Muster.LIS" verweigert. :shock:
Wie soll ich euch diese Datei zukommen lassen? (die exakte Kopie ist in "Temp.B16:B88" vorhanden)
Dateianhänge
MakroTest-Demo.ods
(16.18 KiB) 120-mal heruntergeladen
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Cursormanipulation per Basic

Beitrag von balu »

Hallo StePfl,
ich höre das Stöhnen von Balu schon jetzt ...
Du hast Recht.
Aber frag dich mal aus welchem Grund ich am Stöhnen bin.

...
...
...

Da kommst Du nicht von alleine drauf. Das werde ich dir aber gleich noch detailierter mitteilen, doch zuvor nenne ich dir einen grundsäztlichen Grund warum ich am Stöhnen bin.

Wie war das noch mal? Du kennst Dannenhöfer und Pitonyak, deine Aussage.
Da kann ich nur mit dem Kopf schütteln, weil ich es dir einfach nicht glauben kann. Auch wenn ich stellenweise sehe das es schon stimmt. Aber so richtig hast Du nicht damit gearbeitet.

Detail:
Der Dannenhöfer (als Beispiel) hat ein wunderbares Kapitel wo es sich nur um Variablen dreht. Aber so etwas wichtiges hat dich anscheind gar nicht interessiert, oder wie kommt so etwas zustande?

Code: Alles auswählen

function oStrgDownStarBasic_2(optional oCell as object) as object
    dim oDoc, oSheet, oRange, oCurs
    dim hlp, hlp1, hlp2, hlp3, hlp4, hlp5

    oDoc = thisComponent
    if isMissing(oCell) then 
        dim oCell
        oSheet=ThisComponent.CurrentController.ActiveSheet
        oCell = ThisComponent.CurrentSelection
    else 
        redim preserve oCell
        oSheet = oCell.getSpreadSheet  ' FEHLERMELDUNG:  BASIC-Laufzeitfehler. Variable nicht definiert.    
[...]
Aus diesem Codeausschnitt interessiert uns jetzt erstmal nur folgender Teil.

Code: Alles auswählen

    dim oDoc, oSheet, oRange, oCurs
    dim hlp, hlp1, hlp2, hlp3, hlp4, hlp5
Frage:
Wieviele Variablen sind dort richtig deklariert?

...
...
...

Antwort:
KEINE

Sie sind alle "Müll".
Na ja, genauer gesagt sind sie vom Typ Variant. Aber wenn ich mich nicht vertue, dann müssten diese

Code: Alles auswählen

    dim oDoc, oSheet, oRange, oCurs
alle vom Typ Object sein, weil Du ein kleines o vorangesetzt hast. Also müsste das wie folgt aussehen.

Code: Alles auswählen

    dim oDoc as Object, oSheet as Object, oRange as Object, oCurs as Object
Und NEIN!
Es reicht nicht wenn man nur die letzte Variable als Object deklariert. Es MUSS jede einzeln mit ihrem Typ deklariert werden, da führt kein Weg daran vorbei.

Und was sollen dann diese hier vom Typ her sein, auch Variant?

Code: Alles auswählen

    dim hlp, hlp1, hlp2, hlp3, hlp4, hlp5
Ich habe nur Probleme, wenn das übergebene Object "optional" übergeben wird - da bekomme ich Fehlermeldungen, die ich nicht verstehe.
z.B. in "oStrgDownStarBasic_2(optional oCell as Object)" stört sich das Prg an "oSheet = oCell.getSpreadSheet"
und meldet:BASIC-Laufzeitfehler. Variable nicht definiert, obwohl die Datei "oCell" im Beobachter vorhanden und mit Inhalten eingesehen werden kann.
Tja, was machst Du denn auch hier, weißt Du das ganz genau?

Code: Alles auswählen

function oStrgDownStarBasic_2(optional oCell as object) as object
[...]
    if isMissing(oCell) then 
        dim oCell
    else 
        redim preserve oCell
[...]
 
Befasse dich DRINGENDS mit dem Thema Variablen. Überarbeite deinen Code, und dann hänge das Ergebniss hier wieder an.


Ach ja, noch was.

Code: Alles auswählen

    oDoc = thisComponent
    if isMissing(oCell) then 
        dim oCell
        oSheet=ThisComponent.CurrentController.ActiveSheet
        oCell = ThisComponent.CurrentSelection
Du definierst oDoc mit ThisComponent, setzt es aber nicht konsequent ein?

in "Dateianhänge" wird die Datei "Muster.lis" mit dem Hinweis auf "Ungültige Dateierweiterung: Muster.LIS" verweigert.
Nimm ne andere Dateiendung, wie z.B. .txt oder .zip (aber mit dem Vermerk nur die Endung zu tauschen).

Für heute hab ich Feierabend.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: Cursormanipulation per Basic

Beitrag von StePfl »

Hallo Balu,

Danke für deine Ausführungen.
... Wie war das noch mal? Du kennst Dannenhöfer und Pitonyak, deine Aussage. ...
NEIN - ich habe beide (sehr umfangreichen) Werke nicht von Anfang bis Ende durchgelesen - sondern dort immer wieder Hilfe gesucht.
Aus diesem Codeausschnitt interessiert uns jetzt erstmal nur folgender Teil.

Code: Alles auswählen

    dim oDoc, oSheet, oRange, oCurs
    dim hlp, hlp1, hlp2, hlp3, hlp4, hlp5
Frage: wieviele Variablen sind dort richtig deklariert? .... KEINE...
... Ja - durch das Nicht-Explizit-Definieren sind sie Variant. ... die bei jeder Wertzuweisung den Typ des Zuweisungswertes annehmen .... (Dannenhöfer S. 79) - ABER STIMMT, dort steht auch: "Tipp: Alle Variablen ordentlich deklarieren und auf den Typ Variant möglichst verzichten."
und - die "hlp"-Variablen habe ich bewusst als Variant deklariert, denn sie sind reine Hilfsvariablen, die immer wieder auch unterschiedliche Typen aufnehmen können sollen. (stimmt - es könnte sauberer sein)

ABER - ist das wirklich die URSACHE für die Fehlermeldung?
Tja, was machst Du denn auch hier, weißt Du das ganz genau?

Code: Alles auswählen

function oStrgDownStarBasic_2(optional oCell as object) as object
[...]
    if isMissing(oCell) then 
        dim oCell
    else 
        redim preserve oCell   
[...]
das dachte ich bisher eigentlich schon... (man lernt aber nie aus)
ausser die Zeile mit dem "redim preserve.." - das war ein Versuch, die Fehlermeldung "BASIC-Laufzeitfehler. Variable nicht definiert" zu beheben - Zugegebener Massen ein "Stochern im Nebel" ...
weil ich eben NICHT verstehe, warum die im Aufruf als "Cell-Object" definierte Variable hier nun (plötzlich) nicht definiert sein soll.
Nimm ne andere Dateiendung, wie z.B. .txt oder .zip (aber mit dem Vermerk nur die Endung zu tauschen).
... mit txt ging es auch nicht, mit ZIP würde es klappen,
ich werde aber vorher dein ..."- Überarbeite deinen Code, und dann hänge das Ergebniss hier wieder an." befolgen.

Ich bin zwar froh über deinen "Lehrgang zum sauberen Programmieren" - da kann ich sicherlich viel lernen ...
und muß vermutlich alle meine Programme massiv überarbeiten.
nur hilft mir das nicht bei meiner Eingangsfrage .... oder bei der oben beschriebenen Fehlermeldung - oder ich verstehe es einfach nicht.

ich wünsche dir, Stephan und all den anderen hilfreichen Geistern ein schönes Wochenende

Gruß
StePfl
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Cursormanipulation per Basic

Beitrag von Stephan »

Wenn ich es richtig sehe und Spalte B die Rohdaten enthält, die ihrerseits ursprünglich aus einer Textdatei stammen, dann würde ich diese Daten nicht versuchen in einer Calc-Tabelle zu bearbeiten, sondern die ursprüngliche Textdatei per Basic zeilenweise einlesen und bearbeiten (und das Bearbeitungsergebnis dann ggf. in eine Calc-Tabelle eintragen).

Schau Dir dazu in der OpenOffice-Hilfe zu Basic die Erläuterungen zu "Datei-Ein/Ausgabefunktionen" an, insbesondere "Input#-Anweisung". der zweite TEil des dortigen Beispielcodes:

Code: Alles auswählen

iNumber = Freefile
Open aFile For Input As iNumber
While not eof(iNumber)
Line Input #iNumber, sZeile
If sZeile <>"" then
sMsg = sMsg & sZeile & chr(13)
end if
wend
Close #iNumber
ist schon der richtige Ansatz für dEin Problem nur musst Du statt "sMsg = sMsg & sZeile & chr(13)" eine Auswerteroutine einfügen die die Zeilen analysiert, also z.B.:

Code: Alles auswählen

if sZeile ... Then

  ElseIf sZeile ... Then

  ...

  'oder auch z.B.
  ElseIf Left(sZeile, 12) = "abc" Then

  ...

  ElseIf sZeile "        ~1B─────────────────────────────────── ~0B" Then
    'erkannt wurde die Zeile auf die in der nächsten Zeile
    'ein Datensatz folgt, hier muss entsprechender Code stehen der darauf reagiert
  ...

End If
Dazu musst Du natürlich ersteinmal genau klären wie was in der Ursprungsdatei 'koodiert' ist, das erfordert auch inhaltliche Kenntnis der Daten die ich nicht habe.

Ein Problem wenn ich mir die Daten anschaue sind gewisse Inkonsistenzen, wo ich nicht weiß weshalb diese dasind, z.B. sind in Zeile B46 bis B52 augenscheinlich mehrere Datensätze, jedoch unterscheidet die Struktur des Datensatzes in B46 von allen anderen und mir ist nicht klar warum, weil ich nicht weiß was der Inhalt repräsentiert bzw. weil ich den grundsätzlichen Aufbau nicht kenne, denn eine Zeile wie:

Code: Alles auswählen

~C        2798                            1 
lässt zwar für das menschliche Auge 3 Datenfelder erkennen, aber wie sind diese nun GENAU abgegrenzt?

z.B. kann es sein das das erste Feld immer die ersten zwei Zeichen der Zeile umfasst (~C) genausogut aber auch alle Zeichen von Beginn der Zeile (Anzahl also unbestimmt) bis vor das erste Leerzeichen. Auffälliges Problem in B46 bis B52 ist hier aber im Konkreten das in B46 die augenscheinlich zweite Spalte durch eine unterschiedliche Anzahl von Leerzeichen von der ersten Spalte getrennt ist als alle anderen Zeilen (B47 bis B52) und ich kann nicht wissen warum (vielleicht ist es nur ein Schreibfehler?).



Gruß
Stephan
Antworten