Seite 1 von 2
zusammenhängende Strings in Makro
Verfasst: Di, 14.03.2006 12:53
von sascha11
hey!
da ich bisher hier sehr gute Antworten bekommen habe, eine weitere Frage,w eil die OOo Makrofunktionen einfach kaum erklärt werden...
wenn jemand einen guten Link hat, bitte posten...
wie kann ich einen zusammenhängenden Strin in OpenOffice bauen, ich möchte einen Wert in eine Zeile schreiben und diese Zeile soll jedesmal um 1 erhöht werden (also der zusammenhängende String ist Liste.B1-> Zahl, die jedesmal erhöht wird). Habe es mit & versucht, geht nicht.
[code]
oT1.getCellRangeByName("Liste.B"&nNeuDatSatz).value=oD1.getcontrol("name").text
[/code]
Danke,
Sascha
Verfasst: Di, 14.03.2006 13:04
von Eckhardt
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
danke für die Antwort
Verfasst: Di, 14.03.2006 13:10
von sascha11
hey,
danke für die Antwort, leider kommt nun die Meldung "Runtime Exception", Message: .
was passt nicht?
danke,
Sascha
Verfasst: Di, 14.03.2006 13:12
von Eckhardt
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.
wie geht das?
Verfasst: Di, 14.03.2006 13:18
von sascha11
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
Verfasst: Di, 14.03.2006 13:31
von euroandi
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
kannst du mir den Code dazu geben?
Verfasst: Di, 14.03.2006 13:59
von sascha11
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
Verfasst: Di, 14.03.2006 14:49
von euroandi
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
Verfasst: Fr, 17.03.2006 11:08
von sascha11
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
Verfasst: So, 19.03.2006 10:40
von Toxitom
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
Verfasst: Mo, 20.03.2006 14:13
von sascha11
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
Verfasst: Mo, 20.03.2006 15:10
von sascha11
achso:
Controll "name" ist ein Eingabefeld, das tatsächlich Ziffern enthält, die Fehlermeldung kommt jedoch schon bei der Compilierung...
Verfasst: Mo, 20.03.2006 18:20
von Toxitom
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
Gruss
Thomas
Verfasst: Di, 21.03.2006 08:23
von sascha11
hey!
vielen dank, dann kann ich weitermachen!
Sascha
noch eine Frage
Verfasst: Di, 21.03.2006 10:41
von sascha11
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!