Was mache ich falsch ?

Legiat

Grünschnabel
Hallo zusammen,

vorweg erwähnt, ich bin absoluter VB-Anfänger.
Ich hab mir mit ein bischen Sucharbeit ein kleines Script zusammengestellt, welches beim öffnen einer Excel-Datei starten soll.
Sinn ist es, zu prüfen, ob noch immer alle Blätter per Paßwort geschützt sind. Dazu soll im ersten Blatt beginnend bei A1 bis A? für jedes geschützte Batt eine 1 und für nicht geschützte eine 0 eingetragen werden.

Hier der Code:
Code:
Private Sub Workbook_Open()
Dim zeile As Double
zeile  =  1
For i = 1 to Sheets.Count
    If Sheets(i).ProtectContents Or Sheets(i).ProtectDrawingObjects Or Sheets(i).ProtectScenarios Then
     Sheets(1).Unprotect
     Sheets(1).Cells(zeile, 1).Value = 1
     Sheets(1).Protect
    Else
     Sheets(1).Cells(zeile, 1).Value = 0
    End If
    zeile  =  zeile  +  1
    Next i
End Sub

Wenn ich die Datei öffne, erhalte ich die Fehlermeldung "Fehler beim kompilieren - Sub oder Function nicht definiert".

Ich hab bereits das Private nach Public geändert. Das hatte jedoch keinen Erfolg.

Bitte helft mir. Kann mir einer sagen, was ich falsch mache?

Gruß Legiat
 
Hi - laut Fehlermeldung benutzt du irgendwelche Funktionen oder Subs die nicht bekannt sind.

Ich denke mal da kommen nur folgende in Frage:
  • Sheets(i).ProtectContents
  • Sheets(i).ProtectDrawingObjects
  • Sheets(i).ProtectScenarios
  • Sheets(1).Unprotect
  • Sheets(1).Protect

Hast du das Script kopiert oder selbst geschrieben?

lg
 
Zuletzt bearbeitet:
Warum du den Fehler bekommst weiss ich nicht, da du die Zeile nicht angibst, wo der Fehler auftaucht, aber wieso verwendest du die Variable "Zeile" wenn du sowieso "i" als Laufvariable hast?

Sheets(1).Cells(i,1).Value=blabla
reicht vollkommen aus.

BTW: Lauf/Zählvariablen würde ich nie als Double deklarieren, immer nur als Integer oder Long
 
EDIT: Beim kopieren der Namen ist mir gerade aufgefallen das du ab und zu statt Sheets(i) -> Sheets(1) benutzt.
Eventuell solltest mal alles in i ändern ;)

lg

Sheets(1) ist aber richtig, da er ja nur auf dem ersten Blatt die Zustände aller Blätter in der Mappe eintragen will.

EDIT: Ich kanns mir nie merken, aber ich glaube es gibt einen Unterschied zwischen Sheets und Worksheets (kann mich aber auch irren). Die eine Variante nimmt nur einen Index an (Worksheets(1), Worksheets(i) usw.), während die andere Variante konkrete Namen der Tabellenblätter annimmt (Sheets("Tabelle1") usw.).

Versuch mal das Sheets durch Worksheets zu ersetzen
 
Wow, ihr seid aber schnell. Kompliment

Ich habe das kopiert und aus mehreren Scripts zusammen gebaselt. (siehe http://www.excel-inside.de/ aus den Bereich --Sheets)
Sheets : In Zelle A1 kennzeichnen ob Blatt geschützt ist oder nicht
Sheets : Inhaltsverzeichnis aller Tabellenblätter einfügen

Den Tip, daß ich zeile nicht brauche hab ich so aufgenommen und alle zeile-Einträge durch "i" ersetzt.

Ich will allerdings nicht den Blattnamen sondern nur einfach eine 1 oder 0 da stehen haben. Die Querrsumme der 1en und 0en entscheidet dann, ob die ca. 5000 Formeln in der Datei korrekt funtionieren oder nicht.

Gruß Legiat

Nachtrag : Sorry ... 1.te zeile ist gelb
2.te zeile ist blau
und dann noch die Messagebox mit der Meldung
 
Zuletzt bearbeitet:
Sheets(1) ist aber richtig, da er ja nur auf dem ersten Blatt die Zustände aller Blätter in der Mappe eintragen will.

Junge junge bist du schnell :D Ich habs ungefährt 30Sek nach dem abschicken gemerkt und wieder raus genommen. ;)

Bin gerade ein wenig Ratlos - sonst sehe ich auch keinen Fehler.

lg
 
Das liegt daran, das ich in einem Parkhaus in München arbeite und uns zur Arbeitserleichterung ein paar Dateien gemacht hab. (komplizierte Arbeitszeiterfassung und -berechnung, Einfahrts- Ausfahrts- und Umsatzberechnungen, Kassenbücher, ect.)
Jedoch alles ohne VB und nur in der Freizeit.
Nun möchte unser Chef das Zeug für andere Häuser bereitstellen und wenn's funktioniert (die anderen auch damit umgehen können) weiter verbreiten.
Ich will lediglich meine Arbeit schützen, damit keiner dran rumschraubt oder manipuliert.

Gruß Legiat
 
Hallo, ich bin's nochmal.
Ich bedanke mich bei den Könnern, die so schnell zu hilfe geeilt sind. Die Beiträge hatten alle brauchbare Hinweise, durch die ich auf den richtigen Weg gebracht wurde.

Natürlich will ich euch das Ergebnis nicht vorenthalten. Es kamen dabei 2 Scripte raus.
Das erste :
Das PW (pwd1) "hurz" muß im script verankert sein, sonst kommt der Laufzeitfehler 1007 dabei raus. Es ist frei wählbar und stellt das PW für das erste Blatt dar. In diesem Blatt werden nun beim öffnen der Datei in Spalte "A" die Blattnamen und in Spalte "B" eine 1 oder eine 0 platziert. Dieses Blatt blende ich ebenfalls aus.
Das tatsächliche Passwort aller anderen Blätter steht in meinem Fall in einem ausgeblendetem, geschützten Blatt namens "Daten" und wird im Feld "C3" ausgelesen und in "pwd" abgelegt.

Code:
Private Sub Workbook_Open()

pwd1 = "hurz"
pwd = Sheets("Daten").Range("C1").Value
Sheets(1).Unprotect (pwd1)

Dim blatt As Object
Dim zeile As Integer
zeile = 1
i = 1
For Each blatt In Sheets
    Sheets(1).Cells(zeile, 1).Value = blatt.Name
    If Sheets(i).ProtectContents Or Sheets(i).ProtectDrawingObjects Or Sheets(i).ProtectScenarios Then
        Sheets(1).Cells(zeile, 2).Value = 1
    Else
        'Wenn das Blatt nicht geschützt ist, so steht in der Zelle eine NULL
        Sheets(1).Cells(zeile, 2).Value = 0
    End If
    i = i + 1
    zeile = zeile + 1
Next blatt
Sheets(1).Protect Password:=pwd1, Contents:=True, UserInterfaceOnly:=True
Sheets(1).EnableOutlining = True
End Sub

Nun kann es jedoch passieren, das einer ein Passwort knackt oder ein PW-Script benutzt. Sobald er dann auf ein ungeschütztes Blatt wechselt muß das erkannt werden und wiederum im ersten (versteckten) Blatt zur Folge haben, das anstelle der 1 eine 0 eingetragen wird. Deshalb habe ich für jedes einzelne Blatt folgendes script gemacht

Code:
Private Sub Worksheet_Activate()
    
    'Wenn Blatt geschützt ist, wird die Zelle A1 rot eingefärbt
    pwd1 = "hurz"
If ActiveSheet.ProtectContents Or ActiveSheet.ProtectDrawingObjects Or ActiveSheet.ProtectScenarios Then
       pwd1 = "hurz"
    Else
    'Wenn das Blatt nicht geschützt ist, so wird die Zelle grün gefärbt
       Sheets(1).Unprotect (pwd1)
       Sheets(1).Cells(2, 2).Value = 0
       Sheets(1).Protect Password:=pwd1, Contents:=True, UserInterfaceOnly:=True
       Sheets(1).EnableOutlining = True

End If

End Sub

Bei den einzelnen Scripts muß die erste Zahl nach dem "Cells(" geändert werden. (1 für Blatt 1; 2 für Blatt 2; usw)
Sheets(1).Cells(2, 2).Value = 0

Sobald sich also die Quersumme der zahlen ändert, funktionieren in meinem Fall einfach die Formeln nicht mehr korrekt. Damit fällt der Eingriff auf. Das bleibt aber jedem für sich überlasse, was er dann macht.
Wenn jemand evtl. Verbesserungvorschläge hat, nehme ich diese dankbar auf.

Heißen Dank nochmal
Gruß Legiat
 
Zurück