Sviluppare funzionalita su Microsoft Office con VBA elimina riga selezionata

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 25 totali)
  • Autore
    Articoli
  • #47454 Score: 0 | Risposta

    Ciao,
    nel workbook allegato nel foglio1 ci sono 2 pulsanti gialli collegati alle 2 macro nel modulo1/2

    seleziono una riga > clicco "elimina 1 riga selezionata" questa viene cancellata e poi aggiunta
    una riga vuota alla fine.
    Le righe restano fino a 77

    Se resta solo 1 riga da eliminare, la 5, la macro non aggiunge una nuova riga ma ne toglie 1
    La colpa è qui:
    If n > 5 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert '<<< elimina dalla riga 3
    Non posso modificare perchè la riga 4 deve restare nera.

    Option Explicit
    
    
    Sub EliminaRiga_1()
    
    Dim n As Long
    Dim X As Long
    Dim avviso As String
    Dim LastRow As Long
    
    
    
    avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
     "Vuoi eliminare riga < " & ActiveCell.Row & " > selezionata?", vbOKCancel + vbInformation, "ELIMINA RIGA!")
    
    If avviso = vbCancel Then Exit Sub
    
    
    n = ActiveCell.Row
    If n < 4 Then
    
    
    avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
     "le prime 4 righe non si possono eliminare!", vbOKOnly + vbCritical, "ELIMINA RIGA!")
       
     
    
    Exit Sub
    
    
    Else
    
    ActiveSheet.Unprotect "123456"
    Application.EnableEvents = False
    
    Rows(n).EntireRow.Delete 'elimina solo una riga
    'Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert
    If n > 5 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert '<<< elimina dalla riga 3
    
    ActiveSheet.Protect "123456"
    Application.EnableEvents = True
    
    'Cells(ActiveCell.Row, 1).Select
    'End If
    
    End If
    
    
    
    Cells(ActiveCell.Row, 1).Select
    'Range("A" & Cells.Rows.Count).End(xlUp).Select
    '[A3].Select
    
    
    
    
    End Sub
    
    
    Allegati:
    You must be logged in to view attached files.
    #47458 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      272 pts

      Se n e' minore di 4 allora avvisa ed esci.

      Altrimenti, elimina una riga.

      Se poi n e' maggiore di 5 allora inserisci una nuova riga. 

      Quindi se n e' uguale a 5 non inserisce la riga (ne cancella una perche' siamo nel ramo Else dell'If precedente che testava n minore di 4).

      Io porrei la condizione che se n e' maggiore o uguale a 5 allora inserisci la riga.

      Ne consegue che l'If ... Then e' inutile e puoi lasciare l'istruzione di inserimento riga senza bisogno di alcun test.

      #47460 Score: 0 | Risposta

      Ho provato, ma non funziona

      If n > 5 Or n = 5 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert '<<< elimina dalla riga 3

      #47461 Score: 0 | Risposta

      Aldo Ercolini
      Partecipante
        19 pts

        Se ho capito bene cosa vuoi fare, e cioe' eliminare le righe dalla 5 in poi una alla volta ma far rimanere sempre il numero delle righe uguale, secondo me ci sono due errori:

        Il primo If n < 4 Then dovrebbe essere If n < 5 Then, altrimenti ti fa cancellare anche la riga 4

        Il secondo If n > 4 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert dovrebbe essere If n > 5 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert

        in quanto  quando elimini l'ultima riga, la 5, sei posizionato appunto sulla riga 5 e se gli dici di inserire la riga solo se n > 5 non lo fara' mai.

         

        #47462 Score: 0 | Risposta

        Cambiato, ma se seleziono la riga 5 non si aggiunge una riga.

        Sub EliminaRiga_1()
        
        Dim n As Long
        Dim X As Long
        Dim avviso As String
        Dim LastRow As Long
        
        
        
        avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
         "Vuoi eliminare riga < " & ActiveCell.Row & " > selezionata?", vbOKCancel + vbInformation, "ELIMINA RIGA!")
        
        If avviso = vbCancel Then Exit Sub
        
        
        n = ActiveCell.Row
        If n < 5 Then
        
        
        avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
         "le prime 4 righe non si possono eliminare!", vbOKOnly + vbCritical, "ELIMINA RIGA!")
           
         
        
        Exit Sub
        
        
        Else
        
        ActiveSheet.Unprotect "123456"
        Application.EnableEvents = False
        
        Rows(n).EntireRow.Delete 'elimina solo una riga
        'Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert
        If n > 5 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert '<<< elimina dalla riga 3
        
        ActiveSheet.Protect "123456"
        Application.EnableEvents = True
        
        'Cells(ActiveCell.Row, 1).Select
        'End If
        
        End If
        
        
        
        Cells(ActiveCell.Row, 1).Select
        'Range("A" & Cells.Rows.Count).End(xlUp).Select
        '[A3].Select
        
        
        
        
        End Sub
        #47463 Score: 0 | Risposta

        gianfranco55
        Partecipante
          90 pts

          ciao

          non ho letto tutta la macro

          ma se vuoi che parta dalla 5  mio avviso

          If n > 5 Then R

          diventa 

          If n >= 5 Then R

          anche se mi sembra ripetitivo

          se <5 fai questo altrimenti fai altro

           

          If n<5 Then

          x

          Else

          Y

          #47464 Score: 0 | Risposta

          Anche questo non va

          If n >= 5 Then Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert

          #47465 Score: 0 | Risposta

          Anche così non va

          ActiveSheet.Unprotect "123456"
          Application.EnableEvents = False
          
          Rows(n).EntireRow.Delete 'elimina solo una riga
          'Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert
          
          If n > 5 Then
          Range("A" & Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Insert
          Else
          
          If n = 5 Then
          Rows(n).EntireRow.ClearContents 'elimina solo una riga
          End If
          End If
          
          ActiveSheet.Protect "123456"
          Application.EnableEvents = True
          #47466 Score: 0 | Risposta

          Oscar
          Partecipante
            45 pts

            Vedi così per quanto riguarda  Elimina Riga_1

            Per l'altra macro fai uguale

            `Sub EliminaRiga_1()
            
            Dim n As Long
            Dim X As Long
            Dim avviso As String
            Dim LastRow As Long
            Dim Rg As Variant
            
            
            avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
             "Vuoi eliminare riga < " & ActiveCell.Row & " > selezionata?", vbOKCancel + vbInformation, "ELIMINA RIGA!")
            
            If avviso = vbCancel Then Exit Sub
            
            
            n = ActiveCell.Row
            If n < 4 Then
            
            
            avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
             "le prime 4 righe non si possono eliminare!", vbOKOnly + vbCritical, "ELIMINA RIGA!")
               
             
            
            Exit Sub
            
            
            Else
            
            ActiveSheet.Unprotect "123456"
            Application.EnableEvents = False
            
            Rows(n).EntireRow.Delete 'elimina solo una riga
            
            
            If n > 5 Then Rg = 1 Else Rg = 5
            Range("A" & Rows.Count).End(xlUp).Offset(Rg, 0).EntireRow.Insert '<<< elimina dalla riga 3
            
            
            
            ActiveSheet.Protect "123456"
            Application.EnableEvents = True
            
            
            End If
            
            Cells(ActiveCell.Row, 1).Select
            
            End Sub`
            #47467 Score: 0 | Risposta

            Oscar, non va.

            Se seleziono la riga 5 non crea una nuova riga in più resta vuota

            #47468 Score: 0 | Risposta

            Oscar
            Partecipante
              45 pts

              frank_ciccio ha scritto:

              Oscar, non va.

              Se seleziono la riga 5 non crea una nuova riga in più resta vuota

              Si ho capito che eliminando una riga , ne aggiunge una vuota o no

              #47469 Score: 0 | Risposta

              Oscar
              Partecipante
                45 pts

                frank_ciccio ha scritto:

                seleziono una riga > clicco "elimina 1 riga selezionata" questa viene cancellata e poi aggiunta una riga vuota alla fine.
                Le righe restano fino a 77

                Tu hai scritto così

                Si in effetti ha ragione

                #47470 Score: 0 | Risposta

                Oscar, la tua modifica funziona.

                Probablimente ho sbagliato qualcosa.

                #47471 Score: 0 | Risposta

                Oscar
                Partecipante
                  45 pts

                  Vedi adesso

                  Allego il tuo File vedi anche elimina righe

                  Mi    sembra  che non va bene  elimina righe se selezioni alla fine non le aggiunge

                  `Option Explicit
                  
                  
                  Sub EliminaRiga_1()
                  
                  Dim n As Long
                  Dim X As Long
                  Dim avviso As String
                  Dim LastRow As Long
                  Dim Rg As Variant
                  
                  
                  avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
                   "Vuoi eliminare riga < " & ActiveCell.Row & " > selezionata?", vbOKCancel + vbInformation, "ELIMINA RIGA!")
                  
                  If avviso = vbCancel Then Exit Sub
                  
                  
                  n = ActiveCell.Row
                  If n < 4 Then
                  
                  
                  avviso = MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
                   "le prime 4 righe non si possono eliminare!", vbOKOnly + vbCritical, "ELIMINA RIGA!")
                     
                   
                  
                  Exit Sub
                  
                  
                  Else
                  
                  ActiveSheet.Unprotect "123456"
                  Application.EnableEvents = False
                  
                  Rows(n).EntireRow.Delete 'elimina solo una riga
                  
                  
                  If n = 5 Then n = 5 Else n = n
                  
                  
                  Range("A" & Rows.Count).End(xlUp).Offset(n, 0).EntireRow.Insert '<<< elimina dalla riga 3
                  
                  
                  
                  ActiveSheet.Protect "123456"
                  Application.EnableEvents = True
                  
                  
                  End If
                  
                  Cells(ActiveCell.Row, 1).Select
                  
                  End Sub`
                  Allegati:
                  You must be logged in to view attached files.
                  #47473 Score: 0 | Risposta

                  Grazie oscar

                  funziona sia "1 riga selezionata" che "righe selezionate"

                  #47474 Score: 0 | Risposta

                  Oscar
                  Partecipante
                    45 pts

                    Anche se  selezioni alla fine

                    #47477 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      Oscar ha scritto:

                      If n = 5 Then n = 5 Else n = n

                      #47478 Score: 0 | Risposta

                      Oscar
                      Partecipante
                        45 pts

                        vecchio frac ha scritto:

                        Oscar ha scritto:

                        If n = 5 Then n = 5 Else n = n

                        Quindi era sufficente così

                        Range("A" & Rows.Count).End(xlUp).Offset(n, 0).EntireRow.Insert '<<< elimina dalla riga 3

                        Oppure

                        If n <5 Then n = 5 Else n = n

                         

                        Adesso che ci penso hai ragione

                        #47479 Score: 0 | Risposta

                        alexps81
                        Moderatore
                          55 pts

                          Forse tecnicamente andrebbe meglio così:

                          Option Explicit
                          
                          Sub EliminaRiga_1()
                          Dim n As Long
                          
                          If ActiveCell.Row < 5 Then
                              MsgBox "Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
                                     "le prime 4 righe non si possono eliminare!", vbCritical, "ELIMINA RIGA!"
                              Exit Sub
                          End If
                          
                          If MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
                                    "Vuoi eliminare riga < " & ActiveCell.Row & " > selezionata?", vbOKCancel + vbInformation, "ELIMINA RIGA!") = vbCancel Then Exit Sub
                          
                          ActiveSheet.Unprotect "123456"
                          Application.EnableEvents = False
                          
                          Rows(ActiveCell.Row).EntireRow.Delete 'elimina solo una riga
                          n = Range("A" & Rows.Count).End(xlUp).Row + 1
                          
                          If n < 5 Then n = 5
                          
                          Rows(n).EntireRow.Insert
                          Rows(n).Interior.ColorIndex = xlNone
                          
                          ActiveSheet.Protect "123456"
                          Application.EnableEvents = True
                          
                          Cells(n, 1).Select
                          
                          End Sub

                          Unica accortezza...nel rigo 4 (quello con il fondo nero per intenderci), bisogna sistemare il Font e renderlo uguale a quello delle righe sottostanti e togliere anche il Grassetto. Questo perché quando si cancellerà il quinto rigo, il nuovo inserimento erediterebbe lo stesso formato del quarto rigo: fondo nero, font e grassetto.

                          #47480 Score: 0 | Risposta

                          Oscar
                          Partecipante
                            45 pts

                            alexps81 ha scritto:

                            If n < 5 Then n = 5

                            Giusto

                            #47481 Score: 0 | Risposta

                            alexps81
                            Moderatore
                              55 pts

                              Ma poi mi domando a che cosa servono utilizzare 2 macro per eliminare righe? Quella che elimina più righe contemporaneamente può benissimo eliminare anche una sola! Ad esempio, questo codice rivisitato, copre entrambe le situzioni:

                              Option Explicit
                              
                              Sub EliminaRiga_1()
                              Dim n   As Long
                              Dim Ros As Long
                              Dim s   As String
                              Dim r   As Variant
                              
                              If ActiveCell.Row < 5 Then
                                  MsgBox "Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
                                         "le prime 4 righe non si possono eliminare!", vbCritical, "ELIMINA RIGA!"
                                  Exit Sub
                              End If
                              
                              For Each r In Selection.Rows
                                  s = s & "-" & r.Row
                                  Ros = Ros + 1
                              Next r
                                                      
                               If MsgBox("Sign. < " & Environ("UserName") & " >" & Chr(13) & " " & Chr(13) & _
                                         "Vuoi eliminare la/le riga/ghe " & vbCrLf & " < " & _
                                         Mid(s, 2) & " > " & vbCrLf & "selezionata/te?", vbOKCancel + vbInformation, "ELIMINA RIGHE!") = vbCancel Then Exit Sub
                              
                              ActiveSheet.Unprotect "123456"
                              Application.EnableEvents = False
                              
                              Selection.EntireRow.Delete
                              n = Range("A" & Rows.Count).End(xlUp).Row + 1
                              
                              If n < 5 Then n = 5
                              
                              Rows(n).Resize(Ros).EntireRow.Insert
                              Rows(n).Resize(Ros).Interior.ColorIndex = xlNone
                              
                              ActiveSheet.Protect "123456"
                              Application.EnableEvents = True
                              
                              Cells(n, 1).Select
                              
                              End Sub
                              

                              Vale sempre il discorso fatto nel mio ultimo post inerente al rigo n° 4 (aggiungo anche che bisogna tutti i bordi a quel rigo)

                              #47531 Score: 0 | Risposta

                              Ciao alexps81 la tua ultima macro post#47481 non funziona tanto esatto.

                              Se resta solo 1 riga da elinare oppure seleziono tutte le righe poi queste vengono ricopiate dalla riga 5 in poi

                              Allegati:
                              You must be logged in to view attached files.
                              #47537 Score: 0 | Risposta

                              alexps81
                              Moderatore
                                55 pts

                                Ciao @frank_ciccio

                                ho provato e funziona tutto perfettamente. Hai apportato le modifiche al rigo n° 4 come ho indicato alla fine dei post #47479 e #47481?

                                alexps81 ha scritto:

                                Unica accortezza...nel rigo 4 (quello con il fondo nero per intenderci), bisogna sistemare il Font e renderlo uguale a quello delle righe sottostanti e togliere anche il Grassetto. Questo perché quando si cancellerà il quinto rigo, il nuovo inserimento erediterebbe lo stesso formato del quarto rigo: fondo nero, font e grassetto.

                                alexps81 ha scritto:

                                Vale sempre il discorso fatto nel mio ultimo post inerente al rigo n° 4 (aggiungo anche che bisogna tutti i bordi a quel rigo)

                                al rigo 4, nel range("A4:K4") devi togliere il grassetto, applicare font e fontsize uguale com'è per il resto della tabella. Inoltre metti i bordi sottili a tutte le celle sempre a quel range.

                                #47564 Score: 0 | Risposta

                                Oscar
                                Partecipante
                                  45 pts

                                  frank_ciccio ha scritto:

                                  Ciao alexps81 la tua ultima macro post#47481 non funziona tanto esatto.

                                  Se resta solo 1 riga da elinare oppure seleziono tutte le righe poi queste vengono ricopiate dalla riga 5 in poi

                                  M'ha non conosco la struttura completa del tuo File e non so cosa hai dalla riga 77 in poi , comunque eliminare righe , per poi aggiungerne delle vuote sotto  (non è mai stato un buon metodo) se non hai niente e le aggiungi solo per la griglia , ti basta ripristinare la griglia e ti togli subito il mal di pancia

                                  Ti allego anche il File se vuoi provarlo

                                  Allegati:
                                  You must be logged in to view attached files.
                                  #47602 Score: 0 | Risposta

                                  Grazie oscar la tua macro funziona

                                Login Registrati
                                Stai vedendo 25 articoli - dal 1 a 25 (di 25 totali)
                                Rispondi a: elimina riga selezionata
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni: