Proteggere le celle in Excel ma consentire loro di essere modificate dallo script VBA

StackOverflow https://stackoverflow.com/questions/125449

  •  02-07-2019
  •  | 
  •  

Domanda

Sto usando Excel in cui alcuni campi sono consentiti per l'input dell'utente e altre celle devono essere protette. Ho usato il foglio Tools Protect, tuttavia dopo aver fatto questo non sono in grado di modificare i valori nello script VBA. Devo limitare il foglio per interrompere l'input dell'utente, allo stesso tempo consentire al codice VBA di modificare i valori della cella in base a determinati calcoli.

È stato utile?

Soluzione

Prova a usare

Worksheet.Protect "Password", UserInterfaceOnly := True

Se il parametro UserInterfaceOnly è impostato su true, il codice VBA può modificare le celle protette.

Altri suggerimenti

Puoi modificare un foglio tramite codice eseguendo queste azioni

  • Rimuovi protezione
  • Modifica
  • Proteggi

Nel codice questo sarebbe:

Sub UnProtect_Modify_Protect()

  ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

  ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect

End Sub

Il punto debole di questo metodo è che se il codice viene interrotto e la gestione degli errori non lo acquisisce, il foglio di lavoro potrebbe rimanere in uno stato non protetto.

Il codice potrebbe essere migliorato prendendo queste azioni

  • Re-proteggere
  • Modifica

Il codice per farlo sarebbe:

Sub Re-Protect_Modify()

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
 UserInterfaceOnly:=True
'Protect, even if already protected

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

End Sub

Questo codice rinnova la protezione sul foglio di lavoro, ma con "UserInterfaceOnly" impostato su true. Ciò consente al codice VBA di modificare il foglio di lavoro, mantenendo il foglio di lavoro protetto dall'input dell'utente tramite l'interfaccia utente, anche se l'esecuzione viene interrotta.

Questa impostazione è persa quando la cartella di lavoro viene chiusa e riaperta. La protezione del foglio di lavoro è ancora mantenuta.

Quindi il codice 'Re-protection' deve essere incluso all'inizio di qualsiasi procedura che tenti di modificare il foglio di lavoro o possa essere eseguito una sola volta quando la cartella di lavoro viene aperta.

Non credo che tu possa impostare alcuna parte del foglio modificabile solo da VBA , ma puoi fare qualcosa che ha sostanzialmente lo stesso effetto: puoi non proteggere il foglio di lavoro in VBA prima di dover apportare modifiche:

wksht.Unprotect()

e ri-proteggilo dopo aver finito:

wksht.Protect()

Modifica: sembra che questa soluzione alternativa abbia risolto il problema immediato di Dheer, ma per chiunque si imbattesse in questa domanda / risposta in seguito, ho sbagliato sulla prima parte della mia risposta, come sottolinea Joe sotto. Puoi puoi proteggere un foglio in modo che sia modificabile solo con VBA, ma viene visualizzato " UserInterfaceOnly " l'opzione può essere impostata solo quando si chiama " Worksheet.Protect " nel codice.

Una risposta di base ma semplice da capire:

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub

Come soluzione alternativa, puoi creare un foglio di lavoro nascosto , che conterrebbe il valore modificato. La cella nel foglio di lavoro visibile e protetto dovrebbe visualizzare il valore dal foglio di lavoro nascosto usando una formula semplice.

Sarai in grado di cambiare il valore visualizzato attraverso il foglio di lavoro nascosto , mentre i tuoi utenti non saranno in grado di modificarlo.

Ho selezionato le celle che volevo rinchiuse in sheet1 e ho inserito il codice suggerito nella funzione open_workbook () e ho funzionato come un incantesimo.

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top