Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Non permettere il comando "canc" su singola cella excel

547 views
Skip to first unread message

Porkemon

unread,
Oct 27, 2010, 8:23:18 AM10/27/10
to
Salve, volevo sapere se esiste un modo per far si che una o più celle
vengano "bloccate" da determinate operazioni. Mi spiego meglio. Non mi
riferisco al solito discorso "proteggi foglio" e "proteggi cella" che
so usare, ma ad un qualcosa di simile che mi permetta su di una cella
di impedire la cancellazione del suo contenuto ma non il valore o il
testo. In pratica voglio semplicemente che questa cella resti sempre
formattata come "contabilità" ad esempio e che si possa inserire un
valore numerico e basta, o un testo e basta . Son riuscito si tramite
"dati/convalida" ad darmi un errore se imposto un numero e invece
inserisco una lettera, ma non riesco a "bloccare" la cancellazione
"tasto canc" della stessa.

Nella speranza di essere stato chiaro ringrazio

elby

unread,
Oct 27, 2010, 5:31:45 PM10/27/10
to
Non si capisce, nel senso che sei contraddittorio. Con Canc si
cancella il valore non il formato.
Cosa vuoi proteggere?
Ciao Elio

Porkemon

unread,
Oct 28, 2010, 4:26:59 AM10/28/10
to
> > Nella speranza di essere stato chiaro ringrazio- Nascondi testo citato
>
> - Mostra testo citato -

Si mi son spiegato male, se ad esempio ho il formato "contabilità" e
immetto un valore 0 ( zero ) mi compare "€ - " nella cella.
Se invece schiaccio "canc" nella cella scompare "€ -" e rimane la
cella vuota, bianca cosa che vorrei evitare.
Spero di essermi spiegato e ringrazio

elby

unread,
Oct 28, 2010, 6:52:29 AM10/28/10
to
Piuttosto che intercettare il tasto CANC, cosa che richiederebbe una
chiamata ad una API
è preferibile testare il valore della cella ( o delle celle) dopo la
modifica.
Funziona anche se si cancellano più celle in una sola volta
nel modulo del foglio immetti questo codice ( si assume che l'area di
input sia la A1:A100):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngDatiContabilità As Range
Dim myCell As Range
On Error GoTo ErrHandler
Set rngDatiContabilità = Range("A1:A100") '<<Da cambiare
If Not Intersect(rngDatiContabilità, Target) Is Nothing Then
If IsNull(Target.Cells(1)) Or _
WorksheetFunction.CountBlank(Target.Cells(1)) = 1 Then
Application.EnableEvents = False
For Each myCell In Target
myCell.Value = 0
Next myCell
Target.NumberFormat = _
"_($* #,##0.00_);_($*" _
& "(#,##0.00);_($* ""-""??_);_(@_)"

End If
End If
ExitProcedure:
Application.EnableEvents = True
Exit Sub
ErrHandler:
Resume ExitProcedure
End Sub

Fammi sapere se hai risolto

> Spero di essermi spiegato e ringrazio- Nascondi testo citato

Porkemon

unread,
Oct 29, 2010, 3:58:31 AM10/29/10
to
> > - Mostra testo citato -- Nascondi testo citato

>
> - Mostra testo citato -

Funziona alla grande, è ciò che cercavo. Ultima domanda, se volessi
che altre celle "ubbidissero" ad altre condizioni allo stesso modo? ad
esempio ho colonne con formato "numero" che vorrei si comportassero
allo stesso modo. NB: ho provato a modificare quello che mi hai
mandato tu, ma non sono esperto....

grazie ancora

Mauro Gamberini

unread,
Oct 29, 2010, 6:52:03 AM10/29/10
to
> Piuttosto che intercettare il tasto CANC, cosa che richiederebbe una
> chiamata ad una API
>

Mah, io direi che è sufficente un semplice:

Private Sub Workbook_Open()
Application.OnKey "{DELETE}", ""
End Sub

Ovviamente posso mettere al posto di "" la chiamata
ad una macro.

Test delle celle a parte.

--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/

__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5574 (20101029) __________

Il messaggio è stato controllato da ESET NOD32 Antivirus.

www.nod32.it


Porkemon

unread,
Oct 29, 2010, 8:26:31 AM10/29/10
to
On 29 Ott, 12:52, "Mauro Gamberini"

<maurogscRIMUOV...@RIMUOVEREaliceposta.it> wrote:
> > Piuttosto che intercettare il tasto CANC, cosa che richiederebbe una
> > chiamata ad una API
>
> Mah, io direi che è sufficente un semplice:
>
> Private Sub Workbook_Open()
>     Application.OnKey "{DELETE}", ""
> End Sub
>
> Ovviamente posso mettere al posto di "" la chiamata
> ad una macro.
>
> Test delle celle a parte.
>
> --
> ---------------------------
> Mauro Gamberini
> Microsoft MVP - Excelhttp://www.riolab.org/http://www.maurogsc.eu/

>
> __________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5574 (20101029) __________
>
> Il messaggio è stato controllato da ESET NOD32 Antivirus.
>
> www.nod32.it

Io vi ringrazio ma non son pratico di queste cose, quindi spero che il
suggerimento di Mauro sia utile ad altri, a me potrebbe esserlo se
sapessi di più di "chiamata ad una macro" e cose del genere. Magari un
giorno.... visto che è da 15 giorni che mi son messo col "fai da me" a
preparare un foglio excell :-) . Per il momento mi bastava una
modifica al codice di elby per far si che lo stesso principio venga
applicato anche su altre colonne con formattazioni diverse da quella
"contabilità" .
Mi spiego meglio, nella colonna A1:A100 mi serve "contabilità" e
funziona perfettamente , ma sulla colonna G1:G100 mi serve "numero" o
"percentuale" come formattazione.

elby

unread,
Oct 29, 2010, 9:33:20 AM10/29/10
to
Prova con questa modifica che rispetto alla precedente allarga l'area
di intevento da parte dell'evento Change e risiede sul fatto che
mette semplicemente 0 quando si preme Canc senza 'rinforzare' la
formattazione; sostanzialmente
si affida alla formattazione residente impostata manualmente
Ciao Elio

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngDatiContabilità As Range
Dim myCell As Range
On Error GoTo ErrHandler

Set rngDatiContabilità = Range("A1:G100") '<<Da cambiare


If Not Intersect(rngDatiContabilità, Target) Is Nothing Then
If IsNull(Target.Cells(1)) Or _
WorksheetFunction.CountBlank(Target.Cells(1)) = 1 Then
Application.EnableEvents = False
For Each myCell In Target
myCell.Value = 0
Next myCell

elby

unread,
Oct 29, 2010, 9:39:40 AM10/29/10
to
Ma così si disabilita il tasto Canc in tutto il file e anche in altri
file
Un conto è riconoscere che un tasto è stato premuto e altro attivare
una routine quando quel tasto è stato premuto
Mettere come secondo argomento della .OnKey "" non equivale a dire fai
il lavoro di Default di Canc ma di non fare nulla.
L'OP vuole che quando si preme Canc solo su alcune aree vengo immesso
0 rispettando la formttazione preesistente
Con questo non voglio dire che lavorandoci su non si possa in qualche
modo sfruttare OnKey, ma non penso che si debba scrivere meno codice.
Ciao Elio

On 29 Ott, 12:52, "Mauro Gamberini"
<maurogscRIMUOV...@RIMUOVEREaliceposta.it> wrote:
> > Piuttosto che intercettare il tasto CANC, cosa che richiederebbe una
> > chiamata ad una API
>
> Mah, io direi che è sufficente un semplice:
>
> Private Sub Workbook_Open()
>     Application.OnKey "{DELETE}", ""
> End Sub
>
> Ovviamente posso mettere al posto di "" la chiamata
> ad una macro.
>
> Test delle celle a parte.
>
> --
> ---------------------------
> Mauro Gamberini
> Microsoft MVP - Excelhttp://www.riolab.org/http://www.maurogsc.eu/

Mauro Gamberini

unread,
Oct 29, 2010, 10:15:30 AM10/29/10
to
> Io vi ringrazio ma non son pratico di queste cose, quindi spero che il
> suggerimento di Mauro sia utile ad altri, a me potrebbe esserlo se
> sapessi di più di "chiamata ad una macro" e cose del genere. Magari un
> giorno.... visto che è da 15 giorni che mi son messo col "fai da me" a
> preparare un foglio excell :-) . Per il momento mi bastava una
> modifica al codice di elby per far si che lo stesso principio venga
> applicato anche su altre colonne con formattazioni diverse da quella
> "contabilità" .
>

Scusa, non rispondevo a te e riguardava una cosa
postata da elby.
Mi dispiace se ho fatto confusione.

> Mi spiego meglio, nella colonna A1:A100 mi serve "contabilità" e
> funziona perfettamente , ma sulla colonna G1:G100 mi serve "numero" o
> "percentuale" come formattazione.
>

Forse ti sfugge qualcosa(o forse sfugge a me).
Se io formatto la cella A1 come contabilità, la cella
avrà le caratteristiche che imposti per la formattazione
quando la cella *contiene un valore*. Quando è vuota, è vuota.
Tutto quello che fa il codice nell'evento Change postato da
elby, è metterti uno 0(zero) nelle celle, quindi non
modifica la formattazione(che non si modifica neppure
quando cancelli il valore nella cella, quindi perchè rimetterla?).
Quindi se G1:G100 è fomattata come numero, rimane formattata
come numero anche se cancelli il dato. Quello che tu vuoi è
uno zero all'interno delle celle, *non* una formattazione.

Quindi, considerando che la formattazione *non cambierà*
(sarà tua cura formattare precedentemente i Range)
anche annullando il,valore nelle celle, prova questa versione semplificata,
da copia/incollare nel modulo di codice *DEL FOGLIO*
dove vuoi questa cosa:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range
Dim c As Range

Set rng = Me.Range("A1:A100,G1:G100")

If Not Intersect(rng, Target) Is Nothing Then
For Each c In Target
If Len(c.Value) = 0 Then
c.Value = 0
End If
Next
End If

Set c = Nothing
Set rng = Nothing

End Sub

Ora, l'unica cosa da modificare sono i Range da controllare.
Qui sono A1:A100,G1:G100.
Se devi aggiungerne un terzo: A1:A100,G1:G100,M10:M35
eccetera. I riferimenti ai Range sono separati da una virgola
e vanno racchiusi fra doppi apici, come nell'esempio.

Qui trovi(mi scuso se non serve) dove e come copia/incollare
il codice:

http://www.maurogsc.eu/excel/xlsdoveinserirecodice.aspx

Grazie per l'attenzione.

--
---------------------------
Mauro Gamberini

Mauro Gamberini

unread,
Oct 29, 2010, 10:32:13 AM10/29/10
to
> Mettere come secondo argomento della .OnKey "" non equivale a dire fai
> il lavoro di Default di Canc ma di non fare nulla.
>

Credo di saperlo e di aver aggiunto:

>> Ovviamente posso mettere al posto di "" la chiamata
>> ad una macro.
>

Ho quotato una parte
del tuo post e a quella mi riferivo.
Scomodare le API per intercettare il tasto
CANC nel vb di Excel, scusa ma mi sembra
un po' troppo! Cosa che poi devi anche gestire perchč
diversa nelle versioni di S.O. a 32 e 64 bit.


> L'OP vuole che quando si preme Canc solo su alcune aree vengo immesso
> 0 rispettando la formttazione preesistente
>

Non mi sembra di aver contestato invece il codice
postato e la logica che vi sta dietro. L'OP non ha
chiara la differenza fra cella vuota e cella con dati
e che la formattazione č sempre presente anche
a cella vuota. Ma che senza dati nella cella, ovviamente
non si vede il risultato della formattazione.

Grazie per la stimolante discussione.

--
---------------------------
Mauro Gamberini

Porkemon

unread,
Oct 29, 2010, 11:02:05 AM10/29/10
to
On 29 Ott, 16:32, "Mauro Gamberini"

<maurogscRIMUOV...@RIMUOVEREaliceposta.it> wrote:
> > Mettere come secondo argomento della .OnKey "" non equivale a dire fai
> > il lavoro di Default di Canc ma di non fare nulla.
>
> Credo di saperlo e di aver aggiunto:
>
> >> Ovviamente posso mettere al posto di "" la chiamata
> >> ad una macro.
>
> Ho quotato  una parte
> del tuo post e a quella mi riferivo.
> Scomodare le API per intercettare il tasto
> CANC nel vb di Excel, scusa ma mi sembra
> un po' troppo! Cosa che poi devi anche gestire perchè

> diversa nelle versioni di S.O. a 32 e 64 bit.
>
> > L'OP vuole che quando si preme Canc solo su alcune aree vengo immesso
> > 0 rispettando la formttazione preesistente
>
> Non mi sembra di aver contestato invece il codice
> postato e la logica che vi sta dietro. L'OP non ha
> chiara la differenza fra cella vuota e cella con dati
> e che la formattazione è sempre presente anche

> a cella vuota. Ma che senza dati nella cella, ovviamente
> non si vede il risultato della formattazione.
>
> Grazie per la stimolante discussione.
>
> --
> ---------------------------
> Mauro Gamberini
> Microsoft MVP - Excelhttp://www.riolab.org/http://www.maurogsc.eu/

Perfetto, funziona perfettamente. Per questioni personali non dirò
quale adotterò dei due sistemi proposti, ma sappiate che vi ringrazio
tantissimo. Spero solo che il mio caso serva in futuro anche ad altri
e che magari sia da spunto a chi, come voi, è a un livello tale da
poter sempre migliorare.
Buon lavoro a tutti,

0 new messages