Notifications
Clear all

Loop em pastas de trabalho externas sem precisar abri-las

20 Posts
3 Usuários
0 Reactions
3,751 Visualizações
(@vguedes)
Posts: 47
Eminent Member
Topic starter
 

Pessoal, estou criando uma macro para pesquisar determinados dados de uma planilha em um certo diretório, sem precisar abri-la.

Segue o código abaixo.

Sub contab()
Dim str, sum1, Foldername As String
Dim str2 As String
Dim geracao As Double
Dim i, rlast As Integer



Foldername = Workbooks("CONTABILIZAÇÃO1.xlsm").Sheets("CONTROLE").Cells(1, 2)

Workbooks("CONTABILIZAÇÃO1.xlsm").Sheets("CONTROLE").Cells(4, 2) = Foldername

i = 6
Do
   str2 = GetInfoFromClosedFile(Foldername, "SUM001.1 – Sumário.xls", "SUM001.1 – Sumário", "A" & i) ' <<<========= ERRO: TIPOS INCOMPATÍVEIS
   Workbooks("CONTABILIZAÇÃO1.xlsm").Sheets("CONTROLE").Cells(i, 3) = str2
   If str2 = "LIGHT ENERGIA" Then
     str = GetInfoFromClosedFile(Foldername, "SUM001.1 – Sumário.xls", "SUM001.1 – Sumário", "B" & i)
     If (InStr(1, str, "TGG a,s,r,w - (MWh)", 1)) <> 0 Then
      geracao = GetInfoFromClosedFile(Foldername, "SUM001.1 – Sumário.xls", "SUM001.1 – Sumário", "C" & i)
      Workbooks("CONTABILIZAÇÃO1.xlsm").Sheets("CONTROLE").Cells(6, 2) = geracao
     End If
   End If
   i = i + 1
   If i > 100 Then Exit Do
Loop


    
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 'If Dir(wbPath & "" & wbName) = "" Then Exit Function
        
            arg = "'" & wbPath & "[" & wbName & "]" & _
                wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
        
        On Error Resume Next
        GetInfoFromClosedFile = ExecuteExcel4Macro(arg)

Porém, como demonstrado acima, a planilha está dando um erro de tipos incompatíveis e eu não estou sabendo solucionar.

Alguém poderia me ajudar?

Abraços!

 
Postado : 19/09/2013 8:02 am
(@vguedes)
Posts: 47
Eminent Member
Topic starter
 

Mauro,

O método "If str2 = 0 Then Exit Do" deu erro de tipos incompatíveis, mesmo após salvar no formato excel. Consegue pensar no porque?

Reinaldo,

Esse código que você me passou deu erro no ".DisplayAlerts", de "uso inválido de propriedade". Apaguei essa linha e continuou dando erro, dessa vez dizendo que o arquivo não foi encontrado.

No mais, como vou utilizar informações de várias planilhas estou começando a achar que a macro vai ficar muito lenta com esses loops. Alguém teria alguma sugestão? Algo como "Cells.Find"?

Estou enviando as pastas de trabalho em anexo.

Mais uma vez, obrigado a todos pela ajuda.

 
Postado : 23/09/2013 8:53 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O que realmente é procurado/necessário em cada arquivo?

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 23/09/2013 1:55 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Guedes, conforme eu disse anteriormente:

No anexo estão os dois arquivos, fiz algumas alterações para poder testar a rotina, deletei todas as abas do arquivo para ficar mais leve e poder anexa-lo.
A principio faça um testes com estes dois arquivos antes de migrar para o seu original.

E depois no Tópico mais abaixo, disse para ajustar o nome do arquivo na rotina, se fez como eu disse, não temos nenhum erro.

Mas pelo que vi nestes arquivos que anexou, você utilizou diretamente em seus arquivos e não ajustou a sua rotina conforme a minha adaptação em "Sub contab_Alterada_Mauro()", então :
1°) O método "If str2 = 0 Then Exit Do" deu erro de tipos incompatíveis, mesmo após salvar no formato excel. Consegue pensar no porque?
O Erro é porque você não alterou o Tipo da Variável, em minha rotina ela está como Variante porque estamos pesquisando por TEXTO e você deixou como STRING, que gera erro devido ao dado pesquisado não ser numérico;

2°) Se ver na minha rotina, eu comentei que alterei a linha Inicial:
'Alterei pois os dados começam na linha 7 e não 6
i = 7

3°) Reinaldo,
Esse código que você me passou deu erro no ".DisplayAlerts", de "uso inválido de propriedade"

Aqui, o erro é porque faltou definir o Valor como False, ajuste para : Application.DisplayAlerts = False

4°) após salvar no formato excel.
Aqui, vale o que o Reinaldo comentou anteriormente :
A diferença na nomenclatura deve-se ao "-", no código está com o caractere 150, e no nome do arquivo (o xls) com o caractere 45
Eu havia dito que não tinha reparado a diferença, e agora olhando com mais calma, entendi oque o Reinaldo estava dizendo, é mais fácil explicar visualizando : O Sinal grifado em AZUL é o que está em seu arquivo, e o Sinal grifado em VERMELHO é o nome que está na rotina, ou seja, só por causa deste sinal a rotina entende como diferentes e não encontra nenhum dado, então simplesmente altere na rotina o sinal.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 23/09/2013 10:01 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O que realmente é procurado/necessário em cada arquivo?

Reinaldo, pelo meu entendimento, ele está procurando :

Para a Variável : str2 - a expressão em vermelho
str2 = GetInfoFromClosedFile(Foldername, "SUM001.1 – Sumário.xls", "SUM001.1 – Sumário", "A" & i)
If str2 = "LIGHT ENERGIA" Then

E para a Variável : str - a expressão em Azul
str = GetInfoFromClosedFile(Foldername, "SUM001.1 – Sumário.xls", "SUM001.1 – Sumário", "B" & i)
If (InStr(1, str, "TGG a,s,r,w - (MWh)", 1)) <> 0 Then

Só que, ao inves dele testar somente com um arquivo conforme eu mencionei no exemplo que postei, ele fez outras alterações na rotina acrescentando outras expressões e definindo outras Variáveis com os nomes dos arquivos, dai só podemos ter erros.

Eu tenho por mim, fazer sempre por parte, ajusta-se uma e depois vai se ajustando as outras, acho mais simples para poder acompanhar.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 23/09/2013 10:11 pm
(@vguedes)
Posts: 47
Eminent Member
Topic starter
 

Mauro,

Após esse seu último post resolvi todos os problemas. A macro está funcionou após a mudança na declaração e a que o Reinaldo me passou também.

Muito obrigado a todos pela ajuda. Além de resolver a questão, deu pra aprender bastante sobre VBA.

Um abraço!

 
Postado : 24/09/2013 5:56 am
Página 2 / 2