Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

VBA EXCEL: eliminare righe verificando una condizione

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

VBA EXCEL: eliminare righe verificando una condizione

Postdi iRiMiKi » 06/07/10 20:12

Ciao a tutti,
devo eseguire su EXCEL la macro che copio di seguito.
La macro elimina le righe nelle quali coincide la parte iniziale, fino ai caratteri ".)".
Dovrei modificarla in modo che, prima di eliminare le righe, memorizzi la stringa che segue dopo ".)" nella riga che rimane.
Ad esempio, delle tre righe
accordo : (com.) concertación.
accordo : (com.) concierto.
accordo : (com.) iguala.
dovrà rimanere una sola riga:
accordo : (com.) concertación, concierto, iguala.
La macro è questa (l'ho provata, funziona):
Codice: Seleziona tutto
Sub elimina_righe()
'
' elimina_righe Macro
'
Dim cell As Range, CellsToSuppr As Range, derLi As Long

Application.ScreenUpdating = False
derLi = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To derLi
If Left(Cells(i, 3), InStr(Cells(i, 3), ".)")) = Left(Cells(i + 1, 3), InStr(Cells(i + 1, 3), ".)")) Then
If CellsToSuppr Is Nothing Then
Set CellsToSuppr = Cells(i + 1, 3)
Else: Set CellsToSuppr = Union(CellsToSuppr, Cells(i + 1, 3))
End If
End If
Next i
If Not CellsToSuppr Is Nothing Then CellsToSuppr.EntireRow.Delete
End Sub


Qualcuno potrebbe aiutarmi a fare la modifica necessaria?
Grazie!
iRiMiKi
Utente Junior
 
Post: 10
Iscritto il: 12/03/10 13:55

Sponsor
 

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi Flash30005 » 06/07/10 21:15

Ma se hai 100 righe con ".)"
devi "concatenare" tutto in una riga?
e quale?
(nella prima che incontra con ".)" o altrove?)

Fai sapere
Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi maxmula » 06/07/10 22:28

Puoi, ad esempio, "costruire" la stringa che deve rimanere prima di eliminare le righe, poi rimpiazzare con questa il testo dell'ultima linea rimasta.
Ho modificato il tuo codice in questo modo:

Codice: Seleziona tutto
Sub elimina_righe()
'
' elimina_righe Macro
'
Dim cell As Range, CellsToSuppr As Range, derLi As Long

Application.ScreenUpdating = False
derLi = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To derLi
    If Left(Cells(i, 3), InStr(Cells(i, 3), ".)")) = Left(Cells(i + 1, 3), InStr(Cells(i + 1, 3), ".)")) Then
        If CellsToSuppr Is Nothing Then
            Set CellsToSuppr = Cells(i + 1, 3)
            RIMANE = Cells(i, 3).Value          'questa è la prima parte della stringa rimanente
            PRIMARIGA = i
        Else: Set CellsToSuppr = Union(CellsToSuppr, Cells(i + 1, 3))
        End If
    End If
Next i

For Each K In CellsToSuppr                      'aggiungiamo anche gli altri pezzi...
    If InStr(1, K, R) > 0 Then
            RIMANE = RIMANE & ESTRAI(K.Value, ".)")
        End If
Next

If Not CellsToSuppr Is Nothing Then CellsToSuppr.EntireRow.Delete

RIMANE = Replace(RIMANE, ". ", ", ")    '"trasforma" i punti in virgole (a fini estetici)

Cells(PRIMARIGA, 3).Formula = RIMANE
End Sub


'________________________________________________________________________

Function ESTRAI(TESTO As String, SEPARATORE As String)
'RESTITUISCE SOLO LA PARTE DI TESTO CHE SEGUE IL SEPARATORE
    ' TESTO: La stringa un cui cercare
    ' SEPARATORE: La parte di testo da usare per capire dove "tagliare" TESTO
       
    E1 = Split(TESTO, SEPARATORE, 2)
    If UBound(E1) > 0 Then
        ESTRAI = E1(1)
    Else
        ESTRAI = ""
    End If
End Function




Ciao!
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi iRiMiKi » 07/07/10 13:25

La modifica che ha proposto Maxmula in linea di massima funziona ma non tiene conto del fatto che il concatenamento (e anche eliminazione delle righe) devono avvenire solo per le righe uguali nella loro parte iniziale (fino al separatore ".)")

Ad esempio, se ho queste righe qui:

accomodamento : (com.) componenda.
accomodamento : (com.) compromiso.
acconto : (com.) senal.
accordo : (com.) concertación.
accordo : (com.) concierto.
accordo : (com.) iguala.

devono essere trasformate così:

accomodamento : (com.) componenda, compromiso.
acconto : (com.) senal.
accordo : (com.) concertación, concierto, iguala.

Penso di aver risposto anche alla domanda posta da Flash.
iRiMiKi
Utente Junior
 
Post: 10
Iscritto il: 12/03/10 13:55

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi maxmula » 07/07/10 13:47

Beh... la mia funzione ti restituisce la parte che segue il separatore.
Occorre solo aggiungere qualche controllo per capire se va chiamata o no ;-)

MAx

PS. Se non risolvi da solo e nel frattempo qualcuno non posta una soluzione migliore, stasera provo a dare un' occhiata un po' più approfondita. Ora purtroppo non posso...
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi Anthony47 » 07/07/10 15:23

Forse questa macro.
Genera il nuovo elenco in Foglio3 (ma lo puoi variare nell' istruzione marcata <<<).
Codice: Seleziona tutto
Sub Antmik()
Dim CPreamb As String, CStrOut As String, SComp
'
CSep = ".)"
OutSh = "Foglio3"    '<<< Foglio di Uscita; SARA' AZZERATO!
'
CPreamb = "": CStrOut = ""
Sheets(OutSh).Cells.Clear
'
For I = 1 To Cells(Rows.Count, 1).End(xlUp).Row
SComp = Split(Cells(I, 1).Value, CSep)
If UBound(SComp) < 1 Then GoTo SkipR
If CPreamb = SComp(0) Then
    CStrOut = Left(CStrOut, Len(CStrOut) - 1) & "," & SComp(1)
Else
    If CStrOut <> "" Then _
        Sheets(OutSh).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = CStrOut
    CStrOut = Cells(I, 1).Value
    CPreamb = SComp(0)
End If
SkipR:
Next I
If CStrOut <> "" Then _
    Sheets(OutSh).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = CStrOut
End Sub

Ciao, fai sapere.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi iRiMiKi » 07/07/10 15:42

Ho modificato la procedura aggiungendo il ramo Else:

Sub elimina_righe()
......................
For i = 1 To derLi
If Left(Cells(i, 3), InStr(Cells(i, 3), ".)")) = Left(Cells(i + 1, 3), InStr(Cells(i + 1, 3), ".)")) Then
.....................
Else:
If Not CellsToSuppr Is Nothing Then

For Each k In CellsToSuppr 'aggiungiamo anche gli altri pezzi...
If InStr(1, k, R) > 0 Then
RIMANE = RIMANE & ESTRAI(k.Value, ".)")
End If
Next k

RIMANE = Replace(RIMANE, ". ", ", ") '"trasforma" i punti in virgole (a fini estetici)
Cells(PRIMARIGA, 3).Formula = RIMANE

CellsToSuppr.EntireRow.Delete
Set CellsToSuppr = Nothing
End If
End If
Next i
End Sub

Funziona tutto, grazie Max per il prezioso aiuto!

RINGRAZIO ANCHE ANTHONY, proverò anche la tua versione.

PS una curiosità... in InStr(1, k, R) che cos'è la variabile R? non ne vedo nessuna definizione
iRiMiKi
Utente Junior
 
Post: 10
Iscritto il: 12/03/10 13:55

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi maxmula » 07/07/10 21:57

iRiMiKi ha scritto:PS una curiosità... in InStr(1, k, R) che cos'è la variabile R? non ne vedo nessuna definizione


In realtà la "variabile non documentata è "1"... :)

Come si legge nelle pagine di help di Excel ;)

    InStr([inizio, ]stringa1, stringa2[, confronto])

    La sintassi della funzione InStr è composta dai seguenti argomenti:

    inizio Facoltativa. Espressione numerica che definisce la posizione di inizio per ciascuna ricerca. Se omessa, la ricerca inizia dalla posizione del primo carattere. (...)
    stringa1 Obbligatoria. Espressione stringa oggetto della ricerca.
    stringa2 Obbligatoria. Espressione stringa cercata.
    confronto Facoltativa. Specifica il tipo di confronto di stringa. (...)

In questo caso la variabile R prende il posto di stringa2 (di solito preferisco specificare sempre la posizione di partenza... il codice mi sembra più leggibile).

Ciao,
Max
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi maxmula » 07/07/10 22:00

Dimenticavo un PS... Quando intendi postare del codice, usa il tago [code]; Quando intendi impaginare una lista, usa il tag [list]. Trovi i pulsanti appena sopra la finestra in cui scrivi il messaggio... ed il tuo post diventa MOLTO più leggibile! ;)

Alla prossima!
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VBA EXCEL: eliminare righe verificando una condizione

Postdi iRiMiKi » 09/07/10 20:50

Grazie Max! Seguirò le tue indicazioni.
Alla prossima, e complimenti a tutti voi per la disponibilità e la competenza degli interventi.
iRiMiKi
Utente Junior
 
Post: 10
Iscritto il: 12/03/10 13:55


Torna a Applicazioni Office Windows


Topic correlati a "VBA EXCEL: eliminare righe verificando una condizione":


Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti