zusammenhängende Strings in Makro

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: zusammenhängende Strings in Makro

von sascha11 » Di, 21.03.2006 11:25

also die Lösung ist, dass die Zeile ein String sein muss:
[quote]oT1.getCellRangeByName(sBereichname).string=oD1.getcontrol("name").text[/quote]

Danke, musste die Doku nochmals lesen!

noch eine Frage

von sascha11 » Di, 21.03.2006 10:41

hey,

noch eine Frage, wie wandele ich den Value jetzt wieder in Text um, damit in meiner Tabelle der Inhalt von "name" steht und nicht "0"?

THX!

von sascha11 » Di, 21.03.2006 08:23

hey!

vielen dank, dann kann ich weitermachen!

Sascha

von Toxitom » Mo, 20.03.2006 18:20

Hey Sacha,

Hmm, also beim Durchblick deines Codes fällt mir folgendes auf:
nNeuDatSatz = oT2.getCellRangeByName("Daten.B1").value
Was soll das "Daten.B1" ? oT2 ist doch schon dein Tabellen-Objekt (die Tabelle "Daten"), hier sollte die Adresse "B1" vollständig genügen.

Also, unter der Annahme, dass deine 2. Tabelle (Index Nr. 1) die Tabelle "Daten" ist und deine 3. Tabelle (index Nr 2) die Tabelle "Liste" ist, kann ich deinen Code nachstellen.
Der weitere Fehler liegt in der Variablen "nNeuDatSatz " im Codeteil:

Code: Alles auswählen

sub SatzSpeichern
'sBereich = "Liste.B" & nNeuDatSatz
'----hier kommt der, den Thread betreffende Code ----
'oT1.getCellRangeByName(sBereich).value=oD1.getcontrol("name").text 
Die wird hier weder definiert noch mit Werten gefüllt - der Compiler definiert sie also zur Laufzeit, sie ist aber dann leer (und ein String). Insofern wird eine nicht gültige Adresse erzeugt ("B[nix]") , es kommt zum Fehler.
Also, entweder handelt es sich um einen Tippfehler und die Variable sollte eigentlich "nNeueDatSatz" heissen (die ist nämlich global definiert), oder du musst die Varaible auch global definieren (vor der ersten sub) - denn nutzen tust du sie ja schon weiter oben. Korrigierst du die Fehler, läuft der Code (bei mir) - der Text wird sogar intern in eine Value umgewandelt. OK, dennoch sollte man beim Programmieren die korrekten Variablen berücksichtigen und entsprechend selbst die Umewandlungen vornehmen :wink:

Gruss
Thomas

von sascha11 » Mo, 20.03.2006 15:10

achso:

Controll "name" ist ein Eingabefeld, das tatsächlich Ziffern enthält, die Fehlermeldung kommt jedoch schon bei der Compilierung...

von sascha11 » Mo, 20.03.2006 14:13

hey!

hier mal der komplette Code, Erklärung folgt
OpenOffice Version 2.01
ich möchte die Zeile zuerst auslesen, dann erhöhe ich Sie und dann schreibe ich Sie wieder an die betreffende Stelle.

Mit dem betreffenden Code lese ich zuerst die Zeile , an die geschrieben werden soll aus, dann erhöhe ich die Zeile, damit in ein leeres Feld geschrieben wird und dann baue ich mir den String mit der leeren Zelle, z. Bsp.: Tabelle.B1, das ist dann der zusammengesetzte String, nur erhalte ich hier die Fehlermeldung!

[quote]

REM ***** BASIC *****
Dim oD1 as Object 'Eingabemaske
Dim myDoc as Object 'Das Tabellendokument
Dim oT1 as Object, oT2 as Object 'Die Tabellenblätter "Liste" und "Daten"

Dim nNeueDatSatz as integer 'Neue Datensatz- Zeilennummer

Sub main
mydoc= ThisComponent
oT1=myDoc.sheets(1)
oT2=myDoc.sheets(2)
'Maske initialisieren
DialogLibraries.LoadLibrary ("Standard")
oD1= CreateUnodialog(DialogLibraries.Standard.Maske)
initMaske
oD1.Execute()
end sub
'---------- Formular initialisieren und Werte eintragen -----
Sub Abbrechen
oD1.EndExecute()
end sub

Sub initMaske
'--- neue Zeilennummer erzeugen, Zugriff auf Zellbereichsobjekt ---
nNeuDatSatz = oT2.getCellRangeByName("Daten.B1").value
'--- Neue Datensatznummer eintragen ---

'--- Datensatznummer in Maske schreiben ---
oD1.getcontrol("datensatznr").text =nNeuDatSatz+1
oT2.getCellRangeByName("Daten.B1").value=nNeuDatSatz+1
nNeuDatSatz= nNeuDatSatz + 1

'--- Auswahllisten mit Daten füllen ---
FuellListe ("AbfOrt", "d", 2, 23)
'Fuellliste ("Liste", Spalte, Zeile, Anzahl Elemente)

'--- Eingabefelder Inhalte löschen
oD1.getControl ("name").text=""
oD1.getControl ("infotermin").text=""
oD1.getControl ("antragbis").text=""
oD1.getControl ("antraggestellt").text=""
oD1.getControl ("kAufnahmewg").text=""
oD1.getControl ("aufnkom").text=""
oD1.getControl ("antragab").text=""
oD1.getControl ("anTraeger").text=""
oD1.getControl ("kzusage").text=""
oD1.getControl ("aufnahme").text=""
oD1.getControl ("wg").text=""

satzSpeichern
end sub

sub FuellListe (Liste, spalte, zeile,eNr)
FFeld=oD1.getcontrol(Liste)
FFeld.removeitems(0,eNr)
for i=0 to eNr
adr="$"+spalte+"$"+(i+zeile)
inhalt=oT2.getCellRangeByName(adr).string
FFeld.additem(inhalt,i)
next
FFeld.additem("",0)
end sub

Sub Maske

End Sub

function DatWert (FDat)
sFDat=Format(fDat,"00000000")
sDat=right(sFdat,2)&"."&mid(sFdat,5,2)&"."&left(sfdat,4)
DatWert=sDat
end function

function dat_adr(sp)
zeile = nNeueDatSatz
dat_adr="$" & sp &"$" & zeile
end function

sub Datenbereich
Dim aPos1 as New com.sun.star.table.CellAddress
oBereich=ThisComponent.NamedRanges
oBereich.removebyname("Datenbank")
oBereich.addNewbyName("Datenbank","$Liste.$A$2:$L$"&nNeuDatSatz,aPos1,0)
end sub

sub SatzSpeichern
'sBereich = "Liste.B" & nNeuDatSatz
'----hier kommt der, den Thread betreffende Code ----
'oT1.getCellRangeByName(sBereich).value=oD1.getcontrol("name").text

'initMaske
end sub
[/quote]

Danke,

Sascha

von Toxitom » So, 19.03.2006 10:40

Hey,

ich klink mich hier mal ein....

Also, mir fehlen ein paar Daten. Welche Version OOo? Was genau willst du reinschreiben? Beispiel?
oT1.getCellRangeByName(sBereich).value=oD1.getcontrol("name").text
Das wird immer dann nicht funktionieren, wenn ihr Version 2.0 oder höher benutzt. Ihr könnt einem "value" keinen "text" (String) zuweisen. Das hat zwar unter 1.x funktioniert, ist aber eigentlich falsch. Also, wenn Controll "name" tatsächlich Ziffern stehen sollten, dann wandelt die erst in Zahlen um, ansonsten geht die Eigenschaft "Value" nicht.

Im Übrigen sollte auch der ursprüngliche Ansatz mit dem "&" funktionieren, ich denke, der Fehler liegt woanderxs (s.o.).
Also, bitte ein konkretes Beispiel.

Gruss
Thomas

von sascha11 » Fr, 17.03.2006 11:08

hey,

bekomme das damit leider nicht hin, er soll ja immer einen Wert in die nächst höhere Zeile schreiben, mit dem Code geht das nicht... (er muss sich diese dann merken, damit ich mit dieser weiterarbeiten kann)

[code]
sBereich = "Liste.B" & nNeuDatSatz oT1.getCellRangeByName(sBereich).value=oD1.getcontrol("name").text
[/code]

wie kann ich also jetzt die Zeile, die in nNeuDatSatz steht, ansprechen und wieso geht das so nicht?

danke,

Sascha

von euroandi » Di, 14.03.2006 14:49

Hallo Sascha

in meiner Tabelle ist in Zelle C1 diese Formel =B1+1
das Ergebniss wird in B1 geschrieben.

Probiers doch einfach in einer neuen Datei aus.



sub z
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 = "$C$1"

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

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

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

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

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

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


end sub

kannst du mir den Code dazu geben?

von sascha11 » Di, 14.03.2006 13:59

hey,

danke für die Antwort- leider habe ich ein ziemlich komplexes Makro, mit mehreren Untermakros erstellt und wenn ich jetzt ein Makro erstelle, dann muss ich das ja irgendwie dahin integrieren, deshalb wäre es gut, wenn du mir den Quellcode posten würdest!

danke,

Sascha

von euroandi » Di, 14.03.2006 13:31

Hallo Sascha,
Ich mach das ganz einfach, ich nehme eine andere Zelle und schreibe in diese die Formel z.b. =B1+1 . Dann zeichne ich das Macro auf, in dem ich die Zelle mit der Formel kopiere und dann in die Zelle (B1) Inhalte einfügen nur (Zahlen) einfüge.
In der Formel wird nur der Wert der ersten Zelle um 1 erhöt.

Gruß Andi

wie geht das?

von sascha11 » Di, 14.03.2006 13:18

hey,

danke für deine schnelle Antwort. Nur: wie mache ich das, kannst du mir ein Beispiel zeigen, wie ich denn nun eine einzelne Zelle ansteuere?

danke,

Sascha

von Eckhardt » Di, 14.03.2006 13:12

Hallo sascha11,
mit dem Codebeispiel kannst Du natürlich keine Zellen füllen, da Du ein Bereichsobjekt ausgewählt hast.
Um Wert in eine Zelle zu schreiben, musst Du jede einzelne Zelle des Bereichs auswählen und dann den Wert in die jeweilige Zelle schreiben.

danke für die Antwort

von sascha11 » Di, 14.03.2006 13:10

hey,

danke für die Antwort, leider kommt nun die Meldung "Runtime Exception", Message: .
was passt nicht?

danke,

Sascha

von Eckhardt » Di, 14.03.2006 13:04

Hallo sascha11,
so geht das auch nicht. Du musst den Bereichsnamen erst einer Stringvariablen zuweisen und diese dann weiterverwenden.

sBereich = "Liste.B" & nNeuDatSatz
oT1.getCellRangeByName(sBereich).value=oD1.getcontrol("name").text

Nach oben