Zeile in geschützes Calc-Dokument einfügen

Guten Tag,
um folgendes Calc-Dokument handelt es sich:
http://www.bilder-hochladen.net/files/cavc-1-jpg.html
ich möchte gerne dem Benutzer eines geschützen Arbeitsblatts die Möglichkeit geben eine neue Zeile einzufügen und in dieser auch zu schreiben.

Ein Makro zum einfügen einer Zeile habe ich schon geschrieben. Wenn das Dokument nicht schreibgeschützt ist, funktioniert dies auch.

Sobald ich allerdings das Dokument schütze kann ich keine Zeile mehr hinzufügen. Auch in den Zeilen die ich dem Benutzer freigegeben habe funktioniert dies nicht.

Mein Wunsch wäre es, dass der Benutzer eine der blau markierten Projektphasen markiert, den Button „neue Zeile einfügen“ auswählt und im untersten Feld der markierten Projektphase eine neue Zeile erscheint. Die soll dann ungeschützt sein.
In diesem Beispiel: Benutzer markiert A3, klickt auf „neue Zeile hinzufügen“ und unter der Zeile 10 wird eine neue, ungeschützte Zeile hinzugefügt.

Vielen Dank im Vorraus.

http://www.bilder-hochladen.net/files/cavc-1-jpg.html
ich möchte gerne dem Benutzer eines geschützen Arbeitsblatts
die Möglichkeit geben eine neue Zeile einzufügen und in dieser
auch zu schreiben.

Ein Makro zum einfügen einer Zeile habe ich schon geschrieben.
Wenn das Dokument nicht schreibgeschützt ist, funktioniert
dies auch.

Hallo Timinda,

zeige mal deinen Code.

Gruß
Reinhard, wenig Ahnung von OO

Hallo Timinda,

zeige mal deinen Code.

Gruß
Reinhard, wenig Ahnung von OO

Guten Morgen Reinhard,

folgend das Skript:
sub Zeile_hinzufuegen
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, „.uno:InsertRows“, „“, 0, Array())

end sub

Viele Grüße
Tim

Hallo Tim,

sorry, ich gebe da auf. Nachfolgendes makro macht schon etwas in richtiger Richtung.
Es fügt eine ungesperrte Zeile ein.
Störend ist da noch daß man da noch zum Schluß auf Ok drücken muß.
Und es fügt an der aktuellen Zellposition ein.

sub Main
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService(„com.sun.star.frame.DispatchHelper“)
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = „Protect“
args1(0).Value = false
dispatcher.executeDispatch(document, „.uno:stuck_out_tongue:rotect“, „“, 0, args1())
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = „Flags“
args2(0).Value = „R“
dispatcher.executeDispatch(document, „.uno:InsertCell“, „“, 0, args2())
dim args3(3) as new com.sun.star.beans.PropertyValue
args3(0).Name = „Protection.Locked“
args3(0).Value = false
args3(1).Name = „Protection.FormulasHidden“
args3(1).Value = false
args3(2).Name = „Protection.Hidden“
args3(2).Value = false
args3(3).Name = „Protection.HiddenInPrintout“
args3(3).Value = false
dispatcher.executeDispatch(document, „.uno:stuck_out_tongue:rotection“, „“, 0, args3())
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = „Protect“
args4(0).Value = true
dispatcher.executeDispatch(document, „.uno:stuck_out_tongue:rotect“, „“, 0, args4())
end sub

Gruß
Reinhard

Vielen Dank schonmal.
Ich war in der Zwischenzeit auch nicht untätig :wink:

Habe auch ne Lösung gefunden:
sub Zeile_hinzufuegen
DIM oDoc as Object, oSheet as Object
Dim oZelle as Object
oDoc = ThisComponent
oSheet = oDoc.sheets(0)
oSheet.unprotect(„test“)

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

dispatcher.executeDispatch(document, „.uno:InsertRows“, „“, 0, Array())

oDoc = ThisComponent
oSheet = oDoc.sheets(0)
oSheet.protect(„test“)

end sub

Werde das schreiben duch Dialogboxen machen. Des ist dann angenehmer und leichter :wink:

Trotzdem vielen Dank für deine Mühe

Hallo zusammen,

wie in dem vorherigen Beitrag beschreiben, habe ich es mit einem dialogfeld gemacht.
Folgendes Makro habe ich geschrieben:
Dim oD1 as Object 'Dialog 1 (Eingabemaske) definieren
Dim myDoc as Object 'Dokumnet definieren
Dim oT1 as Object, oT2 as Object 'Tabelle „Liste“ und „Daten“ definieren
Dim nNeueDatSatz as integer 'Neue DatensatzZeilennummer
Dim nLastKm as integer
Dim dZeitCh as date 'Zeitspanne bei Änderung
Dim dZeitAnk as date 'Differenz bei automatischer Ankunftszeit

'------------------------------------

'--------------------------------------

Sub main
myDoc=ThisComponent
oT1=myDoc.sheets(0)
oT2=myDoc.sheets(1)
'— Maske initialisieren
DialogLibraries.LoadLibrary( „Standard“ )
oD1 = CreateUnoDialog( DialogLibraries.Standard.Maske )
initMaske
oD1.Execute()
end sub

'Button Abbrechen
Sub Abbrechen
oD1.EndExecute()
end sub

Sub initMaske
'— Neue Zeilennummer erzeugen
nNeueDatSatz = oT2.getCellRangeByName(„b1“).value + 5
'— Neue Datensatznummer eintragen
oD1.getcontrol(„DatSatzNr“).text= nNeueDatSatz - 4
'—Auswahllisten mit Daten füllen
FuellListe(„verant“, „a“, 10, 7) 'Fuellliste(„Liste“, Spalte, Zeile, Anzahl Elemente))
'—Eingabefelder Inhalte löschen
oD1.getcontrol(„verant“).text= „“
oD1.getcontrol(„txt_name“).text= „“
oD1.getcontrol(„txt_aktiv“).text= „“
oD1.getcontrol(„DateField1“).text= „“
oD1.getcontrol(„DateField2“).text= „“
End Sub

'-----Auswahllisten füllen
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

'------Datenbank Bereich neu festlegen—
Sub DatenBereich
Dim aPos1 as New com.sun.star.table.CellAddress
oBereich=ThisComponent.NamedRanges
oBereich.removebyname(„Datenbank“)
oBereich.addNewbyName(„Datenbank“, „$Liste.$A$4:blush:M$“& nNeueDatSatz, aPos1, 0)
end Sub

'------Speicheradresse bestimmen
function dat_adr(sp)
zeile = nNeueDatSatz
dat_adr="$" & sp &"$" & zeile
end function

'------Button Satz hinzufügen-----
'------zunächst Fehlerkontrolle—
sub AddSatz
oDoc = ThisComponent
oSheet = oDoc.sheets(0)
oSheet.unprotect(„test“)

if oD1.getControl(„txt_aktiv“).text="" then
msgbox „Bitte eine Beschreibung der Aktivität eingeben“
oD1.getcontrol(„txt_aktiv“).setFocus()
elseif oD1.getControl(„verant“).text="" then
msgbox „Es muss ein Verantwortlicher benannt werden!“
oD1.getcontrol(„verant“).setFocus()
elseif oD1.getControl(„DateField1“).date=0 then
msgbox „Bitte Starttermin festlegen“
oD1.getcontrol(„DateField1“).setFocus()
elseif oD1.getControl(„DateField2“).date=0 then
msgbox „Endtermin muss angegeben werden“
oD1.getcontrol(„DateField2“).setFocus()
else
SatzSpeichern
end if
end sub

'-----Datensatz in die Datenbank eintragen
sub SatzSpeichern
’ Datum Endtermin
Dim fd2
fd2 = oD1.getControl(„DateField2“).date
ad=dat_adr(„f“)
oT1.getCellRangeByName(ad).value=CDateFromIso(fd2)
’ Verantwortlich
abfo = oD1.getControl(„verant“).text
ad=dat_adr(„d“)
oT1.getCellRangeByName(ad).string=abfo
’ Aktivität
anko = oD1.getControl(„txt_aktiv“).text
ad=dat_adr(„c“)
oT1.getCellRangeByName(ad).string=anko
’ Arbeitspaketbezeichnung
gru = oD1.getControl(„txt_name“).text
ad=dat_adr(„a“)
oT1.getCellRangeByName(ad).string=gru
’ Datensatz Nummer
ad=dat_adr(„b“)
oT1.getCellRangeByName(ad).value=nNeueDatSatz - 4
’ Stauts
ad=dat_adr(„g“)
oT1.getCellRangeByName(ad).string=„offen“
’ Datum Starttermin
Dim fd1
fd1 = oD1.getControl(„DateField1“).date
ad=dat_adr(„e“)
oT1.getCellRangeByName(ad).value=CDateFromIso(fd1)
’ Datensatznummer um 1 erhöhen
nDatNr= oT2.getCellRangeByName(„b1“).value + 1
oT2.getCellRangeByName(„b1“).value=nDatNr
DatenBereich ’ Datenbankbereich wird neu benannt
myDoc.store() ’ Datei wird gesichert
initMaske ’ Eingabemaske wird neu initialisiert
oDoc = ThisComponent
oSheet = oDoc.sheets(0)
oSheet.protect(„test“)
end sub

Bei interesse kann ich die Datei auch mal zur verfügung stellen :wink:

Grüße
Tim