Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

duplicazione fogli filtrati e separazione valori colonne

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

duplicazione fogli filtrati e separazione valori colonne

Postdi marcus69 » 29/05/20 21:28

Ciao a tutti,
di nuovo bloccato, ma stavolta la colpa è mia, il mio livello è ancora troppo basso.
Dal file di esempio allegato, devo creare 3 fogli che sono una selezione di quello che ho nel foglio principale: sorgente

Il foglio principale è un sorgente che aggiorno 2-3 volte al giorno, e non deve essere modificato.

Si aggiornano i tre file generati, quando lancio la mia macro

CRITERI DI SELEZIONE:

1) Nella colonna D, alcuni articoli inziano con 4aa altri con 4bb, devo filtrare i 4bb e non vederli in nessuno dei tre prossimi fogli e con il ciclo IF che allego, sembra funzionare.

2) creare tre nuovi foglio nel quale filtro per una tipologia

esempio solo coccodrillo, o solo tav. rosso, o solo macchina.

Le tipologie sono sempre e solo tre.

Credevo di esserci riuscito con i codice che allego, arzigogolato lo so, ma non trovato nulla di meglio che ciclare con gli "if" per tutte le tipologie che volevo escludere. E cancellare le righe una volta individuati i bersagli.
Ha funzionato per un po, poi a volte entra in loop e nulla mi muore la magia. Credo sia dovuto che aggiungo "1" alla variabile "elimina"
Pensavo di usare un

do until

ma non ho saputo implementarlo.
Ho provato una macro applicando i filtri in manuale ( le colonne son sempre quelle D ed E ) ma il numero di valori del filtro era troppo elevato nel file reale e si interrempeva la macro.
E quindi problema 2
come copio e filtro i dati della colonna E per la tipologia che mi interessa Le tipologie sono essenzialmente quattro

Parte più difficile,

3) Dopo aver generato la copia filtrata delle tre tipologie in un foglio singolo, ho necessita di dividere per la caratteristica dimensionale
nella cella E2, il prodotto "macchina rossa" ha le dimensioni 12x1
A me serve che il 12 e l'1 vengano riportati nelle due colonne adiacenti all'ultima colonna occupata, in questo caso la I e la J.
Anche qui, ho provato con " testo in colonne abbinata ad una macro", con le funzioni tronca estra destra sinistra, ma nulla, trovo sempre un errore, o non fa quello che deve su tutte le celle, o quando funziona lo fa con troppi parametri dentro formule excel che non sono in grado di tradurre in VBA, potrei anche copiare solo le celle interessate dal voglio sorgente e lasciar le formule di estrazione, ma è sempre un compromesso. ( esempio il foglio coccodrillo esempio creato per spiegare cosa devo ottenere)

come estraggo dalla colonna E i dati dimensionali in ogni singolo dei tre fogli filtrati dai punti 1 e 2?
Può aiutare che il dato dimensionale è SEMPRE il primo dato numerico dopo le lettere della descrizione?
Se io ho l'oggetto "macchina rossa che vola veloce" dopo avrò sempre un numero che è il primo dato dimensionale, separato dal secondo dato dimensionale o da una x o da una X (lettera ics minuscola o maiuscola )

Sono davvero arenato, è 4 giorni che ci provo, a raffazono e nn concludo :-(

Grazie a tutti



Codice: Seleziona tutto
Sub tabellapiv()
      Application.ScreenUpdating = False
        Sheets("coccodrillo").Select
   Range("A1:Z10000").Select
    Selection.ClearContents
    Range("A1").Select
    Sheets("sorgente").Select
    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("coccodrillo").Select
    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    ActiveSheet.Paste
 
elimina = 2
ultima_riga_gc = Sheets("coccodrillo").Range("A" & Rows.Count).End(xlUp).Row
For elimina = 2 To ultima_riga_gc
        If InStr(Cells(elimina, 5).Value, "sedia") Then
        Cells(elimina, 5).EntireRow.Delete
        elimina = elimina - 1
        If Cells(elimina + 1, 5) = 0 Then Exit For
        End If
Next elimina
 
elimina = 2
ultima_riga_gc = Sheets("coccodrillo").Range("A" & Rows.Count).End(xlUp).Row
For elimina = 2 To ultima_riga_gc
        If InStr(Cells(elimina, 5).Value, "tav.") Then
        Cells(elimina, 5).EntireRow.Delete
        elimina = elimina - 1
        If Cells(elimina + 1, 5) = 0 Then Exit For
        End If
Next elimina

elimina = 2
ultima_riga_gc = Sheets("coccodrillo").Range("A" & Rows.Count).End(xlUp).Row
For elimina = 2 To ultima_riga_gc
        If InStr(Cells(elimina, 4).Value, "4bb") Then
        Cells(elimina, 5).EntireRow.Delete
        elimina = elimina - 1
        If Cells(elimina + 1, 5) = 0 Then Exit For
        End If
Next elimina
elimina = 2
ultima_riga_gc = Sheets("coccodrillo").Range("A" & Rows.Count).End(xlUp).Row
For elimina = 2 To ultima_riga_gc
        If InStr(Cells(elimina, 4).Value, "Q") Then
        Cells(elimina, 5).EntireRow.Delete
        elimina = elimina - 1
        If Cells(elimina + 1, 5) = 0 Then Exit For
        End If
Next elimina
End Sub



file esempio http://www.filedropper.com/esempio
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39

Sponsor
 

Re: duplicazione fogli filtrati e separazione valori colonne

Postdi Anthony47 » 30/05/20 23:10

In linea di massima, quando si elimina qualche riga conviene organizzare i cicli dal fondo verso l'inizio; tipo
For elimina = ultima_riga_gc to 2 step -1 /Next elimina

Questo ci risparmia il bisogno di correggere manualmente il pointer.

Pero' secondo me la stai facendo piu' complicata di quel che serve
Infatti, ti dovrebbe bastare utilizzare il filtro automatico, applicandolo sul foglio Sorgente; poi copi i valori rimasti e incolli sul foglio opportuno.
Inoltre tutto e' gestibile con una macro autoregistrata.

Quindi il mio suggerimento:
-imposta il filtro automatico sulle colonne A:H del foglio Sorgente e filtra colonna B con un criterio qualsiasi
-seleziona il foglio Coccodrillo, cella B1
-avvia la registrazione di una macro
-seleziona il foglio Sorgente e rimuovi il filtro tramite tab Dati /gruppo Ordina e filtra /icona Cancella
-applica il filtro su colonna D, scegliendo "Non inizia con" e come valore " 4bb"
-applica ora il filtro alla colonna E, scegliendo la chiave che identifica che cosa vorresti; ho capito che il filtro per la prima scelta potrebbe essere "Contiene" e come valore "Coccodrillo"
-seleziona ora le colonne intere da A a J, e Copiale
-seleziona ora il foglio Coccodrillo, seleziona A1, fai Incolla (o IncollaSpeciale-qualcosa)
-premi il tast Esc
-Ferma la registrazione

A questo punto dovresti avere una macro idonea per filtrare il primo valore e copiarlo sul suo foglio

Ti ho fatto selezionare da colonna A a colonna J perche' sul foglio Sorgente con questa macro popoleremo le colonne I-J con le "dimensioni":
Codice: Seleziona tutto
Sub EstraiAxB()
Dim I As Long, J As Long, mySplit, xPos
'
Range("I:J").Clear
For I = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    mySplit = Split(Replace(Cells(I, "E").Value & " A E", ".", ",", , , vbTextCompare), " ", , vbTextCompare)
        For J = 0 To UBound(mySplit)
            xPos = InStr(1, mySplit(J), "x", vbTextCompare)
            If xPos > 0 Then
                Cells(I, "I").Value = CSng(Left(mySplit(J), xPos - 1))
                Cells(I, "J").Value = CSng(Mid(mySplit(J), xPos + 1))
                Exit For
            End If
        Next J
Next I
End Sub
Questa va messa in un Modulo standard del tuo vba e poi richiamata dalla macro autoregistrata subito dopo l'istruzione che seleziona il foglio Sorgente:
Codice: Seleziona tutto
'istruzioni
Sheets("Sorgente").Select    '<<< INSERIRE QUESTA RIGA
Call EstraiAxB
'continua

Se non vuoi "sporcare" il foglio Sorgente puoi inserire la Call EstraiAxB dopo l'istruzione che incolla i dati sul foglio di destinazione.
Non dovresti aver difficolta' a modificare il codice di questa macro affinche' possa filtrare non per "Contiene-Coccodrillo" ma "Contiene-LaSecondaScelta" e poi "Contiene -LaTerzaScelta" e copi su rispettivi fogli.

Questo e' tutto
Puo' essere comunque prudente esaminare il codice della macro autoregistrata per essere certi che indirizza sempre l'intero contenuto di Sorgente; pubblica quindi il codice generato, poi mentre tu fai un po' di verifiche con dati reali, noi invece possiamo fare una verifica teorica sul codice prodotto.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: duplicazione fogli filtrati e separazione valori colonne

Postdi marcus69 » 31/05/20 09:42

Anthony47 ha scritto:In linea di massima, quando si elimina qualche riga conviene organizzare i cicli dal fondo verso l'inizio; ....
.....
Ciao


Intanto grazie, mi hai dato degli spunti e delle soluzioni eccellenti.
Sul filtro, faccio fatica ad usare la macro registrata: ho qualcosa come 3000 articoli e la macro registrata mi dice " troppe " righe e mi lascia fuori dei valori.
Ma con lo step-1 credo sia molto più agevole, adesso mi ci metto.

Poi cerco di capire la "Call EstraiAxB" che è splendida, ma non ci sarei mai arrivato a " tradurla in VBA "

Provo un po e vedo cosa esce
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39

Re: duplicazione fogli filtrati e separazione valori colonne

Postdi Anthony47 » 31/05/20 10:29

Sul filtro, faccio fatica ad usare la macro registrata: ho qualcosa come 3000 articoli e la macro registrata mi dice " troppe " righe e mi lascia fuori dei valori.
Uso il filtro avanzato su tabelle da 80-120mila righe e mi trovo bene, non capisco coma puo' andare in crisi con 3000 righe :-? anche perchè "a occhio" mi pare che hai Office 2016...

Dopo che hai pigiato sulla freccia verticale sull'intestazione di colonna devi scegliere "Filtri per testo", poi "Filtro personalizzato..."; a questo punto hai la possibilita' di scegliere una vasta gamma di condizioni, quali "Uguale a" /"Diversa da" / "Inizia con" /"Non inizia con" /"Contiene" /"Non contiene" e molte altre (le scelte piu' comuni possono anche essere selezionate in alternativa a "Filtro personalizzato")

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: duplicazione fogli filtrati e separazione valori colonne

Postdi marcus69 » 31/05/20 14:46

sei da sposare... non si finisce mai d'imparare !!!!!
1) non avevo mai "scoperto" il filtro personalizzato in macro, funziona alla grande ! altro che i miei cicli "if"
( per altro ho provato per curiosità ed è fantastico il partire dall'ultimo a salire, l ho usato in un altro foglio è molto piu pratico e veloce, circa 50 secondi di differenza )

2) la soluzione per l'estrazione dei numeri, è spettacolo però devo chiederti :

a) come funziona
b) è possibile già in esecuzione MACRO formattare i numeri come

12,6867654 = 12,68
13,00 = 13
e cosi via? ci sto provando con TRUNC ROUND e formati personalizzati ma o da una parte o dall'altra mi inchiodo o zero decimali o visualizzo gli zero dopo il numero intero

Codice: Seleziona tutto
Sub EstraiAxB()
Dim I As Long, J As Long, mySplit, xPos   ' ok dichiari il formato delle variabili
'
Range("I:J").Clear   ' pulisci il precedente
For I = 2 To Cells(Rows.Count, 1).End(xlUp).Row 'inizi il ciclo
    mySplit = Split(Replace(Cells(I, "F").Value & " A E", ".", ",", , , vbTextCompare), " ", , vbTextCompare) ' dichiari la variabile mysplit e qui mi perdo :
SPLIT è una funzione VBA? che spezza il contenuto della cella?
REPLACE idem? funziona VBA che sostituisce il valore nella cella "target".....
e dopo VALUE non so più leggerla


        For J = 0 To UBound(mySplit) ' non conosco questa funzione UBOUND
            xPos = InStr(1, mySplit(J), "x", vbTextCompare)  ' verifichi e usi come puntatore la lettera x
            If xPos > 0 Then ' inizi il controllo e gli dici di
                Cells(I, "I").Value = CSng(Left(mySplit(J), xPos - 1)) ' mettere una parte a sinistra
                Cells(I, "J").Value = CSng(Mid(mySplit(J), xPos + 1)) 'l'altra parte a destra
                Exit For ' chiudi il ciclo e riparti....
            End If
        Next J
Next I
End Sub
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39

Re: duplicazione fogli filtrati e separazione valori colonne

Postdi Anthony47 » 31/05/20 16:44

In ordine sparso:
-Split, Replace, UBound sono istruzioni vba; per descrizione, sintassi ed esempi di uso devi chiedere all'help on line del vba (1 click sulla parola, premi F1)
-ho usato Replace perche' qualche simpaticone invece della "virgola" usa il "punto"
-uso Split per segmentare il contenuto della cella, poi cerco lo spezzone che ha una "x"
-per arrotondare i numeri puoi usare Round; es ... = Round(CSng(Left(mySplit(J), xPos - 1)), 2) In questo modo 0,788 diventa 0,79; se invece vuoi ignorare le cifre successive allora suggerisco di usare, invece di Round, Application.WorksheetFunction.RoundDown

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: duplicazione fogli filtrati e separazione valori colonne

Postdi marcus69 » 01/06/20 15:01

perfetto
1) ho usato il metodo di filtraggio che mi hai insegnato
2) applicato i round come hai scritto

ho ottenuto quello che serviva

Ho optato per filtrare DOPO la copia
sono livelli di lavoro diversi ed è piu pratico, una finezza per la produzione.

Ora succede una cosa buffa, ma apro un altro post...
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39


Torna a Applicazioni Office Windows


Topic correlati a "duplicazione fogli filtrati e separazione valori colonne":


Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti