› Sviluppare funzionalita su Microsoft Office con VBA › aggiungere zero
-
AutoreArticoli
-
Ciao a tutti.
Nel workbook allegato:
quando scrivo in colonna D aggiungere zero in celle E/F/G
che poi possano essere sovrascritte da altri numeriGrazie
Allegati:
You must be logged in to view attached files.ciao
nel foglio1
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo e If Not Intersect(Target, Range("D8:D1000")) Is Nothing Then Target.Offset(0, 1) = 0 Target.Offset(0, 2) = 0 Target.Offset(0, 3) = 0 End If e: Exit Sub End SubBuongiorno frank_ciccio,
ti lascio 2 opzioni la formula in E8: =SE($D8="";"";0) da trascinare a destra e in basso
o la macro da inserire nel Foglio1:
`Private Sub Worksheet_Change(ByVal Target As Range) Dim bBlock As Boolean If Target.Column = 4 And Target.Cells.Count = 1 And Not bBlock Then bBlock = True Range(Cells(Target.Row, 5), Cells(Target.Row, 7)).Value = 0 bBlock = False End If End Sub`ciao,
altra soluzone, selezioni D8:G23 (o fino alla riga di interesse) poi nella barra delle formule scrivi
=SE(D8:D23<>"";0;"")
e confermi la formula con ctrl shift enter
Con vba
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
Application.EnableEvents = False
Range("E" & Target.Row & ":G" & Target.Row) = 0
Application.EnableEvents = True
End If
End SubUn'alternativa che consente il copia-incolla di più celle in colonna D:
Private Sub Worksheet_Change(ByVal Target As Range) Dim rCell As Range If Target.Column = 4 Then Application.EnableEvents = False For Each rCell In Target.Cells rCell.Offset(0, 1).Resize(, 3) = 0 Next rCell Application.EnableEvents = True End If End Sub@maxpit: la variabile
bBlock, così come utilizzata è inutile per due motivi; se esamini bene il tuo codice sono sicuro che lo capirai da solo.Ciao caro @scossa come mai anche il ciclo FOR EACH/NEXT?
Non può bastare così?
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) 'se è interessata l'intervallo "D8:D23" allora... If Target.Column = 4 And (Target.Row >= 8 And Target.Row <= 23) Then Application.EnableEvents = False Target.Offset(, 1).Resize(1, 3).Value = 0 Application.EnableEvents = True End If End SubCiao caro @scossa come mai anche il ciclo FOR EACH/NEXT?
In effetti, visto che va scritto il valore 0 per tutte le celle il ciclo non serve:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 Then Application.EnableEvents = False Target.Offset(0, 1).Resize(, 3) = 0 Application.EnableEvents = True End If End Subnon ho capito perché limiti il range ad un determinato numero di righe.
P.S.: forse ho capito: è il range nel file dell'OP (che non ho scaricato).
P.P.S:
Target.Offset(, 1).Resize(1, 3).Value = 0così però valorizzi solo la prima riga di E:G@scossa : hai ragione è stata una mia svista in quanto l'azione è prevista solo con modifiche sulla colonna D e la variabile tutte le volte che accede alla Sub è sempre False. Ho comunque scelto di limitare l'esecuzione alla selezione di una sola cella.
Il codice si può quindi semplificare in
Private Sub Worksheet_Change(ByVal Target As Range) Dim bBlock As Boolean If Target.Column = 4 And Target.Cells.Count = 1 Range(Cells(Target.Row, 5), Cells(Target.Row, 7)).Value = 0 End If End SubGrazie per l'appunto.
e la variabile tutte le volte che accede alla Sub è sempre False
perché per mantenere il valore avresti dovuto dichiararla come
Static.Ho deciso di non utilizzare Static in quanto considero la variazione possibile solo per una cella (Target.Cells.Count = 1) escludendo quindi la possibilità della ripetizione a seguito nuovo evento di variazione rilevato sul foglio innescata dalla valorizzazione di 3 celle contigue.
Mi sono accorto solo ora che ho lasciato la dichiarazione di variabile inserita che ora elimino, purtroppo ho qualche problema a gestire le correzioni sui messaggi:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 And Target.Cells.Count = 1 Range(Cells(Target.Row, 5), Cells(Target.Row, 7)).Value = 0 End If End SubGrazie ancora e alla prossima.
-
AutoreArticoli
