CALC: Blattschutz setzen / aufheben

Programmierung unter OOo

Moderator: Moderatoren

CALC: Blattschutz setzen / aufheben

Beitragvon Pushkin-Sun » Do, 23.02.2012 10:51

Hallo,

ich habe mir ein Makro aufgezeichnet, bei dem das Makro den Blattschutz aufhebt, die Daten dann sortiert und dann wieder das Blatt schützt.
Jetzt will ich aber nichts jedesmal das Passwort zum aufheben und schützen des Blattes selbst eingeben, sondern ich will, dass das Makro das alles automatisch macht.
Wie geht das?
Danke für Eure Hilfe, ich kenne mich damit echt nicht aus...
Hier unten der Code meines aufgezeichneten Makros!

Code: Alles auswählen
REM  *****  BASIC  *****


sub Test
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 = "Protect"
args1(0).Value = false

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

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Protect"
args2(0).Value = false

dispatcher.executeDispatch(document, ".uno:Protect", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(10) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ByRows"
args3(0).Value = true
args3(1).Name = "HasHeader"
args3(1).Value = true
args3(2).Name = "CaseSensitive"
args3(2).Value = false
args3(3).Name = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = 1
args3(6).Name = "Ascending1"
args3(6).Value = true
args3(7).Name = "Col2"
args3(7).Value = 2
args3(8).Name = "Ascending2"
args3(8).Value = true
args3(9).Name = "Col3"
args3(9).Value = 3
args3(10).Name = "Ascending3"
args3(10).Value = true

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

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Protect"
args4(0).Value = true

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


end sub



Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst; CODE tags gesetzt
Pushkin-Sun
 

Re: CALC: Blattschutz setzen / aufheben

Beitragvon Frieder D. » Do, 23.02.2012 13:27

Hallo Pushkin-Sun

Mit dem Folgenden Code kannst du das erreichen.
Code: Alles auswählen
sub Test
dim oSheet as Object
Dim sPasswort as String
'die Aktive Tabelle
oSheet= ThisComponent.CurrentController.ActiveSheet
'oSheet= ThisComponent.Sheets.GetByName("Tabelle1") 'oder dit Tabelle mir Namme: "Tabelle1"
'oSheet= ThisComponent.Sheets.GetByIndex(0) 'Oder Die erste Tabelle
sPasswort="Geheim"
'Schutz aufheben
oSheet.unprotect(sPasswort)
MsgBox "Schutz ist jetzt aufgehoben."
'Tabelle Schützen
  oSheet.protect(sPasswort)
  'Rückgängigmachen Verlauf Löschen,
  'damit man den Schutz nicht per Rückgängigmachen aufheben kann.
  ThisComponent.IsUndoEnabled =False 'Rückgängigmachen ausschalten
  ThisComponent.IsUndoEnabled =true  'Rückgängigmachen einschalten
MsgBox "Tabelle wurde geschützt"
end sub


Gruß Frieder
Frieder D.
****
 
Beiträge: 115
Registriert: Di, 10.01.2012 10:51

Re: CALC: Blattschutz setzen / aufheben

Beitragvon Frieder D. » Do, 23.02.2012 14:06

Hallo,

ich habe dir mahl den gesamten Code in die API übersetzt.

di musst nur noch das Passwort, den Tabellennahme, den Zellbereich, und die Sortier-Eigenschaften anpassen.

Code: Alles auswählen
REM  *****  BASIC  *****

sub Start
dim oSheet as Object
dim oCellRange as object
Dim sPasswort as String
  sPasswort="Geheim" 'Bitte anpassen

'Zugtiff auf die Tabelle
  oSheet= ThisComponent.Sheets.GetByName("Tabelle1")
'Schutz aufheben
  oSheet.unprotect(sPasswort)
'Der Bereich A2:Gx (x = Letzte benutzte Zeile auf der Tabelle)
  oCellRange = oSheet.getCellRangeByPosition(0,1,6,GetLastUsedRow(oSheet))
 
'alternativ kann der Zellbereich auch so festgelegt werden:
  'oCellRange = oSheet.getCellRangeByName("A2:G55")
 
'Sortieren (Aufruf des Subs "SortRange" und übergabe der Variable "oCellRange")
  SortRange ( oCellRange)
'Tabelle Schützen
  oSheet.protect(sPasswort)
'Rückgängigmachen Verlauf Löschen,
'damit man den Schutz nicht per Rückgängigmachen aufheben kann.
  ThisComponent.IsUndoEnabled =False 'Rückgängigmachen ausschalten
  ThisComponent.IsUndoEnabled =true  'Rückgängigmachen einschalten
end sub
'---------------------------------------
'Das sortiermakro:
Sub SortRange (ByVal oCellRange As Object)

    Dim SortFeld(2) As new com.sun.star.table.TableSortField
    Dim SortProps(2) As new com.sun.star.beans.PropertyValue
'hier können die Sortiereigenschaften festgelegt werden.
    SortFeld(0).Field = 1 ' Spaltennummer - Zaehlung beginnt mit Null
    SortFeld(0).IsAscending = True 'True= Aufsteigend
    SortFeld(0).IsCaseSensitive=True 'True =Groß und Kleinschreibung beachten
    SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
    SortFeld(1).Field = 2 'Spalte 3
    SortFeld(1).IsAscending = False 'False = Absteigend
    SortFeld(1).IsCaseSensitive=False 'false =Groß und Kleinschreibung nicht beachten
    SortFeld(1).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
    SortFeld(2).Field = 3 'Spalte 4
    SortFeld(2).IsAscending = True 'True= Aufsteigend
    SortFeld(2).IsCaseSensitive=False
    SortFeld(2).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
   
    SortProps(0).Name = "SortFields"
    SortProps(0).Value = SortFeld()
    SortProps(1).Name = "SortColumns"
    SortProps(1).Value = False 'False = Zeilen werden Sortiert.
    SortProps(2).Name = "ContainsHeader"
    SortProps(2).Value = True ' 1. Zeile wird nicht mitsortiert.
     
    oCellRange.Sort(SortProps())
End Sub
'---------------------------------------------

'die letzte benutzte Zeile ermitteln.
Function GetLastUsedRow(oSheet as Object) As Integer
    Dim oCell
    Dim oCursor
    Dim aAddress
   
    oCell = oSheet.getCellByPosition(0, 0)
    oCursor = oSheet.createCursorByRange(oCell)
   
    oCursor.gotoEndOfUsedArea(True)
    aAddress = oCursor.RangeAddress
    GetLastUsedRow = aAddress.EndRow
End Function


Gruß Frieder
Frieder D.
****
 
Beiträge: 115
Registriert: Di, 10.01.2012 10:51


Zurück zu OOo Basic und Java

Wer ist online?

Mitglieder in diesem Forum: Yahoo [Bot] und 3 Gäste