Sviluppare funzionalita su Microsoft Office con VBA cancellare il contenuto di una cella se lo cancello in un'altra

LoginRegistrati
Stai vedendo 25 articoli - dal 1 a 25 (di 25 totali)
  • Autore
    Articoli
  • #28225 Risposta

    AmmoN
    Partecipante

      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..
      grazie

      Allegati:
      You must be logged in to view attached files.
      #28236 Risposta

      GiuseppeMN
      Partecipante
        10 pts

        Buona giornata, @ammon;
        credo che un UserForm opportunamente strutturato potrebbe risolvere la tua richiesta.

        Cosa ne pensi?

        Giuseppe

        #28237 Risposta

        AmmoN
        Partecipante

          E volendo modificare quello già fatto come si potrebbe fare?

          #28253 Risposta

          GiuseppeMN
          Partecipante
            10 pts

            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" vuota

            Che 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

            #28258 Risposta

            AmmoN
            Partecipante

              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.
              #28265 Risposta

              GiuseppeMN
              Partecipante
                10 pts

                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

                #28271 Risposta
                Marius44
                Marius44
                Moderatore
                  28 pts

                  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

                  #28272 Risposta

                  AmmoN
                  Partecipante

                    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

                    #28275 Risposta
                    Marius44
                    Marius44
                    Moderatore
                      28 pts

                      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

                      #28276 Risposta

                      AmmoN
                      Partecipante

                        OK..grazie per l'interessamento.. attendo

                        #28278 Risposta
                        Marius44
                        Marius44
                        Moderatore
                          28 pts

                          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

                          #28284 Risposta

                          GiuseppeMN
                          Partecipante
                            10 pts

                            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

                            #28285 Risposta

                            AmmoN
                            Partecipante

                              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"

                               

                              #28286 Risposta

                              AmmoN
                              Partecipante

                                non va!! non apre nemmeno piuì le inputbox

                                #28288 Risposta
                                Marius44
                                Marius44
                                Moderatore
                                  28 pts

                                  Ciao

                                  La risposta 28286 a quale suggerimento si riferisce?

                                   

                                  Ciao,

                                  Mario

                                  #28290 Risposta

                                  GiuseppeMN
                                  Partecipante
                                    10 pts

                                    ... 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

                                    #28312 Risposta

                                    AmmoN
                                    Partecipante

                                      Marius44 ha scritto:

                                      Ciao

                                      alla 28284

                                      #28313 Risposta

                                      AmmoN
                                      Partecipante

                                        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

                                        #28314 Risposta

                                        GiuseppeMN
                                        Partecipante
                                          10 pts

                                          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

                                          #28315 Risposta

                                          AmmoN
                                          Partecipante

                                            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.

                                             

                                            #28316 Risposta
                                            Marius44
                                            Marius44
                                            Moderatore
                                              28 pts

                                              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

                                               

                                               

                                               

                                              #28317 Risposta

                                              AmmoN
                                              Partecipante

                                                si funziona..la provavo su un vecchio file..

                                                scusate!!!

                                                cmq se cancello 2 o piu valori insieme  mi da errore

                                                'cancellazioni
                                                If Target = "" Then

                                                #28320 Risposta

                                                AmmoN
                                                Partecipante

                                                  come posso aggiustare?

                                                  #28337 Risposta

                                                  GiuseppeMN
                                                  Partecipante
                                                    10 pts

                                                    cmq 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!

                                                    #28410 Risposta

                                                    AmmoN
                                                    Partecipante

                                                      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
                                                    LoginRegistrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 25 totali)
                                                    Rispondi a: cancellare il contenuto di una cella se lo cancello in un'altra
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni:



                                                    vecchio frac - 2750 risposte

                                                    albatros54
                                                    albatros54 - 1022 risposte

                                                    patel
                                                    patel - 1000 risposte

                                                    Marius44
                                                    Marius44 - 877 risposte

                                                    Luca73
                                                    Luca73 - 734 risposte