› Sviluppare funzionalita su Microsoft Office con VBA › Tasto per cancellare più celle (unite) su più fogli
-
AutoreArticoli
-
Buongiorno,
ho provato a cercare ovunque ma tutte le istruzioni che trovavo non vanno bene per il mio file :
il file ve lo allego semplificato (l'originale avrebbe 13 operatori) in pratica vorrei creare un tasto che svuoti o porti a zero il valore delle celle dei singoli oeratori (quelle colorate) in pratica D/E + J/K + P/Q dalla 14 all 23.
Grazie in anticipo
Allegati:
You must be logged in to view attached files.Ecco un esempio...
Ciao
Luca
ub ProcaCanc() Dim FoglioW Dim RigaW For Each FoglioW In ActiveWorkbook.Sheets If FoglioW.Range("H1") = "OPERATORE" Then For RigaW = 14 To 23 Step 2 Intersect(Rows(RigaW), Columns("D")) = "" Intersect(Rows(RigaW), Columns("J")) = "" Intersect(Rows(RigaW), Columns("P")) = "" Next End If Next End Sub
cio, ho provato ad inserirlo sul file "esempio" che ho allegato alla discusisone e funziona perfettamente, il mio problema adesso è (non capendo nulla di macro) nel file che utilizzo i vari fogli di lavoro non si chiamano "operatore" ma ognuno col il nome proprio (STEFANO,ANDREA,LUCA....)appunto di ogni operatore, dovrò quindi modificare questa riga MA COME ????:
If FoglioW.Range("H1") = "OPERATORE" Then
grazie
Cioè ogni operatore lavora su una copia del programma? E come fa il programma a sapere chi è l'operatore attivo in quel momento?
O il file è unico e lo gestisci solo tu? Se devi sempre svuotare le colonne indicate, indipendentemente dal nome dell'operatore, togli le istruzioni If... End If.
No scusa magari mi sono espresso male, il file viene compilato, durante la giornata alla fine del proprio turno, dal singolo operatore che pre il file, seleziona il "suo foglio" es:stefano compila i camppi a seconda di quello che ha incassato e lo salva.
La mattina dopo io che chiudo la cassa del centro, ho tutti i singoli fogli (singolo operatore) compilati e riportati sul primo foglio di riepilogo, il tasto per cancellare le celle che chiedevo all'inizio lo uso la mattina dopo aver contato i soldi perchè se per caso quel giorno un operatore non viene o non fa cassa, rimarrebbero dentro i valori del giorno prima e conseguentemente i totali sarebbero errati.
quindi è perfetto quello che hai messo tu sopra ma l posto di "operatore" i fogli si chiamano per nome "stefano,laura......"
spero di essermi spiegato meglio
grazie
per essere più precisi ti allego screen dei fogli (il file è unico), in pratica le celle da cancellare per tutti gli operatori m anon per il foglio "chiusura cassa) anche se comunque in quel foglio sono celle vuote che non si compilano
Allegati:
You must be logged in to view attached files.prova cosi:
Sub ProcaCanc() Dim FoglioW As Worksheet Dim RigaW As Long For Each FoglioW In ActiveWorkbook.Sheets If FoglioW.Name <> "CHIUSURA CASSA" Then For RigaW = 14 To 23 Step 2 Intersect(Rows(RigaW), Columns("D")) = "" Intersect(Rows(RigaW), Columns("J")) = "" Intersect(Rows(RigaW), Columns("P")) = "" Next End If Next End Sub
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Ciao a tutti stavo per scrivere ma Albatros (ciao) mi ha preceduto (stessa idea).
Volevo far solo notare che, avendo intuito il problema, nel mio esempio postato sopra non avevo fatto riferimento al nome ma avevo fatto riferimento al contenuto della cella H1 (e non quella sotto dove c'era il nome dell'operatore) in quanto mi sembrava una specie di intestazione.
Ciao
Luca
forse è meglio cosi
Sub ProcaCanc() Dim FoglioW As Worksheet Dim RigaW As Long Set wb = Workbooks.Parent For Each FoglioW In wb.Worksheets If FoglioW.Name <> "Chiusura Cassa" Then For RigaW = 14 To 23 Step 2 Intersect(Rows(RigaW), Columns("D")) = "" Intersect(Rows(RigaW), Columns("J")) = "" Intersect(Rows(RigaW), Columns("P")) = "" Next End If Next End Sub
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )non funziona!
anzitutto mi dice che devo togliere la protezione che è fondamentale per non modificare accidentalmente le formule
allegato foto1
se tolgo la protezione e clicco il tasto creato
allegato foto2
non fa nulla mentre se vado sul singolo foglio lo svuota (solo il foglio attivo).
Allegati:
You must be logged in to view attached files.Mi sento però di consigliare al nostro interlocutore di cominciare a interessarsi a VBA per poter essere autonomo nelle modifiche e correzioni al codice 🙂
Ho notato che c'è un piccolo problema, i fogli sono protetti,quindi il codice che ti ho postato cancella i dati del foglio che in quel momento è attivo. Quidi si dovrebbero aggiungere al codice postato altre righe che sproteggano i fogli, per poi rimetterla
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )No no, le celle da cancellare non sono protette, sono le uniche celle libere così che gli operatori possano compilare giornalmente con i rispettivi incassi, quelle celle ( D,J,P, 14-23) sono bloccate sul foglio denominato chiusura cassa che è appunto da escludere dall'utomazione di cancellazione
questo è perfetto e funziona anche con le protezioni
ub ProcaCanc()
Dim FoglioW
Dim RigaW
For Each FoglioW In ActiveWorkbook.Sheets
If FoglioW.Range("H1") = "OPERATORE" Then
For RigaW = 14 To 23 Step 2
Intersect(Rows(RigaW), Columns("D")) = ""
Intersect(Rows(RigaW), Columns("J")) = ""
Intersect(Rows(RigaW), Columns("P")) = ""
Next
End If
NextEnd Sub
solo che i worksheet anziche chiamarsi "opertore.." hanno i nomi degli operatori singoli come da foto sopra allegata
dato che i fogli sono protetti, prova con questa modifica al codice
Sub ProcaCanc() Dim FoglioW As Worksheet Dim RigaW As Long Set wb = Workbooks.Parent For Each FoglioW In wb.Worksheets If FoglioW.Name <> "Chiusura Cassa" Then FoglioW.Activate For RigaW = 14 To 23 Step 2 Intersect(Rows(RigaW), Columns("D")) = "" Intersect(Rows(RigaW), Columns("J")) = "" Intersect(Rows(RigaW), Columns("P")) = "" Next End If Next End Sub
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Sub ProcaCanc() Dim FoglioW As Worksheet Dim RigaW As Long Set wb = Workbooks.Parent For Each FoglioW In wb.Worksheets If FoglioW.Name <> "Chiusura Cassa" Then FoglioW.Activate For RigaW = 14 To 23 Step 2 Intersect(Rows(RigaW), Columns("D")) = "" Intersect(Rows(RigaW), Columns("J")) = "" Intersect(Rows(RigaW), Columns("P")) = "" Next End If NextEnd Sub
Perfetto, ora chiedo l'impossibile, cancella tutto perfettamente in ordine quando finisce rimane sull'ultimo worksheet, non c'è modo (dato che ame i singoli fogli on interessano) che mi riporti in automatico sul primo foglio "chiusura cassa"?
Sparatemi pure se sto farneticando!!! ;.)
grazie ancora
Non stai farneticando però vale il consiglio che ti ho dato sopra 🙂
Sheets("Chiusura Cassa").Activate
Dopo l'ultimo next
E studia il VBA che è bello....
Ciao
Ciao,
si può evitare il metodo .Activate nonostante i fogli protetti; basta dare le giuste gerarchie, cioè non
Rows(RigaW), Columns("D")
ma
FoglioW.Rows(RigaW), FoglioW.Columns("D")
e gestire correttamente le celle unite:
Sub ProcaCanc() Dim FoglioW As Worksheet Dim RigaW As Long For Each FoglioW In ThisWorkbook.Worksheets With FoglioW If .Name <> "Chiusura Cassa" Then For RigaW = 14 To 23 Step 2 Intersect(.Rows(RigaW), .Columns("D")).MergeArea.ClearContents Intersect(.Rows(RigaW), .Columns("J")).MergeArea.ClearContents Intersect(.Rows(RigaW), .Columns("P")).MergeArea.ClearContents Next End If End With Next End Sub
'Notte.
-
AutoreArticoli