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