Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao mega, Ciao Sandro,
Ho deciso di affrontare il compito con un approccio diverso. Quindi, prova qualcosa del genere:
crea una Userform con un controllo ListBox, un controllo Label e un controllo CommandButton.
Nel modulo di codice della Userform, incolla il seguente codice:
'=========>>
Option Explicit
'--------->>
Private Sub CommandButton1_Click()
Dim sProvincia As String
Dim i As Long
With Me.ListBox1
i = .ListIndex
sProvincia = .List(i, 1)
Call FiltraFogli(sProvincia)
End With
Unload Me
End Sub
'--------->>
Private Sub UserForm_Initialize()
Dim WB As Workbook
Dim SH As Worksheet
Dim Rng As Range
Set WB = ThisWorkbook
Set SH = WB.Sheets("Elenco Provincie")
Set Rng = SH.Range("A1").CurrentRegion.Resize(, 4)
With Rng
Set Rng = .Offset(1).Resize(.Rows.Count - 1, 4)
End With
With Me
With .Label1
.Caption = "Seleziona PROVINCIA"
.Font.Bold = True
.ForeColor = RGB(0, 0, 256)
End With
With .CommandButton1
.Caption = "Crea Workbook"
.Font.Bold = True
.ForeColor = RGB(0, 0, 256)
End With
With .ListBox1
.ColumnCount = 4
.RowSource = Rng.Address(external:=True)
.ColumnHeads = True
End With
End With
End Sub
'<<=========
In un modulo standard, incolla il seguente codice:
'=========>>
Option Explicit
'--------->>
Public Sub FiltraFogli(sProvince As String)
Dim srcWB As Workbook, destWB As Workbook
Dim SH As Worksheet, destSH As Worksheet
Dim arrIn As Variant, arrOut() As Variant, arrHeaders As Variant
Dim srcRng As Range, destRng As Range, rngHeaders As Range
Dim sName As String
Dim LRow As Long
Dim i As Long, j As Long, k As Long
Dim iCtr As Long, iCol As Long, jCol As Long
Dim bHeaders As Boolean
Dim CalcMode As Long
Const sUltimaColonna As String = "T" '<<=== Modifica
Const sColonnaPrivincia As String = "J" '<<=== Modifica
Set srcWB = ThisWorkbook
With srcWB.Sheets(1)
iCol = .Columns(sColonnaPrivincia).Column
jCol = .Columns(sUltimaColonna).Column
End With
For Each SH In srcWB.Worksheets
With SH
Set srcRng = Nothing
If .Name <> "Elenco Provincie" Then
LRow = LastRow(SH, .Columns(sColonnaPrivincia))
Set srcRng = .Range("A2:" & sUltimaColonna & LRow)
If Not bHeaders Then
Set rngHeaders = srcRng.Rows(0)
arrHeaders = rngHeaders.Value
End If
End If
End With
If Not srcRng Is Nothing Then
arrIn = srcRng.Value
For i = LBound(arrIn) To UBound(arrIn)
If arrIn(i, iCol) = sProvince Then
iCtr = iCtr + 1
ReDim Preserve arrOut(1 To jCol, 1 To iCtr)
For j = 1 To jCol
arrOut(j, iCtr) = arrIn(i, j)
Next j
End If
Next i
End If
Next SH
If iCtr Then
Set destWB = Application.Workbooks.Add
sName = sProvince & Format(Date, "yyyymmdd") & "xlsx"
Set destRng = destWB.Sheets(1).Range("A2").Resize(iCtr, jCol)
On Error GoTo XIT
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
With destRng
.Value = Application.Transpose(arrOut)
.Rows(0).Value = arrHeaders
.EntireColumn.AutoFit
End With
destWB.SaveAs Filename:=sName, FileFormat:=51
Call MsgBox( _
Prompt:="Sono stato trovati " & iCtr & "record per la provincia " _
& sProvince _
& vbNewLine & vbNewLine _
& "I datati filtrati sono stati salvati nel file " & sName, _
Buttons:=vbInformation, _
Title:="REPORT")
Else
Call MsgBox( _
Prompt:="Non sono stato trovato alcun record per la provincia " & sProvince, _
Buttons:=vbInformation, _
Title:="REPORT")
End If
XIT:
With Application
.Calculation = CalcMode
.ScreenUpdating = True
End With
End Sub
'--------->>
Public Function LastRow(SH As Worksheet, _
Optional Rng As Range, _
Optional minRow As Long = 1)
If Rng Is Nothing Then
Set Rng = SH.Cells
End If
On Error Resume Next
LastRow = Rng.Find(What:="*", _
after:=Rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
If LastRow < minRow Then
LastRow = minRow
End If
End Function
'<<=========
Per gli scopi della mia prova ho creato un file con 44 fogli mensil, da Gennaio 2013 a Agosto 2016, e ho sfruttato i dati di Sandro, modificandoli per ogni foglio con l'inserimento della data (mese & anno) del foglio di interesse nelle colonne D:F e Q; nella colonna J dei fogli mensili, ho inserito, in modo casuale, i nomi di provincie italiane. Ho anche inserito un primo foglio (Elenco Provincie) con una tabella delle provincie italiane e un pulsante per avviare la Userform.
Nonostante il numero di fogli e le dimensioni del file, mi pare che il codice sia molto veloce.
Potresti scaricare il mio file di prova Mega20160824.xlsm a:
https://www.dropbox.com/s/9a36kxijjbpsci5/Mega20160824.xlsm?dl=0
===
Regards,
Norman