VBA Blattschutz

Bild

Betrifft: VBA Blattschutz
von: Matthias
Geschrieben am: 09.11.2015 11:36:32

Hallo,
ich habe folgendes Problem und zwar habe ich in meinem Blatt folgendes makro:

Public Function TakeComment(rngQuelle As Range, Optional rngZiel As Range)
    If rngZiel Is Nothing Then
        Set rngZiel = Application.Caller
    End If
    With rngZiel
        If Not .Comment Is Nothing Then
            .Comment.Delete
        End If
        .AddComment rngQuelle(1, 1).Text
    End With
End Function
das Funktioniert auch sehr gut, solange es keinen Blattschutz gibt.
Wie bekomme ich den Blattschutz nun aufgehoben, das Makro ausgeführt und danach den Blattschutz wieder gesetzt.
Das ganze soll automatisch ausgeführt werden.
Hoffe mir kann jemand helfen.
LG

Bild

Betrifft: AW: VBA Blattschutz
von: Bernd
Geschrieben am: 09.11.2015 11:39:06
Hie,
mit:
ActiveSheet.Unprotect Password:="Dein Passwort"
ActiveSheet.Protect Password:="Dein Passwort"
mfg Bernd

Bild

Betrifft: AW: VBA Blattschutz
von: Matthias
Geschrieben am: 09.11.2015 11:40:54
Ja, das hab ich schon rausgefunden, allerdings meckert er bei mir, wegen Sub.
Wie müsste mien Kompletter Code den ausehen, ich probiere schon seit stunden.

Bild

Betrifft: AW: VBA Blattschutz
von: Martin
Geschrieben am: 09.11.2015 11:50:53
Ich kenn mich mit VBA auch nicht wirklich aus aber sowas hab ich schon mal gebraucht. Versuch mal:

Public Function TakeComment(rngQuelle As Range, Optional rngZiel As Range)
      ActiveSheet.Unprotect Password:="Dein Passwort"
          If rngZiel Is Nothing Then
          Set rngZiel = Application.Caller
      End If
      With rngZiel
          If Not .Comment Is Nothing Then
              .Comment.Delete
          End If
          .AddComment rngQuelle(1, 1).Text
      End With
      ActiveSheet.Protect Password:="Dein Passwort"
  End Function
Falls das nicht geht muss jemand anderes helfen...

Bild

Betrifft: AW: VBA Blattschutz
von: Matthias
Geschrieben am: 09.11.2015 11:56:42
leider nicht, ich verzweifel noch.

Bild

Betrifft: AW: VBA Blattschutz
von: MatthiasG
Geschrieben am: 09.11.2015 12:55:45
Hallo Matthias,
das Problem ist, dass deine Funktion TakeComment() offenbar in einer Zelle als Formel steht und durch Änderung eines Zellbezuges aufgerufen wird.
Ich kenne die Details nicht, aber innerhalb einer Funktion (wenn sie von einer Formel in einer Excel-Zelle aufgerufen wird) kann man keine anderen Zellen manipulieren und offenbar auch den Blattschutz-Status nicht ändern.
Mich wundert es da schon, dass man immerhin den Zellkommentar ändern kann.
siehe z.B. auch hier:
http://www.office-loesung.de/ftopic202630_0_0_asc.php
Du müsstest dann also mit dem Change- oder Calculate-Ereignis arbeiten.
Gruß Matthias

Bild

Betrifft: AW: VBA Blattschutz
von: Matthias
Geschrieben am: 09.11.2015 13:00:27
Im Grunde funktioniert ja alles, es muss nur folgendes noch Passieren,
Es muss automatisch der Blattschutz aufgehoben werden, dann mein Makro ausgeführt werden und danach automatisch das blatt wieder geschützt werden.
Ich bekomme hin, das der Blattschutz aufgehoben wird, das Makro ausgeführt wird, bekomme das Blatt aber nicht wieder automatisch geschützt. Mein Derzeitiger Code sieht so aus :
Sub Auto_Open()

Call aufheben

End Sub Sub aufheben()
ActiveSheet.Unprotect 123456
End Sub

Public Function TakeComment(rngQuelle As Range, Optional rngZiel As Range)
    If rngZiel Is Nothing Then
        Set rngZiel = Application.Caller
    End If
    With rngZiel
        If Not .Comment Is Nothing Then
            .Comment.Delete
            
        End If
        .AddComment rngQuelle(1, 1).Text
        
    End With
    
End Function

Sub schutz()
ActiveSheet.Protect 123456
End Sub

Bild

Betrifft: AW: VBA Blattschutz
von: MatthiasG
Geschrieben am: 09.11.2015 13:05:24
Hallo,
heißt das, die Funktion steht nicht in einer Formel und wird nur einmalig beim Öffnen der Mappe aufgerufen?
Gruß Matthias

Bild

Betrifft: AW: VBA Blattschutz
von: Matthias
Geschrieben am: 09.11.2015 13:07:03
Ja genau,
Aufgerufen wird es mit
=TakeComment(A1;C1)
Allerdings nur beim 1 starten von Excel, veränderungen werden erst nach neustart übernommen, ist auch ok so, das funktioniert aber nur bei nicht geschütztem Arbeitsblatt.

Bild

Betrifft: AW: VBA Blattschutz
von: MatthiasG
Geschrieben am: 09.11.2015 13:32:23
Hallo,
also steht's doch in einer Formel.
Wenn die Berechnung sowieso nur einmal beim Öffnen durchgeführt werden soll, dann versuch' mal folgendes:


Sub Auto_Open()
Call aufheben
'Alles neu berechnen:
Application.CalculateFull
'warten, bis alles berechnet ist:
Do
    DoEvents
Loop Until Application.CalculationState = xlDone
Call schutz
End Sub
Public Function TakeComment(rngQuelle As Range, Optional rngZiel As Range)
     If rngZiel Is Nothing Then
         Set rngZiel = Application.Caller
     End If
     With rngZiel
         If Not .Comment Is Nothing Then
             .Comment.Delete
             
         End If
         .AddComment rngQuelle(1, 1).Text
         
     End With
     
 End Function
Sub aufheben()
ActiveSheet.Unprotect Password:="123456"
End Sub
Sub schutz()
ActiveSheet.Protect Password:="123456", Userinterfaceonly:=True
End Sub

Übrigens ist Auto_Open() nicht mehr üblich, man sollte eigentlich im Modul "DieseArbeitsmappe" das Workbook_Open()-Ereignis verwenden. Das wird nur noch aus Kompatibilitätsgründen unterstützt.
Gruß Matthias

Bild

Betrifft: AW: VBA Blattschutz
von: MatthiasG
Geschrieben am: 09.11.2015 13:35:40
Noch ne Frage:
Was steht eigentlich als Ergebnis in der Zelle mit =TakeComment()?
Da wird ja gar kein Wert zugewiesen.

Bild

Betrifft: AW: VBA Blattschutz
von: Tino
Geschrieben am: 09.11.2015 13:03:01
Hallo,
Evtl. mal so versuchen.

Public Function TakeComment(rngQuelle As Range, Optional rngZiel As Range)
If rngZiel Is Nothing Then
    Set rngZiel = Application.Caller
End If
With rngZiel
    .Parent.Unprotect Password:="Dein Passwort"
    If Not .Comment Is Nothing Then
        .Comment.Delete
    End If
    .AddComment rngQuelle(1, 1).text
    .Parent.Protect Password:="Dein Passwort"
End With
End Function
Von wo wird diese Function aufgerufen?
Wenn die Function aus einer Zelle aufgerufen wird, hast Du schlechte Karten.
Dann würde ich über ein Eventmakro gehen! (Worksheet_Change)
Gruß Tino

 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA Blattschutz"