Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao FD_PiedPiper.
grazie mille per il lavoro che stai svolgendo, sei davvero molto gentile.
Prego!
Il tuo file funziona alla perfezione, ho modificato la directory per Conteggi e funziona ma ora non riesco a modificare IntervalloDati, quello che per te è A1:A4:
- A1 (Ovvero l'intestazione del file) corrisponde a C1
- B1 corrisponde a U2
- C1 corrisponde a V2
- D1 corrsponde a W2
Ti allego un archivio simile al tuo ma contenente 4 file nella directory Conteggistrutturati in maniera identica a quella effettiva. (sostitutivi dei tuoi File#1, File#2 e File#3)
Le celle U2, V2 e W2 sono il risultato di una MATR.SOMMA.PRODOTTO , spero non sia un problema, mentre la cella C1 è quella che contiene l'intestazione del file.
Di seguito link dropbox per l'archivio: https://goo.gl/jzQ2G5
I problemi che hai riscontrato sono dovuti a due fatti:
- Le celle dell'intestazione ed i dati non è un intervallo di celle contiguo
- Le tre celle per i dati si trovono sulla stessa riga anzichè la stessa colonna.
Pertanto consegue che non si può caricare l'array dei dati (arrIn) con una semplice assegnazione come era possibile nel caso, originariamente indicato da te, di un intervalo contiguo e verticale. Quindi, prova quanto segue.
Nel modulo di codice dell'oggetto ThisWorkbook il codice rimane invariato, ossia:
'=========>>
Option Explicit
'--------->>
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Call CleanOldData
Call UnhideSheets
Call CreateFileList
Call LoadData
Application.ScreenUpdating = True
End Sub
'--------->>
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim SH As Worksheet
Me.Sheets(sFoglioWelcome).Visible = xlSheetVisible
For Each SH In Me.Sheets
With SH
If .Name <> sFoglioWelcome Then
.Visible = xlSheetVeryHidden
End If
End With
Next SH
End Sub
'<<=========
Nel modulo standard, sostituisci il codice precedente con la seguente versione:
'=========>>
Option Explicit
Public destWB As Workbook
Public destSH As Worksheet
Public arrFile() As Variant
Public arrOut() As Variant
Public Const sPercorso As String = _
"C:\Users\Deca-\Desktop\FD_PiedPiper20171122_PROVA\PROVA\Conteggi"
Public Const sFoglioReport As String = "Report" '<<=== Modifica
Public Const sFoglioWelcome As String = "Benvenuto" '<<=== Modifica
'--------->>
Public Sub UnhideSheets()
Dim SH As Worksheet
With destWB
For Each SH In .Sheets
SH.Visible = xlSheetVisible
Next SH
.Sheets(sFoglioWelcome).Visible = xlSheetVeryHidden
End With
End Sub
'--------->>
Public Sub CreateFileList()
Dim oFSO As Object
Dim oFolder As Object
Dim oFiles As Object
Dim oFile As Object
Dim i As Long, iFiles As Long, iCtr As Long
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sPercorso)
Set oFiles = oFolder.Files
iFiles = oFiles.Count
ReDim arrFile(1 To iFiles)
For Each oFile In oFiles
iCtr = iCtr + 1
arrFile(iCtr) = oFile.Name
Next oFile
End Sub
'--------->>
Public Sub CleanOldData()
Set destWB = ThisWorkbook
Set destSH = destWB.Worksheets(sFoglioReport)
destSH.Cells.ClearContents
End Sub
'--------->>
Public Sub LoadData()
Dim srcWB As Workbook
Dim srcSH As Worksheet
Dim srcRngDati As Range, srcRngIntestazione As Range
Dim destRng As Range
Dim arrIn(1 To 4) As String
Dim sStr As String, sPath As String, sFullName As String
Dim i As Long, j As Long, k As Long
Dim UB As Long, iCtr As Long
Dim CalcMode As Long
Const sIntervalloIntestazione As String = "C1" '<<=== Modifica
Const sIntervalloDati As String = "U2:W2" '<<=== Modifica
UB = Range(sIntervalloDati).Cells.Count '\ Any sheet!
On Error GoTo XIT
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
sStr = .PathSeparator
End With
If Right(sPercorso, 1) = sStr Then
sPath = sPercorso
Else
sPath = sPercorso & sStr
End If
For i = 1 To UBound(arrFile)
sFullName = sPath & arrFile(i)
Set srcWB = Workbooks.Open(sFullName)
Set srcSH = srcWB.Sheets(1)
With srcSH
Set srcRngIntestazione = srcSH.Range(sIntervalloIntestazione)
Set srcRngDati = srcSH.Range(sIntervalloDati)
End With
If Application.Sum(srcRngDati) <> 0 Then
iCtr = iCtr + 1
arrIn(1) = srcRngIntestazione.Value2
For j = 1 To srcRngDati.Rows.Count - 1
arrIn(i + 1) = srcRngDati.Cells(i).Value2
Next j
ReDim Preserve arrOut(1 To UB, 1 To iCtr)
For k = 1 To UB
arrOut(k, iCtr) = arrIn(k)
Next k
End If
srcWB.Close SaveChanges:=False
Next i
If CBool(iCtr) Then
Set destRng = destSH.Range("A1").Resize(iCtr, UB)
With destRng
.Value2 = Application.Transpose(arrOut)
.Columns(1).EntireColumn.AutoFit
End With
End If
XIT:
With Application
.Calculation = CalcMode
.ScreenUpdating = True
End With
End Sub
'--------->>
Public Function SheetExists(sSheetName As String, _
Optional ByVal WB As Workbook) As Boolean
On Error Resume Next
If WB Is Nothing Then
Set WB = ThisWorkbook
End If
SheetExists = CBool(Len(WB.Sheets(sSheetName).Name))
On Error GoTo 0
End Function
'<<=========
Esguendo il codice co i tuoi quattro file ottemngo i seguenti dati nel foglio Report:
Potresti scaricare il mio file di prova FD_PiedPiper20171123.xlsm
===
Regards,
Norman