Notifications
Clear all

Importar dados de vários workbooks para células específicas

4 Posts
2 Usuários
0 Reactions
1,988 Visualizações
(@gamboaisrael)
Posts: 68
Trusted Member
Topic starter
 

Boa tarde, prezados.

Preciso desenvolver uma solução que tem me gerado muitas dúvidas. É o seguinte:

Tenho uma planilha com, aproximadamente, 1900 registros (dispostos em linhas). Esta planilha é uma consolidação dos dados presentes em 1900 arquivos do excel que estão em um diretório qualquer. A planilha de consolidação foi preenchida manualmente à medida que os 1900 arquivos eram construidos por outro setor da empresa. O fato é o seguinte: Eles esqueceram de adicionar uma informação crucial à planilha de consolidação e agora resta a mim tentar corrigir o problema adicionando esta informação à planilha de consolidação.

Resumindo, preciso copiar os dados das celulas A48, A49, A50 e A51 (concatenados dentro de uma uma variável) de cada um dos arquivos em uma célula da coluna H da linha referente àquele arquivo. Por exemplo: O arquivo (workbook) X refere-se ao Sr João, cujo ID é igual a 29. Preciso procurar na planilha consolidada a linha referente ao nome: João e ao ID: 29 e colar as informações das células A48, A49, A50 e A51 do arquivo X na coluna H da planilha consolidada.

Fazendo uma busca aqui na base do fórum e em outros fóruns, cheguei ao código disponibilizado pelo Mauro Coutinho que adaptei pra conseguir abrir um desses arquivos e copiar as informações, eis o código:

Sub ReadDataFromAllWorkbooksInFolder()
    Dim FolderName As String, wbName As String, cValue1 As Variant, cValue2 As Variant, cValue3 As Variant, cValue4 As Variant, cObs As Variant
    Dim wbList As String
    
        'Path (Diretorio) -Ajustar o Caminho
        FolderName = "C:Planilhando"
        
            'Nome do Arquivo de onde extrairemos a informação
            wbName = Dir(FolderName & "" & "*.xls")
            'Armazenamos nas Variaveis
            wbList = wbName
            wbName = Dir
        
        '1ª linha
            'le o Valor no workbook
            cValue1 = GetInfoFromClosedFile(FolderName, wbList, "Plan1", "A5")
            
        '2ª linha
            'le o Valor no workbook
            cValue2 = GetInfoFromClosedFile(FolderName, wbList, "Plan1", "A6")
            
        '3ª linha
            'le o Valor no workbook
            cValue3 = GetInfoFromClosedFile(FolderName, wbList, "Plan1", "A7")
            
        '4ª linha
            'le o Valor no workbook
            cValue4 = GetInfoFromClosedFile(FolderName, wbList, "Plan1", "A8")

        'Coloca o valor na variavel
        cObs = cValue1 & "; " & cValue2 & "; " & cValue3 & "; " & cValue4
   
        'Coloca o Valor na Celula
            Cells(2, 8).Value = cObs
End Sub

    Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
                                            wbName As String, _
                                            wsName As String, _
                                            cellRef As String) As Variant
    
    Dim arg As String
        GetInfoFromClosedFile = ""
        
        If Right(wbPath, 1) <> "" Then wbPath = wbPath & ""
        
        If Dir(wbPath & "" & wbName) = "" Then Exit Function
        
            arg = "'" & wbPath & "[" & wbName & "]" & _
                wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
        
        On Error Resume Next
        GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
        
    End Function

Minhas dúvidas:

1) Do jeito que está o código ele só pega as informações do primeiro arquivo. Como fazer para ele ler todos os arquivos da pasta?

2) Como fazer pra que ele copie as informações corretas no local correto? (Acredito conseguir fazer isso comparando os valores Nome e ID de cada uma das linhas aonde irei colar as informações. Contudo, se alguém tiver uma outra sugestão, eu serei grato!)

Muito obrigado pela atenção!

Saudações,

 
Postado : 06/12/2012 12:11 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

gamboaisrael,

Boa Tarde!

Veja se assim lhe atende.

 
Postado : 06/12/2012 1:38 pm
(@gamboaisrael)
Posts: 68
Trusted Member
Topic starter
 

Wagner, muito obrigado. Estou adaptando aqui e por enquanto está dando certo!

Muito obrigado pela força!

Se não for abusar, teria como você comentar o código?

Saudações,

 
Postado : 06/12/2012 3:23 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 
Sub Copiar_Informações_de_Arquivos()
    'Cria variável do tipo texto para armazenar o conteúdo das células que precisam ser copiadas
    Dim DadosACopiar As String
    
    'Cria variável do tipo inteira para armazenar o ID do cliente
    Dim ID_Cli As Integer
    
    'Cria variáveis contadoras
    Dim UltimaLinha, i As Long
    
    'Desabilita as atualizações de tela
    Application.ScreenUpdating = False
    
    'Armazena a última linha com dados existente da coluna A da Plan1 do _
    arquivo chamado Planilha Consolidada.xlsm
    UltimaLinha = Sheets("Plan1").Cells(Cells.Rows.Count, 1).End(xlUp).Row
    
    'Cria um objeto FSO (da Microsoft)que permite ler pastas, diretórios, arquivos, etc.
    Set fs = CreateObject("Scripting.FileSystemObject")
    
    'Cria um objeto para armazenar o caminho atual (pasta onde está a planilha)
    Set ff = fs.GetFolder(ThisWorkbook.Path)
    
    'Cria um objeto para armazenar os arquivos encontrados na pasta
    Set fc = ff.Files
    
    'Laço para pegar cada um dos arquivos existentes na pasta
    For Each f In fc
        ' Se o arquivo for um arquivo Excel... (pode existir outros arquivos na pasta)
        If Right(f.Name, 4) = "xlsm" Or Right(f.Name, 4) = "xlsx" Or Right(f.Name, 3) = "xls" Then
            'Se o final do nome do arquivo encontrado for diferente de Consolidada,xksx
            If Right(f.Name, 16) <> "Consolidada.xlsx" Then
                'Abre o arquivo
                Workbooks.Open f.Path
                'Armazena o conteúdo das células A5, A6, A7 e A8 do arquivo recém aberto
                DadosACopiar = Range("A5").Value & "; " & Range("A6").Value & "; " & Range("A7").Value & "; " & Range("A8").Value
                'Armazena o conteúdo da célula A2 do arquivo aberto (ID do cliente)
                ID_Cli = Range("A2").Value
                'Laço por todos os registros da planilha consolidada
                For i = 2 To UltimaLinha
                    'Se o valor da célula A (qualquer linha) for igual ao ID armazenado...
                    If Workbooks("Planilha consolidada").Sheets("Plan1").Range("A" & i).Value = ID_Cli Then
                        'Copia para a célula H o valor que foi armazenado na variável
                        Workbooks("Planilha consolidada").Sheets("Plan1").Range("H" & i).Value = DadosACopiar
                        'Sai do laço pois não há necessidade mais de continuar procurando
                        Exit For
                    End If
                Next
                'Fecha o arquivo recém aberto para partir para o próximo arquivo
                Workbooks(f.Name).Close
            End If
        End If
    Next
    
    'Habilita novamente as atualizações de tela
    Application.ScreenUpdating = True
    
    'Emite mensagem de sucesso da cópia dos dados.
    MsgBox "Dados Copiados com Sucesso!", vbDefaultButton1, "CÓPIA DE DADOS"
    
End Sub
 
Postado : 06/12/2012 4:06 pm