problema ciclo do loop



  • problema ciclo do... loop
    di gugluca (utente non iscritto) data: 18/10/2012 18:35:43

    Ciao a tutti.
    Non riesco a capire cosa sbaglio con il codice iindicato sotto.
    Eseguendo questa semplice macro, mi esce fuori questo errore:

    Errore di run-time'1004'
    Errore nel metodo Select per la classe Range.

    Secondo voi, cosa sbaglio?
    In sostanza, con questa macro, vorrei eliminare tutte le righe, partendo dal fondo (riga 100) fino ad arrivare alla prima riga, che presentano celle nella colonna A vuote.


    Grazie in anticipo per i suggerimenti.

    Ciao

    Luca

     
    Sub n()
    
    Dim c As Worksheet
    Set c = Sheets("Tracciato")
    x = 100
    Do While x > 1
    
        If c.Range("a" & x) = "" Then
            c.Range("a" & x).Select
            Selection.EntireRow.Delete
        End If
        
            x = x - 1
           
    Loop
    
    End Sub
    



  • di HarryBosch data: 18/10/2012 19:34:23

    Ti esce questo errore perché quando lanci la macro il foglio attivo è diverso da quello nominato "Tracciato".
    Tra l'altro un foglio con questo nome dovrebbe esserci perché altrimenti avresti un errore di tipo diverso:
    "indice non incluso nell'intervallo".

    Quindi nel codice aggiungi semplicemente una istruzione per attivare tale foglio prima di cancellare le righe, oppure modifica il nome "Tracciato" con il nome del foglio dove devi agire.
    Poi aggiungi "Application.Screenupdating" e lo schermo smetterà di "ballare" il valzer

     
    Sub n()
    Dim c As Worksheet
    Dim x As String
    Application.ScreenUpdating = False
    Sheets("Tracciato").Activate
    Set c = Sheets("Tracciato")
    x = 50
    Do While x > 1
        If c.Range("a" & x) = "" Then
            c.Range("a" & x).Select
            Selection.EntireRow.Delete
        End If
            x = x - 1
    Loop
    Application.ScreenUpdating = True
    End Sub



  • di HarryBosch data: 18/10/2012 19:39:13

    Tra l'altro puoi benissimo evitare di selezionare tale foglio, indicandone il riferimento ad ogni range; con l''istruzione With basta poi aggiungere il punto. Il "set" mi sembra un pò "sprecato" se si vuole solo cancellare le righe.
    Se modifichi il tuo esempio come sotto puoi lanciare la macro da qualsiasi foglio attivo.
     
    With Sheets("Tracciato")
    x = 50
    Do While x > 1
        If .Range("a" & x) = "" Then
            .Range("a" & x).EntireRow.Delete
        End If
            x = x - 1
    Loop
    End With



  • di Vecchio Frac data: 19/10/2012 08:28:31

    Vorrei portare un umile contributo...
    Tutta il codice proposto si può risolvere con una riga soltanto.
    Si suppone che i dati che contengono celle di cui testare che siano vuote o meno si trovano in colonna A.

    Il primo esempio elimina l'intera riga, come da richiesta.
    Il secondo esempio elimina le sole celle vuote della colonna A shiftando verso l'altro quelle non vuote e quindi compattandole, lasciando inalterate le altre colonne.

     
    'elimina le righe in corrispondenza di celle vuote della colonna A
    Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    'elimina le celle vuote della colonna A, spostando e compattando verso l'alto quelle non vuote.
    Columns("A:A").SpecialCells(xlCellTypeBlanks).Delete shift:= xlShiftUp






  • di gugluca (utente non iscritto) data: 19/10/2012 10:11:12

    Grazie a tutti per il vostro supporto.
    Ho testato le vostre indicazioni e funzionano tutte.
    Il problema forse l'ho capito e risolto solo in parte, nel senso che, quella fase di eliminazione di righe la devo fare su un file creato dalla macro su più fogli di lavoro (creati all'interno della macro).
    Probabilmente, nel with oltre ad inserire il nome del foglio, devo indicare anche il nome del file.
    Ho provato a farlo, ora la macro non mi dà più errore, ma mi esegue le istruzioni solo dell'ultimo with (quindi mi elimina solo le righe dell'ultimo foglio e negli altri non fa nulla) ...
    Sinceramente non capisco come mai
    Provo a sintetizzare di sotto, la macro cosa combina..

    Grazie ancora per il supporto

    Luca

     
    'apro un file txt, importandolo in un foglio di lavoro di una nuova cartella di lavoro che prende il nome del file di testo
    
    FILETOOPEN = Application.GetOpenFilename("TEXT Files (*.TXT), *.TXT", , "Selezionare il file txt da caricare ", "Apri", "False")
    file_selezionato = ActiveWorkbook.Name
    If FILETOOPEN = False Then
    Application.CutCopyMode = False
        End
      End If
    Workbooks.OpenText FILETOOPEN, Origin:=xlWindows, _
            StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 2),
    
    ....
            
    Set RNG = [a1].Parent.UsedRange
    cella = RNG.Find(What:="*", _
    After:=RNG.Cells(1), _
    Lookat:=xlPart, _
    LookIn:=xlFormulas, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlPrevious, _
    MatchCase:=False).Row
    
    Set database = ActiveSheet
    Set file = ActiveWorkbook
    
    
    Sheets.Add....  ' aggiungo alcuni fogli di lavoro ed eseguendo alcuni cicli copio i dati del foglio che ho appena chiamato 'database' nei fogli appena creati.
    
    
    With file.Sheets("Tracciato 100")
    
    Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    End With
    
    
    With file.Sheets("Tracciato 101")
    
    Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    End With
    
    
    With file.Sheets("Tracciato 102")
    
    Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    ....
    
    With file.Sheets("Tracciato 109")
    
    Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    End With
    
    End With
    
    
    
    
    



  • di HarryBosch data: 19/10/2012 10:22:45

    Se ri-leggi quello che ti ho indicato in occasione del With troverai anche
    "...con l''istruzione With basta poi aggiungere il punto."

    Con il With eviti di dover scrivere tutte le volte il riferimento al foglio in questione, ma devi aggiungere il . prima dell'istruzione successiva. Quindi, come l'esempio sotto; il nome del file non serve visto che ti trovi già all'interno.

    Se poi devi eliminare le righe per ogni foglio, si potrebbe creare un ciclo senza dover scrivere tutti i With...

     
    With Sheets("Tracciato 100")
         .Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End With
    



  • di gugluca (utente non iscritto) data: 19/10/2012 10:42:12

    Ops..
    Scusami, non avendo praticamente mai utilizzato l'istruzione with me ne sono perso un pezzo..

    Ora funziona tutto!

    Grazie ancora per il supporto!!!
    Alla prossima!
    Buona giornata

    Luca




  • di Vecchio Frac data: 19/10/2012 11:20:17

    E invece di tutta quella sfilza di With, non si può compattare come segue?
    Se ho letto male e ci sono fogli che non devono essere trattati, allora come non detto :)
     
    for each sh in file.Worksheets
        sh.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Next 






  • di gugluca (utente non iscritto) data: 19/10/2012 17:09:23

    Grazie per il miglioramento.
    In realtà, quell'operazione devo farla per tutti i fogli tranne uno..

    Quindi mi sa che non riesco a far diversamente se non un 'with' per ciascun foglio.
    In sostanza ho 10 fogli, faccio 9 'with', o si può fare tutti tranne 1?

    Ciao
    Luca




  • di HarryBosch data: 19/10/2012 17:25:51

    Si deve escludere il nome del foglio al quale non devi eliminare le righe. Tutti gli altri verranno processati.
    Riprendendo il codice di VecchioFrac:
     
    for each sh in file.Worksheets
        If sh.name <> "NomeFoglioEscluso" then
              sh.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        endif
    Next