› Sviluppare funzionalita su Microsoft Office con VBA › cancellare il contenuto di una cella se lo cancello in un'altra
-
AutoreArticoli
-
buongiorno
ho 2 tabelle con elenco personale.
se in una cella di qst tabella scrivo "riposo" si apre un inputbox che mi chiede quando deve essere fatto il riposo " quando? matt notte o pom?". inserendomi i dati in un'altra tabella (tabella 5 e 6)
ora se dovessi scrivere "notte" mi apre un altro inputbox e mi chiede quante ore di riposo deve fare? inserendomi i dati in un'alra tabella (tabella 3 e 4).ora vi chiedo come posso integrare in qst macro, la possibilità che se dovessi cancellare dalla tabella che da il via al tutto (ovvero tabella 1 e 2) la parola "riposo" mi cancelli anche il relativo contenuto delle celle della tabella 3 e 4, 5 e 6.. e viceversa..
allego file..
grazieAllegati:
You must be logged in to view attached files.Buona giornata, @ammon;
credo che un UserForm opportunamente strutturato potrebbe risolvere la tua richiesta.Cosa ne pensi?
Giuseppe
Buona giornata, @ammon;
temo di essermi perso.A proposito di:
... se dovessi cancellare riposo ad aldo e fabio (per esempio) nelle tabella 1 e 2 se dovessi cancellare riposo ad aldo e fabio (per esempio) nelle tabella 1 e 2 ...
Nella Tabella "1" trovo "ALDO" in Cella "B6" e "riposo" in Cella "C6"
Nella Tabella "2" trovo "fabio" in Cella "B25" e "riposo" in Cella "C25"... mi deve cancellare anche il relativo contenuto alle tabelle sottostanti. 5, 6 e 3, 4 ...
Nella Tabella "3" trovo "ALDO" in Cella "B46" e "8" in Cella "C46"; 8 sono le Ore di "riposo" o "notte"?
Nella Tabella "4" trovo "fabio" in Cella "B65" e Cella "C65" vuota
Nella Tabella "4" trovo "aldo" in Cella "B77" e Cella "C77" vuota
Nella Tabella "5" trovo "Aldo" in Cella "B96" e Cella "C96" vuota
Nella Tabella "6" trovo "fabio" in Cella "B115" e Cella "C115" vuota
Nella Tabella "6" trovo "aldo" in Cella "B127" e Cella "C127" vuotaChe cosa deve fare il Codice VBA; cancellare solo il Valore in Cella "C46"?
A proposito di:
... Così che se cancello direttamente la notte dalla tabella 5 o 6(esempio Aldo) mi deve cancellare il relativo contenuto nella tabella 1, 2 e 3, 4
Per "ALDO" o "aldo" non trovo alcun Valore Colonna "C" in "Tabella 5" e "Tabella 6"
Giuseppe
cancellando tutto il contenuto delle celle..
se scrivo in C6 "riposo" mi chiede "giorno, pomeriggio o notte?"
e me lo scrive in c96.
se però alla domanda scrivo "notte" mi chiede "quante ore?" e me le inserisce in C46.
lo stesso per qualsiasi cella che va da C6:C18 e C25 e C42.
la mia domanda è come posso integrare il VBA affinchè se cancello ciò che ho scritto in C6 (per esempio) e cioè "riposo" si cancelli anche ciò che il TEXTBOX ha inserito in C96 ed eventualmente in C46? e lo stesso se dovessi cancellare ciò che è stato scritto in C96 o C46, mi deve cancellare ciò che sta scritto in c6?
grazie
allego file
Allegati:
You must be logged in to view attached files.Salve @ammon;
questo potrebbe essere un Codice VBA che risponde alla tua richiesta:... la mia domanda è come posso integrare il VBA affinchè se cancello ciò che ho scritto in C6 (per esempio) e cioè "riposo" si cancelli anche ciò che il TEXTBOX ha inserito in C96 ed eventualmente in C46? ...
Purtroppo non sono riuscito ad integrarlo nel tuo Codice VBA "Worksheet_Change"; mi genera una serie di errori che non sono riuscito a risolvere.
Voglio dire, su un nuovo File strutturato come il tuo un Codice VBA di questo tipo funziona mentre sul tuo no:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim x As Long Application.EnableEvents = False If Not Intersect(Target, Range("C6:H132")) Is Nothing Then If Target = "" Then For x = 6 To 132 If Cells(x, 2).Value = Cells(Target.Row, 2).Value Then Cells(x, Target.Column).ClearContents Next x End If End If End Sub
Se lo ritieni utile e opportuno, posso inviarti il File con il quale ho condotto i miei test ma credo serva veramente a poco.
Giuseppe
Salve a tutti
Effettivamente è un po' complicato (come dice giustamente GiuseppeMN - che saluto).
Vedi se può esserti utile questa macro (integrata nella tua) ma che cancella SOLO i dati quando si cancella "riposo"; la via inversa è abbastanza difficile ed io non sono riuscito.
Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range If Not Intersect(Target, Range("c6:h132")) Is Nothing Then For Each cel In Intersect(Target, Range("c6:h132")) With cel If cel.Value = "riposo" Then cel.Offset(90, 0).Value = InputBox(Cells(cel.Row, "b") & " quando? matt notte o pom?", "ATTENZIONE") ElseIf cel.Value = "notte" Then cel.Offset(-50, 0).Value = InputBox(Cells(cel.Row, "b") & " quante ore?", "ATTENZIONE") End If End With Next ' On Error Resume Next newval = Target.Value Application.EnableEvents = False Application.Undo 'ripristina il vecchio valore oldval = Target.Value oldaddr = Target.Address Target.Value = newval Application.EnableEvents = True If oldval = "riposo" Then nome = Cells(Target.Row, Target.Column - 1) 'assume il nome Application.EnableEvents = False For i = 46 To 132 'cerca il nome in tab.3,4,5 'se lo trova cancella contenuto nella stessa colonna If Cells(i, 2) = nome Then Cells(i, Target.Column).ClearContents Next i Application.EnableEvents = True End If End If End Sub
Fai sapere. Ciao,
Mario
se scrivo riposo, non mi scrive nulla come prima nelle celle sottostanti. se cancello la parola riposo funziona, cancellandomi ciio che scrivo manualmente.. ma con le textbox non scrive nulla
Ciao
Si hai ragione (me ne sono accorto adesso; prima ero concentrato sulla cancellazione di risposo e seguenti).
E' maledettamente complicato (credo che non possa farsi come hai impostato le richiesti).
Ma non si sa mai (se ho un po' di tempo ritento). Tu, nel frattempo, studia la macro di GiuseppeMN e la mia.
Ciao,
Mario
Ciao
Prova se sostituendo la macro con questa funziona (a me sembra di si)
Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range If Not Intersect(Target, Range("c6:h132")) Is Nothing Then For Each cel In Intersect(Target, Range("c6:h132")) With cel If cel.Value = "riposo" Then cel.Offset(90, 0).Value = InputBox(Cells(cel.Row, "b") & " quando? matt notte o pom?", "ATTENZIONE") ElseIf cel.Value = "notte" Then cel.Offset(-50, 0).Value = InputBox(Cells(cel.Row, "b") & " quante ore?", "ATTENZIONE") End If End With Next End If 'cancellazioni If Target = "" Then Application.EnableEvents = False Application.Undo 'ripristina il vecchio valore oldval = Target.Value oldaddr = Target.Address Target.Value = newval For Each cel In Intersect(Target, Range("C6:H132")) nome = Cells(Target.Row, Target.Column - 1) 'assume il nome For i = 6 To 132 If Cells(i, 2) = nome Then Cells(i, Target.Column).ClearContents Next i Next Application.EnableEvents = True End If End Sub
Ciao,
Mario
Buona sera a Tutti;
ho molto apprezzato la soluzione proposta da @marius44, che saluto.
Per i miei test avevo optato per l'Evento "BeforeDoubleClickBeforeDoubleClick" ma l'integrazione in Worksheet_Change è da preferire.Ciò detto, molto probabilmente è colpa dell'età, non riesco proprio a capire la logica del tuo Codice VBA:
`Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range If Not Intersect(Target, Range("C6:H132")) Is Nothing Then For Each cel In Intersect(Target, Range("C6:H132")) With cel If cel.Value = "riposo" Then cel.Offset(90, 0).Value = InputBox(Cells(cel.Row, "b") & " quando? matt notte o pom?", "ATTENZIONE") ElseIf cel.Value = "notte" Then cel.Offset(-50, 0).Value = InputBox(Cells(cel.Row, "b") & " quante ore?", "ATTENZIONE") End If End With Next End If End Sub`
Voglio dire, cel.Offset(-50, 0).Value non ne capisco la logica; immaginiamo di inserire "notte" in Cella "C56" in corrispondenza di "ALESSIO" ed imputare 8 ore.
Le 8 ore verranno inserite nella Cella"C6" in corrispondenza di "ALDO"; o mi sbaglio?Ti sarei veramente grato se riesci a chiarirmi questa logica. Grazie.
Giuseppe
le uniche celle in cui si potrà interagire vanno da 6 a 46.
per questo se cancelo "riposo" mi deve cancellare le celle di sotto (che saranno nascoste).
il -50 e perche va alle celle che stanno sopra rispetto a quelle "NOT, POM, MAT"
Ciao
La risposta 28286 a quale suggerimento si riferisce?
Ciao,
Mario
... le uniche celle in cui si potrà interagire vanno da 6 a 46 ...
Mi sembra di capire che in queste Celle puoi scrivere "riposo" oppure "notte"; non voglio fare confusione con gli interventi di Mario ma quando avrai risolto vorrei capire cosa succede se in Cella "C46" scrivessi "notte".A margine di quanto sopra confermo che il Codice VBA proposto da @marius44 propone correttamente i relativi InputBox.
Buona serata.
Giuseppe
Ciao
alla 28284
si puo scrivere solo riposo..
se scrivo riposo si apre una text box che i chiede "MATT POM SERA" e mi inserisce la risposta nelle tabelle sottostanti. (tabelle 4)
solo se rispondo sera si risponde "SERA" si apre altro textbox che mi chiede "QUANTE ORE?" e me lo scrive nelle tabelle 3.
ora siccome le tabelle 3 e 4 saranno nascoste..
se cancello riposo in tabella 1 mi deve cancellare il relativo contenuto in tabella 4 ed eventualmente tabella 3
si puo scrivere solo riposo ...
non vorrei sbagliarmi ma mi sembra che la condizione:ElseIf cel.Value = "notte" Then cel.Offset(-50, 0).Value = InputBox(Cells(cel.Row, "b") & " quante ore?", "ATTENZIONE")
non serva assolutamente a nulla; o mi sbaglio?
Inoltre, a beneficio degli Utenti interessati a questo argomento, visto che:
... le uniche celle in cui si potrà interagire vanno da 6 a 46 ...
If Not Intersect(Target, Range("c6:h132")) Is Nothing Then
potrebbe essere modificata in:
If Not Intersect(Target, Range("C6:H64")) Is Nothing Then
Giuseppe
chi utilizzerà il programma potrà scrivere solo nelle celle che vanno da c6:h45
se per caso scrive tra le altre cose (FERIE, TURNO ect.ect.) RIPOSO gli chiede quando?? MAT POM O SERA??? e la risposta la scriverà in c96:h132.
se per caso scrivesse NOTTE, gli chiede quante ore di riposo la notte? e lo scrive (/solo se è notte quindi) in c46:h82..
le ore di riposo notturno e i vari riposi (notte giorno o pomeriggio) li vedrò come report in un altro foglio.
Ciao
Riporto un periodo del primo post
"ora vi chiedo come posso integrare in qst macro, la possibilità che se dovessi cancellare dalla tabella che da il via al tutto (ovvero tabella 1 e 2) la parola "riposo" mi cancelli anche il relativo contenuto delle celle della tabella 3 e 4, 5 e 6.. e viceversa. "
La macro che ti ho suggerito esegue quanto da te richiesto. La hai provata? Funziona? E in caso negativo, cosa non funziona?
Ciao,
Mario
si funziona..la provavo su un vecchio file..
scusate!!!
cmq se cancello 2 o piu valori insieme mi da errore
'cancellazioni
If Target = "" Thencmq se cancello 2 o piu valori insieme mi da errore
come posso aggiustare?
Visto che le soluzioni tardano ad arrivare, ti propongo la mia; sicuramente non è la migliore ma dovrebbe funzionare:
elimina ... un valore alla volta!
Buongiorno, ragazzi.. ritorno su qst post perchè applicandolo al mio progetto per cancellare una cella ci impiega circa 5/7 minuti.
il renge è abbastanza grande L6:ADV 1070. volevo chiedervi se si potesse cambiare o far inmodo che la cancellazione sia più immediata..
il codice funziona benissimo, ma ci impiega unìeternità (problema che dipende dal mio programmino)
Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range If Not Intersect(Target, Range("I2:I3")) Is Nothing Then Cells.EntireColumn.Hidden = False For Each cel In Range("L6:ADV6") If Month(cel.Value) <> Sheets("CALENDARIO").Range("C59").Value Or Year(cel.Value) <> Sheets("CALENDARIO").Range("C74").Value Then cel.EntireColumn.Hidden = True End If Next cel End If If Not Intersect(Target, Range("L6:ADV1060")) Is Nothing Then For Each cel In Intersect(Target, Range("L6:ADV1060")) With cel If cel.Value = "SOST" Then cel.Offset(643, 0).Value = InputBox(Cells(cel.Row, "I") & " dove va?", "ATTENZIONE") ElseIf cel.Value = "CENTRALE" Then cel.Offset(-445, 0).Value = InputBox(Cells(cel.Row, "I") & " che partenza?", "ATTENZIONE") End If End With Next End If If Target = "" Then Application.EnableEvents = False Application.Undo 'ripristina il vecchio valore oldval = Target.Value oldaddr = Target.Address Target.Value = newval For Each cel In Intersect(Target, Range("L6:ADV1060")) NOME = Cells(Target.Row, Target.Column - 1) 'assume il nome For i = 6 To 1060 If Cells(i, 2) = NOME Then Cells(i, Target.Column).ClearContents Next i Next Application.EnableEvents = True End If End Sub
-
AutoreArticoli