Bloccare cella tramite macro.

Anonimo
2020-01-08T19:47:23+00:00

Ciao,

ho notato che l'argomento in oggetto è stato già trattato diverse volte, però non sono riuscito a trovare una soluzione.

Quello che mi serve è una semplice cosa e cioè:

se la cella H3 è vuota si può inserire un valore, altrimenti no.

Ho provato in questo modo:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("H3") <> "" Then

    Range("H3").Locked = True

Else

    Range("H3").Locked = False

End If

End Sub

ma mi esce il seguente errore:

Vladimiro

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-01-10T13:16:59+00:00

Ciao Vladimiro,

il link è sempre lo stesso, solo che la demo l'ho modificata inserendo i tuoi suggerimenti.

Allora il problema è il seguente:

se inserisco manualmente un valore nella cella H3 e successivamente provo a modificarlo, non me lo fa fare e dunque funziona bene.

Se invece comincio ad inserire i valori tramite i pulsanti VINTA o PERSA e provo a modificarli manualmente, me lo fa fare e questo non va bene.

Riassumendo:

vorrei bloccare la cella H3 al secondo inserimento a prescindere se il primo inserimento è avvenuto manualmente o tramite i suddetti pulsanti.

Vladimiro

Nelle tue procedure Rettangolo1A_Click e Rettangolo3A_Click, sostituisci:

   End Sub

con:

    ActiveSheet.Range(miaCella).MergeArea.Locked = True

End Sub

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-01-09T10:59:57+00:00

Ciao Vladimiro,

esce ugualmente lo stesso errore.

Al seguente link ho messo una demo; basta inserire un valore nella cella H3 per visualizzare l'errore.

Qui si vede il grande vantaggio di un file di esempio :-)

Il tuo problema è dovuto a due fattori:

  • non è possibile bloccare una cella su un foglio protetto
  • non è possibile bloccare una singola cella che fa parte di un'area di cella unita

Quindi prova:

'=========>>

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)    

    Const miaCella As String = "H3"                                   '<<=== Modifica

    Const sPassword As String = "MiaPassword"                '<<=== Modifica

    With Me

        If Not Intersect(.Range(miaCella), Target) Is Nothing Then

          If Not .Range(miaCella).Value = vbNullString Then

            .Unprotect Password:=sPassword

            .Range(miaCella).MergeArea.Locked = True

            .Protect Password:=sPassword

            End If

        End If

    End With

End Sub

'<<=========

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

19 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2020-01-09T14:45:55+00:00

    Ciao Vladimiro,

    ok, va bene...

    Se volessi invece fare la stessa cosa per tutte le celle bloccate al di fuori naturalmente di quelle sbloccate dell'intero foglio di lavoro, sarebbe fattibile?

    Forse non ho capito ma, in effetti, il mio codice impedirà la modifica di qualsiasi cella bloccata e verrà visualizzato un messaggio di avviso se l'utente tenta una modifica.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2020-01-09T13:29:56+00:00

    Ciao Vladimiro,

    naturalmente funziona! :-)

    Prima di chiudere il thread, vorrei approfittare per chiederti un'altra cosa.

    E' possibile evitare il seguente avviso:

    magari con qualcosa scritto da me?

    Una soluzione potrebbe essere quella di eliminare la protezione del foglio e invece sostituire il mio codice con le seguente versione:

    '=========>>

    Option Explicit

    Private Sub Worksheet_Change(ByVal Target As Range)

        Const miaCella As String = "H3"                                      '<<=== Modifica

        Const sAvvisoVladimiro As String = "Tuo avviso qui"     '<<=== Modifica

        On Error GoTo XIT

        Application.EnableEvents = False

        With Me

            If Target.Locked = True Then

                Application.Undo

                    Call MsgBox( _

                         Prompt:=sAvvisoVladimiro, _

                         Buttons:=vbInformation, _

                         Title:="REPORT")

            ElseIf Not Intersect(.Range(miaCella), Target) Is Nothing Then

                If Not .Range(miaCella).Value = vbNullString Then

                    .Range(miaCella).MergeArea.Locked = True

                End If

            End If

        End With

    XIT:

        Application.EnableEvents = True

    End Sub

    '<<=========

    ===

    Regards,

    Norman

    Ciao Norman,

    ok, va bene...

    Se volessi invece fare la stessa cosa per tutte le celle bloccate al di fuori naturalmente di quelle sbloccate dell'intero foglio di lavoro, sarebbe fattibile?

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2020-01-09T13:11:03+00:00

    Ciao Vladimiro,

    naturalmente funziona! :-)

    Prima di chiudere il thread, vorrei approfittare per chiederti un'altra cosa.

    E' possibile evitare il seguente avviso:

    magari con qualcosa scritto da me?

    Una soluzione potrebbe essere quella di eliminare la protezione del foglio e invece sostituire il mio codice con le seguente versione:

    '=========>>

    Option Explicit

    Private Sub Worksheet_Change(ByVal Target As Range)

        Const miaCella As String = "H3"                                      '<<=== Modifica

        Const sAvvisoVladimiro As String = "Tuo avviso qui"     '<<=== Modifica

        On Error GoTo XIT

        Application.EnableEvents = False

        With Me

            If Target.Locked = True Then

                Application.Undo

                    Call MsgBox( _

                         Prompt:=sAvvisoVladimiro, _

                         Buttons:=vbInformation, _

                         Title:="REPORT")

            ElseIf Not Intersect(.Range(miaCella), Target) Is Nothing Then

                If Not .Range(miaCella).Value = vbNullString Then

                    .Range(miaCella).MergeArea.Locked = True

                End If

            End If

        End With

    XIT:

        Application.EnableEvents = True

    End Sub

    '<<=========

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento