Macro Filtro dati



  • [Macro] Filtro dati
    di smanioz data: 28/08/2017 17:49:04

    Ciao, vorrei chiedervi un aiuto perchè sto affrontando VBA per Excel per la prima volta e sono abbastanza in difficoltà.

    Vorrei utilizzare una Macro per filtrare un file di output di un programma. Questo output è un file .txt ma con una attenta delimitazione diventa un file .xlsx che può essere filtrato. Essendo questo file relativamente grande e con una quantità notevole di righe da eliminare rispetto a quelle che alla fine devo utilizzare vorrei usare una macro per velocizzare il percorso.

    Il mio quesito è : come posso eliminare tutte le righe di questo file fino ad una determinata cella?

    ES: riga 1 a | b
    riga 2 c | d
    riga 3 k | e

    io voglio eliminare tutte le righe precedenti finchè non trovo k, poi il programma dovrebbe fermarsi però mi sa che ho sbagliato qualcosa.Potreste gentilmente indirizzarmi?

    Spero di esser stato chiaro :D
     
    Sub Elimina_dati_input()
    '
    ' Elimina_dati_input Macro
    '
        
        Dim LastRow As Integer
        Dim row As Integer
        Dim Righe As Boolean
        
        Sheets("Righe").Select
        LastRow = ActiveSheet.UsedRange.Rows.Count
    
        For row = 1 To LastRow
        If Cells(row, 1) = "TIME" Then
            Rows(row).Select
            Application.CutCopyMode = False
            Selection.Delete Shift:=xlUp
        End If
    Next row
        
    End Sub



  • di Vecchio Frac data: 28/08/2017 20:22:39

    Quando cancelli una riga non devi mai far partire un contatore dalla prima riga all'ultima, ma dall'ultima alla prima, perchè ogni volta che elimini una riga il contatore delle righe si impalla (perde il riferimento alla riga successiva visto che gliela togli da sotto i piedi).
    Il tuo codice soffre anche di qualche curiosità scientifica :)

    - Manca la direttiva iniziale Option Explicit
    - "Row": non definire una variabile con il nome di una proprietà o di un metodo esistente ("Row" è un attributo di un oggetto range)
    - "Righe": che senso ha definire una variabile che non viene poi mai utilizzata?
    - UsedRange è un metodo un po' impreciso e fonte di guai nascosti, eviterei di utilizzarlo; al suo posto è meglio CurrentRegion
    - Nel confronto tra stringhe è meglio che le due stringhe siano comparabili in modo sicuro per evitare che il confronto fallisca ("TIME" è diverso da "Time" ed è diverso da "TIME "): ci sono metodi per convertire le stringhe in minuscolo/maiuscolo e per eliminare gli spazi in eccesso
    - Se devi semplicemente eliminare una riga non serve selezionarla
    - CutCopyMode (che restituisce o imposta lo stato della modalità Taglia o Copia: hai presente il bordo tratteggiato che compare quando fai copia o taglia?) è in questo contesto del tutto inutile
    - Per finire, cura meglio l'indentazione, per la leggibilità (a te, ma anche ad altri; ora, ma anche in futuro) del tuo codice.





  • di patel data: 29/08/2017 07:06:37

    infatti quando elimini la riga 2 quella che era terza diventa seconda e quindi non viene eliminata.
    Partendo dall'ultima questo inconveniente non accade.





  • di smanioz data: 29/08/2017 18:52:02

    Ringrazio entrambi per l'aiuto, mi dispiace degli errori sia di scrittura che di ragionamento logico, ma sono un neofita nella progettazione e purtroppo ho anche poco tempo per imparare (maledetto lavoro :D).
    Ammetto di aver scopiazzato a destra e a manca senza averci ragionato molto.

    In ogni caso ora correggo la definizione delle variabili e il ciclo For.
    Tuttavia ho dei dubbi a riguardo.

    Ho un un foglio con N righe e nella colonna 1 ho svariati valori (testo, celle vuote, numeri) sino ad arrivare ad una cella( di riga N-esima, 1) in cui inizia a ripetersi un determinato valore X. In quel punto io vorrei fermarmi e cancellare tutte le righe precedenti.

    ES:
    1
    2
    3
    4
    X
    1

    3
    X
    2
    3

    Dopo aver fatto girare la macro vorrei aver solamente
    X
    1

    3
    X
    2
    3

    Come Faccio? Perchè se faccio un ciclo for dall'ultima riga io cancellerei in ordine decrescente.(spero di esser stato chiaro).

    PS: Ho messo il codice VBA per farvi veder se il ciclo è corretto, so che momentamente cancella solamente le righe che corrispondono a quella ipotesi, a questo ci lavorerò successivamente.

    In ogni caso grazie
     
    UltimaRiga = ThisWorkbook.Worksheets("Righe").Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = UltimaRiga To 1 Step by - 1
    If ThisWorkbook.Worksheets("Righe").Cells(i, 2).Value = "X" Then
    Rows(i).Delete
    End If