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