excel - tag - meta title beispiel



Wie vermeide ich Laufzeitfehler, wenn ein Arbeitsblatt in MS-Excel geschützt ist? (2)

Ich bin mir nicht sicher, ob das eine universelle Lösung ist, aber als ich diesen Fehler kürzlich hatte, musste ich einfach ein MywkSheet.Activate machen, bevor ich die Validation.Add gemacht habe. Damit:

' set list values based on some conditions not defined for brevitity'
If myCondition then
   myNamedRange = "range1"
Else
   myNamedRange = "range2"
End If

''--------------------------------------------------
Sheets("mysheet").Activate
''--------------------------------------------------

With modifyCell.Validation
   .Delete

   'Run time error occurs on the next line'
   .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _
        Operator:=xlBetween, Formula1:="=" & myNamedRange

   ... 
   ' skipping more property setting code '
   ...
End With

In meinem Fall war ScreenUpdating bereits ausgeschaltet, so dass der Benutzer die Blätter nie hin- und herwechseln sieht. HTH.

https://ffff65535.com

Das folgende Codefragment ändert den Datenüberprüfungsstatus einer Zelle und wird ausgeführt, wenn das Excel-2003-Arbeitsblatt nicht geschützt ist. Wenn ich das Arbeitsblatt schützen, wird das Makro jedoch nicht ausgeführt und verursacht einen Laufzeitfehler

Laufzeitfehler '-2147417848 (80010108)':

Methode 'Hinzufügen' des Objekts 'Validierung' ist fehlgeschlagen

Ich habe versucht, den Code mit zu verpacken

Me.unprotect
...
Me.protect

Aber das funktioniert nicht richtig. Also, wie kann ich den Code unten ändern, um zu arbeiten (dh der Code die Freigabe der freigeschalteten Zelle ändern), wenn das Blatt ohne den oben genannten Laufzeitfehler geschützt ist?

Aktualisieren

Mein ursprüngliches Arbeitsbuch ist eine Excel 2003. Ich testete @ eJames Lösung in Excel 2007 mit der folgenden Definition für Workbook_Open

Sub WorkBook_Open()
    Me.Worksheets("MainTable").Protect  contents:=True, userinterfaceonly:=True 
End Sub

Der Code schlägt immer noch mit dem folgenden Laufzeitfehler fehl, wenn das Arbeitsblatt geschützt ist

Laufzeitfehler '1004': Anwendungsdefinierter oder objektdefinierter Fehler

Danke, Azim

Code-Auszug

'cell to add drop down validation list'
dim myNamedRange as String
dim modifyCell as Range 
modifyCell = ActiveCell.Offset(0,1) 


' set list values based on some conditions not defined for brevitity'
If myCondition then
   myNamedRange = "range1"
Else
   myNamedRange = "range2"
End If

With modifyCell.Validation
   .Delete

   'Run time error occurs on the next line'
   .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _
        Operator:=xlBetween, Formula1:="=" & myNamedRange

   ... 
   ' skipping more property setting code '
   ...
End With

Wenn ich die Frage richtig verstehe, wirst du derjenige sein, der das Blatt schützt. Wenn dies der Fall ist, können Sie den folgenden VBA verwenden:

myWorksheet.Protect contents:=True, userinterfaceonly:=True

Der Schlüssel ist hier "userinterfaceonly: = true". Wenn ein Arbeitsblatt mit diesem gesetzten Flag geschützt wird, können VBA-Makros weiterhin Änderungen vornehmen.

WorkBook_Activate diesen Code in das WorkBook_Activate Ereignis ein, um die Arbeitsmappe automatisch zu schützen, und legen Sie das Flag fest, wenn es aktiviert wird.

Bearbeiten: Danke an Lance Roberts für seine Empfehlung, Workbook_Activate anstelle von Workbook_Open .

Bearbeiten: Da das oben genannte nicht zu funktionieren scheint, müssen Sie möglicherweise den fehlgeschlagenen Teil Ihres VBA-Codes mit Schutz- / Schutzbefehlen umbrechen. Wenn Sie das tun, würde ich auch den gesamten Makro mit einem Fehlerhandler umbrechen, damit das Blatt nach einem Fehler nicht ungeschützt bleibt:

Sub MyMacro
    On Error Goto HandleError

    ...

    myWorksheet.unprotect
    With ModifyCell.Validation
        ...
    End With
    myWorksheet.protect contents:=True, userinterfaceonly:=True

    ...

Goto SkipErrorHandler
HandleError:
    myWorksheet.protect contents:=True, userinterfaceonly:=True
    ... some code to present the error message to the user
SkipErrorHandler:
End Sub

Bearbeiten: Sehen Sie sich diesen Thread bei PCreview an. Sie durchliefen die gleichen Schritte und kamen zu demselben Ergebnis. Wenigstens bist du nicht allein!





excel-vba