Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    188

    [Excel 2007] Macro o funzione per eliminare righe...di troppo.

    Ciao.
    Ho bisogno di eliminare le righe duplicate in una tabella con 11 colonne se (e solo se) la prima cella è differente.
    Le celle della prima colonna possono contenere i valori "<", ">" o "R": in caso di riga duplicata, deve essere eliminata la riga con il valore "R" nella prima cella.

    Un po' (poco) me la cavo con macro e funzioni, ma questo è veramente troppo .
    Grazie.

  2. #2
    Se ho capito bene quello che chiedi, metterei un filtro alla prima colonna, filtrerei "R", quindi selezionerei tutte le righe visualizzate tranne la prima.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    188
    No, mi sono spiegato male io.
    (anche nel titolo: non credo che sia possibile eliminare record con una funzione)

    Delle 11 colonne della tabella solo le prime due, A e B, sono importanti.
    Le celle della colonna A contengono uno dei tre valori già detti: ">", "<" o "R".
    Le celle della colonna B contengono una stringa alfanumerica.

    SE due celle della colonna B contengono lo stesso valore, ALLORA hanno sicuramente un valore diverso (uno dei tre possibili) nella cella corrispondente della colonna A; e SE uno di questi valori in colonna A è uguale a R, ALLORA tutto il record deve essere eliminato.

    Per risolvere il problema con i filtri, dovrei:
    1- filtrare in colonna B tutti i valori duplicati (non saprei come fare, è possibile?)
    2- sui valori ottenuti, filtrare quelli che hanno R nella colonna A ed eliminarli in blocco.

    Comunque, se non risolvo, sto lavorando a una soluzione diversa, che mi permette di eliminare i record direttamente dal database, prima di importarli in excel.

    Grazie lo stesso.

  4. #4
    Due domande:


    le righe sono ordinate sulla colonna B e/o sulla A?
    In altre parole per cercare un eventuale duplicato della riga in esame bisogna esplorare ogni volta tutte le righe o basta controllare il record seguente/precedente?


    Ti serve proprio che le righe vengano eliminate o va bene anche una copia delle sole righe "buone" su un altro foglio?
    Questo te lo chiedo perché ogni volta che ho provato ad eliminare righe durante un ciclo di esplorazione delle stesse righe ho incontrato dei grossi problemi.


    Adesso non ho il tempo di scriverti una soluzione completa ma visto che dici che con VBA un po' sai muoverti, provo a darti uno spunto.


    Prima di tutto serve un ciclo di esplorazione della colonna A che, al suo interno, si chieda se la riga in esame è una R o altro.


    Se non è una R la riga va semplicemente copiata in un altro foglio, altrimenti bisogna innescare un altro ciclo che cerchi nella colonna B il valore presente nella cella B della riga in esame.
    Questo secondo ciclo si potre evitare se le righe fossero ordinate perché allora si potrebbe puntare direttamente alla cella con Offset maggiore o minore di 1.


    Se il secondo ciclo (o la Offset) trova la riga non si fa niente (in modo che la riga R non venga copiata sull'altro foglio) altrimenti bisogna copiare anche la riga R.


    Ovviamente serve una variabile che tenga traccia del punto a cui si è arrivati con la scrittura sul secondo foglio.


    Ti butto giù un po' di codice ma tieni presente che è solo un abbozzo non testato:


    codice:
    
    ' inizializzo la riga di destinazione sul foglio2
    riga_dest = 0
    
    
    ' Esplorazione della colonna A
    For each cella_a in range("a1:a1000")
    
    
    ' Se la cella in esame non contiene R, la riga va copiata nella posizione riga_dest + 1 (colonna 1)
       if cella_a <> "R" then
          riga_dest = riga_dest + 1
          rows(cella_a.row).copy destination:=worksheets("Foglio2").cells(riga_dest,1)
    
    
       else
    
    
    ' Se invece contiene R bisogna esplorare tutta la colonna B (se sono ordinate questa parte la puoi semplificare molto)
    
    
    ' inizializzazione del flag 
          trovata = false
    
    
    ' ciclo sulla colonna B
          for each cella _b in range("b1:b1000")
    
    
    ' cells(cella_a.row , 2) indica la cella B della riga in esame cioè di quella puntata da cella_a
             if cells(cella_a.row , 2) = cella_b and cella_a.row <> cella_b.row then
                trovata = true
                exit for
             end if
          next
    
    
    ' se il valore non è stato trovato si scrive la riga R sul foglio 2
          if not trovata
             riga_dest = riga_dest + 1
             rows(cella_a.row).copy destination:=worksheets("Foglio2").cells(riga_dest,1)
          end if
       end if
    next

    Sicuramente ho dimenticato qualcosa ma è solo una traccia, fammi sapere se riesci ad andare avanti.
    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    188
    Vengono ordinate alfabeticamente in ordine crescente, prima la colonna A e poi la colonna B: così ogni coppia o terna di valori duplicati in colonna B avrà, in colonna A, la sequenza

    <
    >
    R



    Quote Originariamente inviata da NonCeLaFaccio+ Visualizza il messaggio
    ...ogni volta che ho provato ad eliminare righe durante un ciclo di esplorazione delle stesse righe ho incontrato dei grossi problemi.
    Che genere di problemi?
    Anche eliminando righe intere con "currentCell.EntireRow.Delete"?

    Grazie.

  6. #6
    Quote Originariamente inviata da 23Andrea Visualizza il messaggio
    Vengono ordinate alfabeticamente in ordine crescente, prima la colonna A e poi la colonna B: così ogni coppia o terna di valori duplicati in colonna B avrà, in colonna A, la sequenza

    <
    >
    R





    Che genere di problemi?
    Anche eliminando righe intere con "currentCell.EntireRow.Delete"?

    Grazie.

    Il risultato che dici tu si ottiene ordinando prima sulla B e poi sulla A ed allora il ciclo sulla colonna B lo puoi sostituire con una semplice offset che punti alla riga precedente, ordinando invece prima su A e poi su B si ottiene che prima vengono tutti i <, poi tutti i > e poi tutte le R e quindi i gruppi di righe con lo stesso valore in B vengono sparpagliati su righe lontane fra di loro (se è così ti tocca fare il ciclo).

    I problemi che ho incontrato sono di perdita dei puntamenti durante il ciclo, ad esempio sto esplorando una certa sequenza di righe, all'interno del ciclo ne cancello una e al prossimo giro non mi ritrovo puntato alla riga corretta ma ad un'altra.
    In realtà comunque non ho mai approfondito bene questa questione quindi provaci pure se credi, così ci fai sapere come risolvi.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.