Notifications
Clear all

Copiar valores de um arquivo e organizá-los em outro

2 Posts
1 Usuários
0 Reactions
618 Visualizações
(@s10maniac)
Posts: 0
New Member
Topic starter
 

Boa tarde pessoal!

Sou usuário novo no Fórum não encontrei uma dúvida parecida com a minha, então resolvi abrir um tópico. Caso haja um caso semelhante, por favor, desculpem-me.

Preciso de ajuda com um código VBA que copia dados de um arquivo chamado "Dados Entrada.xlsx" e os cola noutro arquivo chamado "Cálculos.xlsm", conforme o arquivo .ZIP em anexo. Ambos possuem colunas e linha nomeadas da mesma forma (colunas como "Var " & "alguma letra" e linhas como "Var " & "algum número"). Os dados do arquivo "Dados entrada.xlsx" vêm de um simulador e são organizados de maneira mais ou menos aleatória (ou seja, as posições das colunas e das linhas podem variar neste arquivo), ao passo que no arquivo "Cálculos.xlsm" elas são fixas. Para exemplificar, o valor contido na célula que é o encontro de "Var C" com "Var 3" pode vir em qualquer linha e qualquer coluna entre a A e a H do arquivo "Dados Entrada.xlsx", mas no arquivo "Cálculos.xlsm" ele deverá estar sempre na célula E7.

No arquivo "Dados Entrada.xlsx" os dados estão organizados em blocos. Pensei em identificar cada bloco através da localização de uma palavra-chave que existe no arquivo de saída que vêm do simulador, que no exemplo em anexo chamei de "Keyword". Minha ideia era iniciar um laço que localiza e gravar a posição da primeira string "Keyword"; iniciar outro laço que varre a linha em que ela está, localiza e grava a posição e o texto da primeira coluna ("Var D", por exemplo), localiza esse texto no arquivo "Cálculos.xlsm" e grava a sua posição neste arquivo e volta ao arquivo "Dados Entrada.xlsx"; iniciar outro laço que varre a coluna em que está a string "Keyword" até localizar a primeira linha ("Var 1", por exemplo), grava a sua posição e o texto contido na célula, volta ao arquivo "Cálculos.xlsm", localiza esse texto e grava sua posição, retorna ao arquivo "Dados entrada.xlsx", copia o valor contido no encontro entre "Var D" e "Var 1" e cola esse valor na célula correspondente do arquivo "Cálculos.xlsm". Esse processo seria repetido para todas linhas abaixo de "Keyword" no arquivo "Dados Entrada.xlsx", depois vai para um laço superior que varre as colunas e termina no laço externo que varre as "Keywords". Um agravante é que algumas das colunas e linhas do arquivo "Cálculos.xlsm" podem não existir no arquivo "Dados Entrada.xlsx", e neste caso os valores das respectivas células no arquivo "Cálculos.xlsm" devem ser zerados (e não esvaziados!).

Faz pouquíssimo tempo que comecei a usar VBA e Macros e não sei se há uma maneira melhor de fazer isso (armazenar as colunas e linhas de cada bloco de entradas em vetores ou matrizes para os dois arquivos, para facilitar as correspondências, e esses vetores e matrizes serem esvaziados a cada passo do laço que localiza as "Keywords", por exemplo).

Obrigado desde já pela ajuda e peço desculpas se me alonguei na explicação, mas acho melhor deixar bem explicado que abrir margens para dúvidas.

Grande abraço!

S10MaNiAc.

 
Postado : 30/01/2015 11:19 am
(@s10maniac)
Posts: 0
New Member
Topic starter
 

Olá pessoal.

Acho que consegui o que eu queria. Em anexo seguem os arquivos com algumas atualizações que ajudaram bastante a estruturar o código, que ficou assim:

Sub Copia_Organiza_Cola()

Dim Var_A_1 As Range, Var_1_1 As Range, Keyword As Range, Var_A_2 As Range
Dim Var_1_2 As Range, z_cell As Range
Dim Plan_1 As String, Plan_2 As String, Arq_1 As String, Arq_2 As String, Ref1 As String
Dim Ref2 As String, Entrada As String, Componente As String, Dados_end As String
Dim Resultado As String
Dim a As Long, b As Long, c As Long, d As Long, e As Long, i As Long, j As Long, b_wng As Long
Dim bl_result As Long, bl_result_wng As Long
Dim Var_1 As Variant, Var_2 As Variant, Var_n As Variant, Val As Variant

'Nomeação de arquivos, planilhas e referências, assumindo que os arquivos estão abertos.
Arq_1 = "Dados Entrada.xlsx"
Arq_2 = "Cálculos.xlsm"
Plan_1 = "DadosEntrada"
Plan_2 = "Teste"
'Referência para localização de blocos de dados.
Ref1 = "Keyword"
'Referência para localização de sub-blocos de dados.
Ref2 = "comp"
'Referência para término de blocos de dados.
Dados_end = "end"

Application.ScreenUpdating = False

'Encontra primeira Keyword no arquivo de Dados de Entrada.

Set Keyword = Workbooks(Arq_1).Worksheets(Plan_1).Cells.Find(Ref1, SearchFormat:=False)
c = Keyword.Row
bl_result_wng = 0

If Not Keyword Is Nothing Then
    bl_result = 1
    Do
        'Distância (fixa) entre primeira coluna de dados e a Keyword encontrada.
        a = 3
        b_wng = 1
        Do
            'Workbooks(Arq_1).Worksheets(Plan_1).Activate
            If Workbooks(Arq_1).Worksheets(Plan_1).Cells(Keyword.Row + 1, Keyword.Column + a).Value = "" Then
               Entrada = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Keyword.Row, Keyword.Column + a).Value
            Else
               Entrada = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Keyword.Row, Keyword.Column + a).Value & " " & Cells(Keyword.Row + 1, Keyword.Column + a).Value
            End If
            'Workbooks(Arq_2).Worksheets(Plan_2).Activate
            Set Var_A_2 = Workbooks(Arq_2).Worksheets(Plan_2).Cells.Find(Entrada, SearchOrder:=xlByColumns, SearchFormat:=False)
            'Distância (fixa) entre "comp" e o início do sub bloco de resultados.
            b = 1
            If Not Var_A_2 Is Nothing Then
                'Obtenção das variáveis "Var 1" e "Var 2", que estão antes do sub-bloco de dados.
                Set Var_1_1 = Workbooks(Arq_1).Worksheets(Plan_1).Cells.Find("Var 1", After:=Keyword, SearchOrder:=xlByRows, SearchFormat:=False)
                Var_1 = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Var_1_1.Row, Keyword.Column + a).Value
                Workbooks(Arq_2).Worksheets(Plan_2).Cells(4, Var_A_2.Column).Value = Var_1
                Set Var_1_1 = Workbooks(Arq_1).Worksheets(Plan_1).Cells.Find("Var 2", After:=Keyword, SearchOrder:=xlByRows, SearchFormat:=False)
                Var_2 = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Var_1_1.Row, Keyword.Column + a).Value
                Workbooks(Arq_2).Worksheets(Plan_2).Cells(5, Var_A_2.Column).Value = Var_2
                
                'Obtenção das demais variáveis (que formam o sub bloco).
                Set Var_1_1 = Workbooks(Arq_1).Worksheets(Plan_1).Cells.Find(Ref2, After:=Var_1_1, SearchOrder:=xlByRows, SearchFormat:=False)
                Componente = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Var_1_1.Row + b, Var_1_1.Column).Value
                Do
                    Set Var_1_2 = Workbooks(Arq_2).Worksheets(Plan_2).Cells.Find(Componente, SearchOrder:=xlByRows, SearchFormat:=False)
                    If Not Var_1_2 Is Nothing Then
                        Var_n = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Var_1_1.Row + b, Keyword.Column + a).Value
                        Workbooks(Arq_2).Worksheets(Plan_2).Cells(Var_1_2.Row, Var_A_2.Column).Value = Var_n
                        Workbooks(Arq_2).Worksheets(Plan_2).Cells(Var_1_2.Row, Var_A_2.Column).Font.Color = vbBlack
                        Workbooks(Arq_2).Worksheets(Plan_2).Cells(Var_1_2.Row, Var_A_2.Column).Font.Bold = False
                        b = b + 1
                        Componente = Workbooks(Arq_1).Worksheets(Plan_1).Cells(Var_1_1.Row + b, Var_1_1.Column).Value
                    Else
                        Resultado = "Variável " & Componente & " do Bloco de Resultados #" & bl_result & " não encontrada na planilha " & Plan_2 & " do arquivo " & Arq_2 & "." & vbNewLine _
                        & vbNewLine & "O carregamento de dados será abortado." & vbNewLine & vbNewLine & "Verifique a correspondência entre as variáveis dos dois arquivos."
                        MsgBox Resultado, vbCritical, "ERRO!"
                        Exit Sub
                    End If
                Loop Until Componente = Dados_end
                a = a + 1
            Else
                a = a + 1
            End If
        Loop While a < 7
        Set Keyword = Workbooks(Arq_1).Worksheets(Plan_1).Cells.Find(Ref1, After:=Keyword, SearchFormat:=False)
        If Keyword.Row = c Then
            Exit Do
        End If
        bl_result = bl_result + 1
    Loop Until Keyword Is Nothing
    Resultado = "Dados copiados com sucesso!"
    MsgBox Resultado, vbInformation, "SUCESSO!"
Else
    Resultado = "Conjunto de entradas não encontrado. O carregamento de dados será abortado."
    MsgBox Resultado, vbCritical, "ERRO!"
Exit Sub
End If

'Insere o valor 0 (zero) nas células vazias da planilha "Plan_2".
For j = 3 To 16
    'Primeiro sub-bloco.
    For i = 4 To 5
        Val = Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Value
        Debug.Print "Val = " & Val
        If Val = "" Then
            Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Value = 0
            Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Font.Color = vbRed
            Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Font.Bold = True
        End If
    Next
    'Segundo sub-bloco.
    For i = 7 To 16
        Val = Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Value
        If Val = "" Then
            Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Value = 0
            Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Font.Color = vbRed
            Workbooks(Arq_2).Worksheets(Plan_2).Cells(i, j).Font.Bold = True
        End If
    Next
Next

Application.ScreenUpdating = True
Workbooks(Arq_2).Worksheets(Plan_2).Activate

End Sub
 
Postado : 06/02/2015 11:23 am