Ciao Daniele,
Mi servirebbe una macro che mi faccia selezionare alcuni file presenti in una sottocartella chiamata: “da importare". I file da cui devo prelevare i dati hanno i dai nel range colonne A-E comprese e non sono formattati come tabelle, La prima riga è sempre l'intestazione.
Il numero di righe non è fisso (da 2 a ~15).
Vorrei che mi accodasse i dati in un file unico posto in una cartella diversa dai file origine. e che mi scrivesse, ad esempio nel foglio 2, i file che sono stati usati.
Spero nel vs. aiuto.
ps: excel 2016, mia conoscenza VBA: bassa
Prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice:
'===========>>
Option Explicit
'----------->>
Public Sub Tester()
Dim oFSO As Object
Dim oFile As Object
Dim oFiles As Object
Dim oFolder As Object
Dim srcWb As Workbook, destWB As Workbook
Dim srcSH As Worksheet
Dim destSH As Worksheet, destSH2 As Worksheet
Dim srcRng As Range, destRng As Range
Dim arrIn() As Variant, arrFilename() As Variant
Dim arrHeaders() As Variant
Dim sFilename As String
Dim iCtr As Long, jCtr As Long, kCtr As Long
Dim i As Long, j As Long
Dim iRows As Long, iCols As Long
Dim LRow As Long, LCol As Long
Dim sName As String
Const sPercorso As String = _
"**C:\Users\Daniele\File_Sorgenti**" '<<=== Modifica
Const sRiepilogo As String = "Riepilogo" '<<=== Modifica
Const sElencoFile As String = "File-Sorgenti" '<<=== Modifica
Const sNameType As String = "*.xlsx" '<<=== Modifica
Const sIntervalloDati As String = "A2:E13" '<<=== Modifica
Set destWB = ThisWorkbook
With destWB
On Error Resume Next
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.Sheets(sRiepilogo).ClearContents
.DisplayAlerts = True
Err.Clear
End With
On Error GoTo XIT
With destWB
Set destSH = .Sheets(1)
Set destSH2 = .Sheets(2)
End With
With destSH.Range(sIntervalloDati)
iRows = .Rows.Count
iCols = .Columns.Count
End With
End With
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sPercorso)
Set oFiles = oFolder.Files
For Each oFile In oFiles
With oFile
sFilename = .Name
If sFilename Like sNameType Then
kCtr = kCtr + 1
ReDim Preserve arrFilename(1 To kCtr)
arrFilename(kCtr) = sFilename
Set srcWb = Workbooks.Open(oFile)
Set srcSH = srcWb.Sheets(1)
Set srcRng = srcSH.Range(sIntervalloDati)
With srcRng
jCtr = iCtr
iCtr = iCtr + iRows
If Not IsArrayAllocated(arrHeaders) Then
arrHeaders = .Rows(0).Value
ReDim Preserve arrHeaders(1 To 1, 1 To .Columns.Count + 1)
arrHeaders(1, .Columns.Count + 1) = "File Originale"
End If
End With
ReDim Preserve arrIn(1 To iCols + 1, 1 To iCtr)
For i = 1 To iRows
For j = 1 To iCols
arrIn(j, jCtr + i) = srcRng.Cells(i, j).Value
Next j
arrIn(j, jCtr + i) = oFile.Name
Next i
srcWb.Close savechanges:=False
End If
End With
Next oFile
With destSH
.Name = sRiepilogo
Set destRng = destSH.Range("A2").Resize(iCtr, j)
destRng.Value = Application.Transpose(arrIn)
With destRng.Rows(0)
.Value = arrHeaders
.Font.Bold = True
End With
.UsedRange.EntireColumn.AutoFit
End With
With destSH2
.Name = sElencoFile
With .Range("A1")
.Font.Bold = True
.Value = sElencoFile
End With
.Range("A2").Resize(kCtr).Value = _
Application.Transpose(arrFilename)
.Columns(1).AutoFit
End With
Call MsgBox( _
Prompt:="Finito" & vbNewLine _
& vbNewLine _
& "I dati dei seguenti file sono stati importati " _
& "sul foglio " & sRiepilogo & ":" _
& vbNewLine _
& Join(arrFilename, vbNewLine), _
Buttons:=vbInformation, _
Title:="REPORT")
XIT:
Application.ScreenUpdating = True
End Sub
'--------->>
Public Function IsArrayAllocated(Arr As Variant) As Boolean
On Error Resume Next
IsArrayAllocated = IsArray(Arr) And _
Not IsError(LBound(Arr, 1)) And _
LBound(Arr, 1) <= UBound(Arr, 1)
End Function
'<<=========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel
- Salva il file con l’estensione xlsm
- Alt+F8 per aprire la finestra di gestione delle macro
- Seleziona Tester
- Esegui
===
Regards,
Norman
