Nella speranza di essere stato chiaro ringrazio
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
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
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
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.
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.
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
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
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
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,