Condividi:        

Excel - Estrattore dati da tutti i fogli

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

Excel - Estrattore dati da tutti i fogli

Postdi LordFly » 31/05/13 16:48

Buongiorno a tutt*

Mi sono appena iscritto al vostro notevole forum per chiedervi un aiuto, e mi spiace piombare così tra capo e collo solo per questa ragione. In genere cerco di risolvere in totale autonomia i miei problemi cercando in lungo e in largo sul web (e su PC-Facile, ovviamente) e senza disturbare, ma questa volta proprio non riesco a venirne a capo e sono convinto che la risoluzione sia piuttosto semplice. A condizione di conoscere il VBA, naturalmente. Ed è una cosa che ancora mi sfugge, ecco, mentre quando si tratta di apportare modifiche di "buon senso" allora me la sono sempre cavata.

Premetto che il quesito riguarda un file di lavoro non mio, si tratta di un consiglio richiestomi gratis et amore dei da un mio consulente per conto di un suo cliente. Insomma, un atto di volontariato, e mi sembra doveroso sottolinearlo prima di chiedere un aiuto.

Aggiungo inoltre che ho cercato sul forum qualcosa che potesse essermi utile, ma non ho trovato nulla. Almeno credo, nel senso che se ho cercato male siete liberissimi di fustigarmi!

Termino qui le premesse per non farvi perdere ulteriore tempo e passo al dunque. Orbene:

- ho un file Excel contenente un centinaio di fogli (il numero totale è variabile), ciascuno rappresenta un singolo fornitore;
- ogni foglio è strutturato nella stessa maniera, ossia stesso numero di colonne, mentre il numero di righe è variabile;
- in ogni foglio sono presenti nella colonna H le date di scadenza degli ordini dei fornitori: tali date sono scritte nel formato gg/mm/aaaa se l'ordine deve essere ancora evaso, mentre la data viene manualmente modificata in "ddt xxxx del gg/mm/aaaa" non appena l'ordine viene evaso.

Ora, l'obiettivo è quello di realizzare uno scadenziario "dinamico", ossia che mi vada ad inserire in un unico foglio di lavoro l'elenco completo dei fogli presenti all'interno del file, andando poi a fare un copia/incolla delle date presenti nelle colonne H di ciascun foglio per poi calcolare con una normale formula quali sono le date più vicine alla scadenza.

Per quanto riguarda il primo passaggio, ossia l'estrazione dei nomi dei file, ho adoperato questa sintassi:

Codice: Seleziona tutto
Private Sub EstraiNomiFogli_Click()
Dim i As Integer
Dim fg As String
For i = 2 To ThisWorkbook.Sheets.Count
fg = ThisWorkbook.Sheets(i).Name
' Dentro "fg" avrò il nome del foglio di lavoro corrente
Cells(i + 2, 2).Value = fg
' Questo parametro permette di posizionare l'elenco dei fogli di lavoro
Next i
End Sub


Sono anche mezzo convinto di aver estrapolato tale codice dal vostro forum, spero mi perdonerete se così fosse.

Ritorniamo a noi: con questa macro vado a leggere tutti i nomi dei fogli e li "stampo" nel foglio che ho chiamato "Indice" in colonna a partire dalla cella B4.

A questo punto ho provato a mixare un po' di roba, per cui nelle mie intenzioni ho cercato di leggere tramite macro il nome del foglio di lavoro come riferimento per poi andare nel foglio stesso, applicare un filtro nella colonna H che vada a riconoscere solo le celle contenenti una data e a fare un copia/incolla trasposto nella riga corrispondente al nome del foglio in cui ha letto i dati:

Codice: Seleziona tutto
Sub Estrattore()

    Dim strWsName As String
   
    strWsName = Range("B4").Text
    Sheets(strWsName).Select
    Range("A12:L12").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=8, Criteria1:=">01/01/2000", Operator:=xlAnd
    Range("H13:H200").Select
    Selection.Copy
    Sheets("Indice").Select
    Range("G4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    strWsName = Range("B4").Text
    Sheets(strWsName).Select
    Range("A12:L12").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("A12").Select
    Sheets("Indice").Select
    Range("A1").Select
End Sub


Il che funziona anche, ma impostato in questa maniera dovrei scrivere il codice per ogni riga, il che mi sembra delirante. Esiste dunque un modo per "routinare" la macro, in modo che venga eseguita per tutti i strWsName = Range("B4").Text da B4 fino a dove nella cella esiste un dato (dunque da 4 a n) e interrompersi qualora la cella fosse vuota, andando a prelevare i dati e incollandoli in G4 (dunque da G a XX)?

Non vorrei aver messo troppa carne al fuoco e spero di essermi spiegato in maniera abbastanza esaustiva, qualora aveste bisogno vi allego volentieri un file di prova per meglio capire come desidererei far funzionare il tutto.

Vi ringrazio di cuore per l'attenzione e vi auguro una magnifica serata.


Daniele
Daniele

Windows 7 + Office 2010
Windows 7 + Office 2003
LordFly
Newbie
 
Post: 5
Iscritto il: 31/05/13 16:08
Località: Pavia

Sponsor
 

Re: Excel - Estrattore dati da tutti i fogli

Postdi Anthony47 » 01/06/13 12:06

Ciao LordFly, benvenuto nel forum
Purtroppo mi sono perso seguendo il tuo discorso, anche perche' hai dedicato 3 righe alla descrizione del problema (quindi con precisione abbastanza vaga) e tutto il resto a come hai pensato di affrontare quel problema.
Mi fermo quindi alla richiesta
Esiste dunque un modo per "routinare" la macro, in modo che venga eseguita per tutti i strWsName = Range("B4").Text da B4 fino a dove nella cella esiste un dato (dunque da 4 a n) e interrompersi qualora la cella fosse vuota, andando a prelevare i dati e incollandoli in G4 (dunque da G a XX)?

Questa e' una revisione della tua seconda macro che penso faccia quello che dici:
Codice: Seleziona tutto
    Sub Estrattore()

        Dim strWsName As String

For JJ=4 to Sheets("Indice").cells(rows.count,"B").End(xlup).row   
strWsName = Sheets("Indice").Range("B" & JJ).Text         

'        strWsName = Range("B4").Text      'EE
        Sheets(strWsName).Select
        Range("A12:L12").Select
        Selection.AutoFilter
        Selection.AutoFilter Field:=8, Criteria1:=">01/01/2000", Operator:=xlAnd
        Range("H13:H200").Select
        Selection.Copy
sheets("Indice").cells(rows.count,"G").End(xlUp).Offset(1,0).PasteSpecial _
     Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True


'        Sheets("Indice").Select
'        Range("G4").Select
'        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
'        strWsName = Range("B4").Text
'        Sheets(strWsName).Select
        Range("A12:L12").Select
        Application.CutCopyMode = False
        Selection.AutoFilter
        Range("A12").Select
Next JJ
        Sheets("Indice").Select
        Range("A1").Select
    End Sub

Per fare in modo che copi da G4 di Indice devi inserire una intestazione in G3 (che quindi non deve essere vuota).

Prova dopo aver fatto le classiche "due copie di backup" dei tuoi dati.

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

Re: Excel - Estrattore dati da tutti i fogli

Postdi LordFly » 06/06/13 12:06

Ciao Anthony, in primis grazie per la cortese risposta e scusa se replico solo ora, ma sono stato piuttosto impegnato in questo periodo.
Accetto la "reprimenda" perché hai perfettamente ragione :)
Con l'ansia di spiegare e presentarmi allo stesso tempo ho fatto un bel mischione, e me ne scuso. Appena ho qualche istante libero provo la tua soluzione e ovviamente ti aggiorno sull'esito della stessa.
In ogni caso se pensi che il problema possa essere risolto in maniera diversa, sarei ben lieto di ricevere un tuo/vostro consiglio!
Daniele

Windows 7 + Office 2010
Windows 7 + Office 2003
LordFly
Newbie
 
Post: 5
Iscritto il: 31/05/13 16:08
Località: Pavia

Re: Excel - Estrattore dati da tutti i fogli

Postdi LordFly » 10/06/13 10:34

Caro Anthony.

Ho appena fatto una prova con lo script che mi hai gentilmente modificato e ci ho messo un po' a capire l'inghippo: con questa sintassi l'inserimento è scalare, ma prescinde dal fatto che trovi i dati o meno.

Mi spiego: se la cella B4 rimanda a "fornitore 1" lo script va a prendere le date nel foglio corrispondente e le copia correttamente nella riga 4.
Se la cella B5 rimanda a "fornitore 2" e in questo foglio non vi sono date lo script non copia nulla, e va bene.
Se la cella B6 rimanda a "fornitore 3" e ci sono date copiabili, queste verranno copiate all'altezza nella riga 5 anziché nella 6, ossia non tiene conto della riga che dovrebbe restare vuota.

Hai qualche idea su come risolvere la querelle?

Grazie mille per l'attenzione!
Daniele

Windows 7 + Office 2010
Windows 7 + Office 2003
LordFly
Newbie
 
Post: 5
Iscritto il: 31/05/13 16:08
Località: Pavia

Re: Excel - Estrattore dati da tutti i fogli

Postdi Flash30005 » 10/06/13 16:03

Ciao LordFly e benvenuto anche da parte mia

Non ho la possibilità di provare questa modifica ma mi sembra che è sufficiente sostituire questa riga codice
Codice: Seleziona tutto
sheets("Indice").cells(rows.count,"G").End(xlUp).Offset(1,0).PasteSpecial _
     Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

con questa
Codice: Seleziona tutto
sheets("Indice").Range("G" & JJ).PasteSpecial _
     Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True


fai sapere

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel - Estrattore dati da tutti i fogli

Postdi LordFly » 17/06/13 14:16

Eccomi, ho avuto modo di provare la tua implementazione e funziona alla perfezione, sei stato gentilissimo!
In realtà l'ho poi adoperata per un mio file personale di contabilità, mentre ho preferito per l'estrattore dati in oggetto una combinazione tra la macro iniziale ed una formula che prevede un "conta.se" integrante un "indiretto" in modo da mostrare a video le date in una sorta di scadenziario grafico. Tra l'altro usando una formula proposta tempo addietro in questo forum dallo stesso Anthony.
La soluzione da me scelta mi consente di definire un range più ampio di righe, eliminando il problema di fogli di lavoro che iniziano in righe diverse e che mi davano problemi con la macro.
Poi se può servire a qualcuno, ripulisco il tutto dai dati e lo allego alla discussione, come preferite e siete abituati voi!
Daniele

Windows 7 + Office 2010
Windows 7 + Office 2003
LordFly
Newbie
 
Post: 5
Iscritto il: 31/05/13 16:08
Località: Pavia

Re: Excel - Estrattore dati da tutti i fogli

Postdi Anthony47 » 18/06/13 01:54

Grazie del riscontro.
Immagino comunque che si tratti di una realizzazione abbastanza personalizzata, per dire "quindi di difficile adattamento a bisogni di altri utenti"; all' occorrenza ripartiranno dalle macro presentate nella discussione.
Alla prossima, dunque...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Estrattore dati da tutti i fogli

Postdi LordFly » 20/06/13 00:05

Hai ragione, nel caso qualche utente in futuro dovesse avere bisogno, allegherò volentieri il file.
Intanto grazie di cuore a tutti per il cortese aiuto!
Daniele

Windows 7 + Office 2010
Windows 7 + Office 2003
LordFly
Newbie
 
Post: 5
Iscritto il: 31/05/13 16:08
Località: Pavia


Torna a Applicazioni Office Windows


Topic correlati a "Excel - Estrattore dati da tutti i fogli":


Chi c’è in linea

Visitano il forum: Nessuno e 30 ospiti