Notifications
Clear all

Consolidar diversos arquivos em excel.

3 Posts
2 Usuários
0 Reactions
1,459 Visualizações
(@ericksant)
Posts: 0
New Member
Topic starter
 

Prezados,
boa tarde,

Preciso de uma ajuda para comentar e se possível editar uma macro de consolidação de tabelas no Excel.

O código abaixo foi feito por um colega meu, onde ele consolidava todos os excel e funciona com sucesso.

Porém agora o layout dos arquivos que devem ser consolidados foram alterados e preciso com que a macro funcione novamente.... Está dificil.

Anteiormente, a parte dos títulos de cada arquivo era apenas a primeira linha.

Dessa vez o título de cada arquivo vai da linha A1 até a A11, e antes dele contar quantas colunas tem, deve desocultar as colunas assim que abrir o arquivo.

O resto é parecido, pois ele vai pegar todo o conteúdo e ir consolidando normalmente.

Alguém que entenda de VBA consegue me ajudar ?

Segue o código abaixo

 Sub ConsolidarTabelas()
    
    Dim SummarySheet As Worksheet
    Dim FolderPath As String
    Dim SelectedFiles() As Variant
    Dim NRow As Long
    Dim FileName As String
    Dim NFile As Long
    Dim WorkBk As Workbook
    Dim SourceRange As Range
    Dim DestRange As Range
    Dim DestRangeRecebimento As Range
    Dim PrimeiraLinha As Integer
    Dim Ultimalinha As Integer
    Dim NomeArquivo As String
    
    Dim DataRecebimento As Date
    
    Dim i As Integer
    
    Dim iRow As Integer
    Dim iColuna As Integer
    
    Dim startTime As Single
    Dim endTime As Single
    
    Dim Msg As String
    
    Dim Linhapreenchida
    
    Application.ScreenUpdating = False
    
    startTime = Timer
    
    On Error Resume Next
    
    'Criar um nova Pasta de Trabalho e definir uma variável para a primeira planilha.
    Set SummarySheet = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    
    'Modifique este caminho de pasta para apontar para os arquivos que você deseja usar.
    FolderPath = ThisWorkbook.Sheets("Consolidar Tabelas").Range("F1").Value
    
    'Define o diretório atual para o caminho da pasta.
    ChDrive FolderPath
    ChDir FolderPath
    
    'Abre a caixa de diálogo dos arquivos em Excel que devem ser selecionados e consolidados
    SelectedFiles = Application.GetOpenFilename(Title:="Selecione os arquivos", filefilter:="Excel Files (*.xl*), *.xl*", MultiSelect:=True)
        
    'NRow mantém controle de onde inserir novas linhas na pasta de trabalho de destino.
    NRow = 1
    
    'Percorre a lista de nomes de arquivo retornados
    For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
        
        'Define FileName como o nome do arquivo de pasta de trabalho atual para abrir.
        FileName = SelectedFiles(NFile)
        
        'Abre a pasta de trabalho atual como somente leitura
        Set WorkBk = Workbooks.Open(FileName, True, True)
        
        'Define a célula na coluna A para numerar os arquivos.
        SummarySheet.Range("A" & NRow).Value = NFile
        
        PrimeiraLinha = SummarySheet.Range("B" & NRow + 1).Row
        
        DataRecebimento = Replace(Left(Replace(FileName, FolderPath, ""), 10), ".", "/") & " " & Replace(Mid(Replace(FileName, FolderPath, ""), 12, 8), ".", ":")
        
        SummarySheet.Range("B" & NRow).Value = "Data de Recebimento"
        
        'Selecionar, copiar e colar o intervalo de dados
        
            'Range(Selection, Selection.End(xlToRight)).Select
            
            iRow = WorkBk.Worksheets(1).Range("A100000").End(xlUp).Row
            
            iColuna = WorkBk.Worksheets(1).Range("A1").End(xlToRight).Column
        
                Set SourceRange = WorkBk.Worksheets(1).Range(Cells(1, 1), Cells(iRow, iColuna))
                
                'Defina o intervalo de destino para iniciar na coluna B e ser do mesmo tamanho que o intervalo de origem.
                Set DestRange = SummarySheet.Range("C" & NRow).Resize(SourceRange.Rows.Count, SourceRange.Columns.Count)
                
                'Copiar os valores da origem para o destino.
                DestRange.Value = SourceRange.Value
                
                Ultimalinha = NRow + DestRange.Rows.Count - 1
                
                    For i = PrimeiraLinha To Ultimalinha
                    
                    SummarySheet.Range("B" & i).Value = DataRecebimento
                    
                    Next i
                
                'Aumentar NRow para que possamos saber onde copiar os dados a seguir.
                NRow = NRow + DestRange.Rows.Count
                
                'Feche a pasta de trabalho de origem sem guardar as alterações.
                WorkBk.Close savechanges:=False
                
                Set WorkBk = Nothing
            
    Next NFile
                
                endTime = Timer
                
                NomeArquivo = "Planilhados " & Format(Now, "dd.mm.yyyy") & ".xlsx"
                
                MsgBox FolderPath & NomeArquivo
                
                SummarySheet.SaveAs FileName:=FolderPath & NomeArquivo  ', FileFormat = xlWorkbookNormal
                
                'Tempo de execução do consolidador
                
Msg:
                Msg = NFile - 1 & " arquivo(s) consolidado(s) em" & Format(endTime - startTime, " 0 Segundos")
                        MsgBox Msg, vbInformation, "Tempo de execução"
                        
                Application.ScreenUpdating = True
            
End Sub 

HELP!

 
Postado : 22/10/2019 11:20 am
(@srobles)
Posts: 0
New Member
 

ericksant,

Experimente alterar as linhas abaixo, de :

iRow = WorkBk.Worksheets(1).Range("A100000").End(xlUp).Row 
Set SourceRange = WorkBk.Worksheets(1).Range(Cells(1, 1), Cells(iRow, iColuna))

Para :

iRow = WorkBk.Worksheets(1).Range("A100000").End(xlUp).Row - 11
Set SourceRange = WorkBk.Worksheets(1).Range(Cells(12, 1), Cells(iRow, iColuna))

'Exibindo todas as colunas ocultas e redimensionando elas
WorkBk.Worksheets(1).Columns.Hidden = False
WorkBk.Worksheets(1).Cells.EntireColumn.AutoFit
 
Postado : 22/10/2019 11:54 am
(@ericksant)
Posts: 0
New Member
Topic starter
 

Não consegui seguindo as instruções acima.

Mas depois de quebrar muito a cabeça, consegui fazer o código abaixo e funcionou.

Sub ConsolidarTabelas()
    
    Dim SummarySheet As Worksheet
    Dim FolderPath As String
    Dim SelectedFiles() As Variant
    Dim NRow As Long
    Dim FileName As String
    Dim NFile As Long
    Dim L, C As Long
    Dim WorkBk As Workbook
    Dim SourceRange As Range
    Dim DestRange As Range
    Dim DestRangeRecebimento As Range
    Dim PrimeiraLinha As Integer
    Dim Ultimalinha As Integer
    Dim NomeArquivo As String
    
    Dim DataRecebimento As Date
    
    Dim i As Integer
    
    Dim iRow As Integer
    Dim iColuna As Integer
    
    Dim startTime As Single
    Dim endTime As Single
    
    Dim Msg As String
    
    Dim Linhapreenchida
    
    Application.ScreenUpdating = False
    
    startTime = Timer
    
    On Error Resume Next
    
    'Criar um nova Pasta de Trabalho e definir uma variável para a primeira planilha.
    Set SummarySheet = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    
    'Modifique este caminho de pasta para apontar para os arquivos que você deseja usar.
    FolderPath = ThisWorkbook.Sheets("Consolidar Tabelas").Range("F1").Value
    
    'Define o diretório atual para o caminho da pasta.
    ChDrive FolderPath
    ChDir FolderPath
    
    'Abre a caixa de diálogo dos arquivos em Excel que devem ser selecionados e consolidados
    SelectedFiles = Application.GetOpenFilename(Title:="Selecione os arquivos", filefilter:="Excel Files (*.xl*), *.xl*", MultiSelect:=True)
        
    'NRow mantém controle de onde inserir novas linhas na pasta de trabalho de destino.
    NRow = 1
    
    'Percorre a lista de nomes de arquivo retornados
    For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
        
        'Define FileName como o nome do arquivo de pasta de trabalho atual para abrir.
        FileName = SelectedFiles(NFile)
        
        'Abre a pasta de trabalho atual como somente leitura
        Set WorkBk = Workbooks.Open(FileName, True, True)
        
        'Define a célula na coluna A para numerar os arquivos.
        SummarySheet.Range("A" & NRow).Value = NFile
        
        PrimeiraLinha = SummarySheet.Range("B" & NRow + 1).Row
        
'        DataRecebimento = Replace(Left(Replace(FileName, FolderPath, ""), 10), ".", "/") & " " & Replace(Mid(Replace(FileName, FolderPath, ""), 12, 8), ".", ":")
'
'        SummarySheet.Range("B" & NRow).Value = "Data de Recebimento"
        
        'Selecionar, copiar e colar o intervalo de dados
        
        'Range(Selection, Selection.End(xlToRight)).Select
        iRow = WorkBk.Worksheets(1).Cells.SpecialCells(xlLastCell).Row
        
        iColuna = WorkBk.Worksheets(1).Cells.SpecialCells(xlLastCell).Column
        
        For L = 10 To iRow
            If WorkBk.Worksheets(1).Cells(L, "D").Value = "" Then Exit For
            For C = 4 To iColuna
                If (L = 10 And NRow = 1) Then
                    SummarySheet.Cells(NRow, C - 3).Value = WorkBk.Worksheets(1).Cells(L, C).Value
                ElseIf L > 10 Then
                    If IsError(WorkBk.Worksheets(1).Cells(L, C).Value) Then
                        SummarySheet.Cells(NRow, C - 3).Value = ""
                    Else
                        SummarySheet.Cells(NRow, C - 3).Value = WorkBk.Worksheets(1).Cells(L, C).Value
                    End If
                End If
            Next
            If L > 10 Or NRow = 1 Then NRow = NRow + 1
        Next

        'Feche a pasta de trabalho de origem sem guardar as alterações.
        WorkBk.Close savechanges:=False
        
        Set WorkBk = Nothing
    
Next NFile
        
        endTime = Timer
        
        NomeArquivo = "Planilhados " & Format(Now, "dd.mm.yyyy") & ".xlsx"
        
        MsgBox FolderPath & NomeArquivo
        
        SummarySheet.SaveAs FileName:=FolderPath & NomeArquivo  ', FileFormat = xlWorkbookNormal
        
        'Tempo de execução do consolidador
        
Msg:
        Msg = NFile - 1 & " arquivo(s) consolidado(s) em" & Format(endTime - startTime, " 0 Segundos")
                MsgBox Msg, vbInformation, "Tempo de execução"
                
        Application.ScreenUpdating = True
            
End Sub

Valeu mesmo assim.

 
Postado : 22/10/2019 3:46 pm