Excel e gli applicativi Microsoft Office Elimina celle selezionate in una tabella

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

    Jonny_60
    Partecipante

      alve a tutti ho un problema che non riesco a risolvere tramite vba dovrei elininare le celle  selezionate in un tabella, naturalmente posso selezionare piu di una cella e possono essere anche non consecutive, ho inserito il codice che adesso allego, solo che nella tabella non funziona mentre se le celle da eliminare non fanno parte di ina tabella funziona. spero che qualcuno mi possa aiutare a risolvere il problema. Allego il codice e il foglio di esempio.

      Sub cancellrigheSelezionateOK() 'OK
      RwRng = Cells(Rows.Count, 3).End(xlUp).Row
      For i = RwRng To 7 Step -1
      If Cells(i, "C") = Selection Then
      Cells(i, "C").EntireRow.Delete
      End If
      Next i
      End Sub

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

      vecchio frac
      Senior Moderator
      • Sfida #1
        145 pts

        Ma lo hai eseguito passo passo con F8? Fallo e ti renderai facilmente conto del perchè non funziona.

        Ci sono almeno un paio di errori progettuali nel codice.

        - Come esegui la selezione multipla?

        - Manca Option Explicit.

        - L'uso di Selection non è appropriato.

        Ci riproviamo? 🙂

         

        #15948 Risposta

        Jonny_60
        Partecipante

          Crazie vecchio frac per aver risposto per quanto riguarda la selezione ci clikko dentro la cella se devo effettuare selezione multipla tengo premuto il tasto ctrl da tastiere e clikko sull'altra cella da selezionare. Per quanto riguarda Option Explicit posso provvedere. mar luso in proprio L'uso di Selection, non ho proprio idea di come posso fare.

           

          #15954 Risposta

          vecchio frac
          Senior Moderator
          • Sfida #1
            145 pts

            Chiarito allora che esegui una selezione da tastiera e poi avvii la macro, ti resta da capire perchè Selection usato così dentro l'If non ti dà il risultato desiderato. 

            Hai eseguito il codice con F8? se non conosci questo modo di fare debug, è semplice: imposti un punto di interruzione all'inizio del codice poi lanci la macro e quando il codice si fema lo puoi eseguire un'istruzione alla volta (passo-passo) con il tasto F8. In questo modo hai il controllo totale dell'esecuzione e puoi verificare il valore che le diverse variabili assumono di volta in volta. In questa modalità ti sarà utilissima la finestra Immediata che puoi aprire con Ctrl-G nell'editor.

            Esrgui dunque il codice passo-passo e ogni volta che arrivi all'If, controlla pure il valore di Selection. Scoprirai che... non cambia e quindi dovrai scrivere un codice un po' diverso per far capire a VBA quale cella deve verificare 🙂

            #15972 Risposta

            Jonny_60
            Partecipante

              Ciao vecchio frac sto cercando di capire dove sbaglio ed apportare le giuste modifiche, per far funzionare il codice. Spero di riuscirci.

               

              #15978 Risposta

              gianca53
              Partecipante

                Sono anch'io un novello,  ma nello spirito di questo forum, che non è di  preparare la "pappa pronta"  ma di  aiutare ad  apprendere,  a modo  mio cerco di farti riflettere su come trovare la soluzione .  La macro qui sotto, posto di avere una riga vuota tra  quelle scritte, provvede ad eliminarla.  Come vedi ho  fatto una precisazione  =""   quindi ...

                Sub cancellrigheSelezionate2() 'OK  ' questa  cancella le righe vuote
                Dim rwRng As Integer, i As Integer
                rwRng = Cells(Rows.Count, 3).End(xlUp).Row
                For i = rwRng To 7 Step -1
                 If Cells(i, "C") = "" Then   <<<<<<<
                  Cells(i, "C").EntireRow.Delete
                 End If
                Next i
                End Sub
                #15980 Risposta

                vecchio frac
                Senior Moderator
                • Sfida #1
                  145 pts

                  Riflettiamo. Selezioniamo una o più celle anche non contigue (con il tasto Ctrl, giusto).

                  Abbiamo per VBA, quindi, un oggetto di tipo Selection composto da uno o più oggetti Cells (che sono di tipo Range, dunque l'oggetto Selection è esso stesso un oggetto Range). 

                  Un oggetto Range espone delle proprietà (attributi) e dei metodi (funzioni o procedure).

                  C'è in questo oggetto un qualcosa che selezioni l'intera riga e che la possa cancellare?

                  #15981 Risposta

                  gianca53
                  Partecipante

                    Sorry, non avevo capito che era la "selezione"da cancellare .   ovvero  ActiveCell , giusto VF ?

                    #16006 Risposta

                    gianca53
                    Partecipante

                      Giusto per non lasciare le cose a metà = ennesima incompiuta , propongo due soluzioni : 

                      Option Explicit
                      Sub cancellrigheSelezionateOK() ' cancella cella selezionata nella tabella
                      Dim rwRng As Integer, i As Integer
                      rwRng = Cells(Rows.Count, 3).End(xlUp).Row
                      For i = rwRng To 7 Step -1
                       If Cells(i, "C") = ActiveCell Then
                        Cells(i, "C").EntireRow.Delete
                       End If
                      Next i
                      End Sub
                      
                      
                      Sub cancellrigheSelezionate4() ' questa cancella celle selezionate in tutto il foglio
                       With ActiveCell
                      .EntireRow.Delete
                      End With
                      End Sub
                      
                      #16009 Risposta
                      patel
                      patel
                      Moderatore
                        31 pts

                        gianca53, ma le hai provate le tue soluzioni ? facendo così non aiuti Jonny ma aumenti la confusione.

                        Non ci possono essere più di una activecell, mentre ci possono essere pù celle selezionate.

                        Comunque il quesito non è banale perché eliminando una riga le selezioni si spostano, però la soluzione è semplicissima

                        `Sub cancella_righe_CelleSelezionate()
                        Selection.EntireRow.Delete
                        End Sub`
                        #16010 Risposta

                        vecchio frac
                        Senior Moderator
                        • Sfida #1
                          145 pts

                          patel ha scritto:

                          la soluzione è semplicissima

                          Avevo pensato anche io a questo (che è in effetti molto semplice), poi però ho guardato il file e mi sono accorto che stiamo parlando di una "tabella" Excel. Nella quale purtroppo questa istruzione non funziona (gli oggetti ListObjects sono delle bestioline un po' antipatiche).

                          La soluzione che ho trovato io è un'altra, e prevede di convertire la tabella in un intervallo normale, quindi eliminare la selezione (col metodo che hai indicato giustamente, visto che funziona), infine riconvertire l'intervallo in tabella.

                          #16014 Risposta
                          patel
                          patel
                          Moderatore
                            31 pts

                            io non avevo scaricato il file  

                            #16016 Risposta

                            gianca53
                            Partecipante

                              A me funzionano con i limiti di una cella /riga x  volta. 

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

                              vecchio frac
                              Senior Moderator
                              • Sfida #1
                                145 pts

                                Mi dispiace gianca, Non funziona correttamente se selezioni più di una cella.

                                Infatti il codice fa sempre riferimento ad ActiveCell che non è una selezione multipla ma una cella sola.

                                La strada è un'altra, poiché Jonny_60 ha stabilito che può selezionare più di una cella anche non consecutive.

                                Provate questo codice con una selezione multipla anche discontinua:

                                Option Explicit
                                
                                Sub delete_rows_in_table()
                                Dim t As Range
                                
                                    Set t = ActiveSheet.ListObjects(1).Range
                                    ActiveSheet.ListObjects(1).Unlist
                                    
                                    Selection.EntireRow.Delete
                                    
                                    ActiveSheet.ListObjects.Add(xlSrcRange, t, , xlYes).Name = "Tabella1"
                                End Sub
                                #16023 Risposta

                                gianca53
                                Partecipante

                                  Gianca :"A me funzionano con i limiti di una cella /riga x  volta. "

                                  VF : " Mi dispiace gianca, Non funziona correttamente se selezioni più di una cella."

                                   

                                   ???? ? 

                                  Va be che è  solo mercoledi però ...    

                                  #16024 Risposta

                                  vecchio frac
                                  Senior Moderator
                                  • Sfida #1
                                    145 pts

                                    Ah ok, avevo inteso che volessi dire che funziona come richiesto, eliminando le celle selezionate, una alla volta (invece che, magari, tutte insieme come invece fa correttamente l'istruzione Selection.EntireRow.Delete).

                                    Ho cercato di attenermi al quesito iniziale 🙂

                                    #16071 Risposta
                                    tanimon
                                    tanimon
                                    Partecipante
                                      2 pts

                                      ciao a tutti  

                                      ciao  Jonny,

                                      ed un saluto a VF, Patel e Gianca.

                                      sò che l'Intento di VF non è quello di fornire la soluzione finita all'utente, ma sono un pò "arruginito"

                                      e per come mi è venuta sarebbe stato un pò difficile spiegarla passo passo.

                                      Mi sembra funzioni, dacci un'occhiata e fai sapere.

                                      Allego anche il file.

                                      edit: ho modificato il post e ne risultano allegati 2

                                      Ciao

                                      Frank

                                      Option Explicit
                                      
                                      Sub elimina_righe_selezione()
                                      Dim rng As Range
                                      Dim ur As Long, n As Long, r As Long, c As Long
                                      Dim verifica() As String, selezione As String
                                      Dim contatore As Integer, sel As Integer
                                      
                                      
                                      ur = Cells(Rows.Count, "a").End(xlUp).Row
                                      uc = Cells(2, Columns.Count).End(xlToLeft).Columns - 1
                                      
                                      contatore = 0
                                      sel = Selection.Count
                                      selezione = Selection.Address
                                      
                                      r = 2
                                      
                                      For r = ur To 2 Step -1
                                      
                                          If contatore = sel Then Exit For
                                          
                                          For c = uc To 1 Step -1
                                                      verifica = Split(selezione, ",")
                                                      
                                                      For n = LBound(verifica) To UBound(verifica)
                                                          If verifica(n) = Cells(r, c).Address Then
                                                              contatore = contatore + 1
                                                              Set rng = Range(Cells(r, 1), Cells(r, 4))
                                                              rng.EntireRow.Delete shift:=xlShiftToUp
                                                          End If
                                                      Next n
                                          Next c
                                      Next r
                                      
                                      Set rng = Nothing
                                      End Sub
                                      

                                       

                                      Allegati:
                                      You must be logged in to view attached files.
                                      #16074 Risposta
                                      tanimon
                                      tanimon
                                      Partecipante
                                        2 pts

                                        ciao a tutti  

                                        ciao Jonny

                                        ed un saluto a VF Patel e Gianca.

                                        mi è sparito il post precedente..........boh  

                                        Sò che VF non desidera di fornire soluzioni finite all'utente, ma sono un pò "arruginito" e per come mi è venuta sarebbe stato un pò difficile spiegarla passo passo ed invitarti a seguirne la logica.

                                        Rimane sicuramente più sbrigativa la  soluzione di VF di convertire la tabella in un range "standard" per poi riconvertirla in tabella, ma a titolo didattico,  forse anche la macro che posto può risultare interessante.

                                        Mi sembra funzioni, dacci un'occhiata e fai sapere.

                                        Allego anche il file.

                                        Ciao

                                        Frank

                                        Option Explicit
                                        
                                        Sub elimina_righe_selezione()
                                        Dim rng As Range
                                        Dim ur As Long, uc As Long, n As Long, r As Long, c As Long
                                        Dim verifica() As String, selezione As String
                                        Dim contatore As Integer, sel As Integer
                                        
                                        
                                        ur = Cells(Rows.Count, "a").End(xlUp).Row
                                        uc = Cells(2, Columns.Count).End(xlToLeft).Columns - 1
                                        
                                        contatore = 0
                                        sel = Selection.Count
                                        selezione = Selection.Address
                                        
                                        r = 2
                                        
                                        For r = ur To 2 Step -1
                                        
                                            If contatore = sel Then Exit For
                                            
                                            For c = uc To 1 Step -1
                                                        verifica = Split(selezione, ",")
                                                        
                                                        For n = LBound(verifica) To UBound(verifica)
                                                            If verifica(n) = Cells(r, c).Address Then
                                                                contatore = contatore + 1
                                                                Set rng = Range(Cells(r, 1), Cells(r, 4))
                                                                rng.EntireRow.Delete shift:=xlShiftToUp
                                                            End If
                                                        Next n
                                            Next c
                                        Next r
                                        
                                        Set rng = Nothing
                                        End Sub
                                        
                                        Allegati:
                                        You must be logged in to view attached files.
                                        #16080 Risposta

                                        gianca53
                                        Partecipante

                                          Perfetta , con due refusi , mancava un  <em>uc as long</em>  e   <em>shift:=xlShiftUp</em> 

                                           poi l'ho immessa nel mio " portafogli  VBA  delle cose  da tenere " . tks 

                                          `Sub elimina_righe_selezione()
                                          Dim rng As Range
                                          Dim ur As Long, n As Long, r As Long, c As Long, uc As Long
                                          Dim verifica() As String, selezione As String
                                          Dim contatore As Integer, sel As Integer
                                          
                                          
                                          ur = Cells(Rows.Count, "a").End(xlUp).Row
                                          uc = Cells(2, Columns.Count).End(xlToLeft).Columns - 1
                                          
                                          contatore = 0
                                          sel = Selection.Count
                                          selezione = Selection.Address
                                          
                                          r = 2
                                          
                                          For r = ur To 2 Step -1
                                          
                                              If contatore = sel Then Exit For
                                              
                                              For c = uc To 1 Step -1
                                                          verifica = Split(selezione, ",")
                                                          
                                                          For n = LBound(verifica) To UBound(verifica)
                                                              If verifica(n) = Cells(r, c).Address Then
                                                                  contatore = contatore + 1
                                                                  Set rng = Range(Cells(r, 1), Cells(r, 4))
                                                                  rng.EntireRow.Delete shift:=xlShiftUp
                                                              End If
                                                          Next n
                                              Next c
                                          Next r
                                          
                                          Set rng = Nothing
                                          End Sub
                                          `
                                          #16081 Risposta
                                          tanimon
                                          tanimon
                                          Partecipante
                                            2 pts

                                            ciao a tutti  

                                            ciao Giancarlo, grazie per la segnalazione:

                                            per uc, l'ho messa nel codice che ho postato dimenticando di correggere il file

                                            per xlShiftUp, mi sono proprio confuso con xlToLeft.

                                            Con la tabella che ho allegato, pochissime righe, i tempi con quella suggerita da VF, sono comunque

                                            notevoli: la mia ci impiega 3 centesimi di secondo di più  

                                            Con una tabella degna di tale nome quindi, nettamente meglio quella di VF (ciao)  

                                             

                                            ciao

                                            Frank

                                            #16084 Risposta

                                            vecchio frac
                                            Senior Moderator
                                            • Sfida #1
                                              145 pts

                                              tanimon ha scritto:

                                              Sò che VF non desidera di fornire soluzioni finite all'utente

                                              A parte le prestazioni, che in alcuni casi è bene sacrificare rispetto alla robustezza, non voglio sempre fare la parte del cattivo 🙂 anche dare soluzioni complete va bene se l'utente dimostra di volersi applicare nello studio della soluzione proposta (a differenza di chi invece prende sempre questi forum come mezzi spiccioli per avere soluzioni a costo e tempo zero).

                                              Quindi grazie del contributo anche se la soluzione mi sembra un po' contorta e comunque è legata agli indirizzi della tabella (se sposti la tabella non funziona o meglio devi aggiustare i riferimenti di riga)

                                              Ma non è una critica anzi è carino come approccio! del resto, lo sai che mi piacciono tanto questi confronti 🙂

                                              #16091 Risposta
                                              tanimon
                                              tanimon
                                              Partecipante
                                                2 pts

                                                Ciao a tutti  

                                                vecchio frac ha scritto:

                                                Quindi grazie del contributo anche se la soluzione mi sembra un po' contorta e comunque è legata agli indirizzi della tabella

                                                ciao VF,

                                                correggimi pure se dico una fesseria, ma il fatto che la soluzione che ho proposto possa essere contorta

                                                è totalmente soggettivo e di conseguenza opinabile anche se, vedendo la tua, capisco quanto hai voluto

                                                dire.

                                                Non sono d'accordo invece sulle conseguenze date dallo spostamento della tabella:

                                                quello che nel codice chiamo "verifica",  lo effettuo sull'indirizzo di una selezione effettuata prima dell'avvio della macro, e quindi la soluzione non è predisposta/pensata per una tabella, ma per una selezione di celle le cui righe verranno eliminate.

                                                Sulle prestazioni concordo con quanto hai detto, ma le certezze non sono opinabili.  

                                                Gradirei comunque un tuo parere su quanto espresso e Ti auguro una buona domenica.

                                                A presto

                                                Frank

                                                 

                                                #16111 Risposta

                                                vecchio frac
                                                Senior Moderator
                                                • Sfida #1
                                                  145 pts

                                                  tanimon ha scritto:

                                                  il fatto che la soluzione che ho proposto possa essere contorta

                                                  è totalmente soggettivo e di conseguenza opinabile

                                                  Giusto 🙂 si tratta di stili e tecnica di programmazione diversi, e ognuno ha i propri.

                                                  tanimon ha scritto:

                                                  quello che nel codice chiamo "verifica",  lo effettuo sull'indirizzo di una selezione

                                                  Vero! Pensa che ho anche sottolineato l'uso accorto di Split 🙂

                                                  Ho riletto le sciocchezze che ho scritto.  Che dirti? avrei dovuto collegare il cervello prima di scrivere.

                                                  #16124 Risposta
                                                  tanimon
                                                  tanimon
                                                  Partecipante
                                                    2 pts

                                                    ciao a tutti   

                                                    vecchio frac ha scritto:

                                                    Giusto 🙂 si tratta di stili e tecnica di programmazione diversi, e ognuno ha i propri.

                                                    ciao VF,

                                                    aggiungerei anche conoscenza e capacità' di utilizzo dello strumento: Excel.

                                                    vecchio frac ha scritto:

                                                    Ho riletto le sciocchezze che ho scritto

                                                    finalmente un po' di compagnia: credevo di essere l'unica particella di acqua rimasta.     

                                                    buona domenica,

                                                    Frank

                                                  LoginRegistrati
                                                  Stai vedendo 24 articoli - dal 1 a 24 (di 24 totali)
                                                  Rispondi a: Elimina celle selezionate in una tabella
                                                  Gli allegati sono permessi solo ad utenti REGISTRATI
                                                  Le tue informazioni:



                                                  vecchio frac - 2137 risposte

                                                  albatros54
                                                  albatros54 - 650 risposte

                                                  patel
                                                  patel - 510 risposte

                                                  Marius44
                                                  Marius44 - 409 risposte

                                                  Luca73
                                                  Luca73 - 373 risposte