Notifications
Clear all

Buscar dados de outro arquivo Excel por VBA

7 Posts
3 Usuários
0 Reactions
2,278 Visualizações
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Olá pessoal!

Sei que dá pra buscar dados de outro arquivo Excel por fórmula e estando o outro arquivo em questão aberto e com os dados salvos, assim como no exemplo:

=B1*'C:[Pasta1.xlsx]Plan1'!$A$1

Gostaria de saber se é possível fazer isso usando VBA

Obrigado

 
Postado : 05/04/2018 5:40 am
(@klarc28)
Posts: 971
Prominent Member
 
Sub Macro1()
'
' Macro1 Macro
'

'
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "=RC[1]*[Pasta1.xlsx]Plan1!R1C1"
    Range("A2").Select
End Sub
Sub Macro2()
'
' Macro2 Macro
'

'

    Workbooks.Open Filename:="C:UsersANDERSONDesktopPasta1.xlsx"
    Windows("Pasta2.xlsm").Activate
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "=RC[1]*[Pasta1.xlsx]Plan1!R1C1"
    Range("A2").Select
End Sub

Cinco dicas que foram muito úteis para mim:

1) Quando não sei fazer algo no VBA, vou ao menu EXIBIÇÃO >> MACROS >> GRAVAR MACRO
Faço o que eu quero aí volto ao menu EXIBIÇÃO >> MACROS >> PARAR GRAVAÇÃO
Aperto Alt + F11 e vejo como a macro fez aquilo. Tento entender e tento adaptar.

2) Quando vou criar um código e o resultado não está saindo como o esperado, entro no código e vou apertando F8 para executar passo a passo, aí vou passando o mouse sobre as variáveis para verificar se o valores delas estão corretos, já consertei milhares de códigos dessa forma.

3) Antes de executar o código, vou ao menu Depurar >> Compilar. Isso ajuda corrigir erros mais simples, como o nome de uma variável digitado errado.

4) Declaro todas as variáveis. Isso também evita erros.

5) Sempre uso o Option Explicit lá no início. Ele me obriga a declarar as variáveis.

A moda do momento é fazer isso via Power Query, voltado para pessoas que não são iniciadas em programação.

Aqui no planilhando também existe um fórum sobre Power Query.

Aprenda a instalar o Power Query no Excel:

http://ninjadoexcel.com.br/como-instalar-o-power-query-no-excel/

Se quiser fazer com VBA:

https://www.youtube.com/results?search_query=vba+copiar+dados+de+uma+planilha+para+outra

Se quiser aprender Power Query:

https://www.youtube.com/results?search_query=power+query

 
Postado : 05/04/2018 5:46 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Fala Klarc 28!

Cara o que é esse R1C1?

Tentei fazer aqui com a ajuda dos vídeos mas não entendi, não

Seguinte, em um arquivo Excel separado, de A1 até E1 existem fórmulas e roda uma Worksheet Calculate que nada mais faz do que, copiar os dados da range A1:E1 e colar somente os valores na linha que encontrar vazia abaixo e conforme os dados da range forem atualizando esse processo se repete, gerando assim uma longa lista ao fim do dia. (Essa parte já funciona)

O que preciso, e não consegui, é: copiar cada linha do Excel separado para um outro arquivo Excel principal numa range (Ex: AA1:AE1), processar essa linha com o código existente nesse arquivo Excel principal e depois atualizar essa range AA1:AE1 com a próxima linha do Excel separado até encontrar uma linha vazia e neste caso esperar pra fazer novamente o processo quando essa linha vazia conter novo dado.

Exemplo:

Excel separado
1 Excel separado recebeu novo dado em A1:E1
2 Próxima linha vazia é a 2
3 Copiar e colar valores de A1:E1 para A2:E2

Excel primário
1 Excel primário detectou atualização de dados em nova linha do Excel separado
2 Copiar do Excel separado A2:E2 para Excel primário AA1:AE1
3 Processar
4 Ao fim do passo 3, ver se tem dados na próxima linha do Excel separado pra repetir o processo (no caso seria A3:E3), se não tiver, aguardar e quando tiver, ir para passo 1 automaticamente

Ambos arquivos Excel só tem uma planilha chamada Plan1

Obrigado

 
Postado : 11/04/2018 5:23 am
(@klarc28)
Posts: 971
Prominent Member
 

Quando você não entende algo, significa que você deve estudar mais.

Estude lógica de programação, se você não entende programação é porque não compreende a lógica de programação.

https://www.youtube.com/results?search_query=logica+de+programa%C3%A7%C3%A3o

Estude laço de repetição. Quem não sabe laço de repetição, não consegue fazer quase nada em programação.

https://www.youtube.com/results?search_query=la%C3%A7o+de+repeti%C3%A7%C3%A3o

Enquanto você não entender essas duas partes, não vai sair do lugar.

Cara o que é esse R1C1?

https://pt.stackoverflow.com/questions/20744/utilizar-a-propriedade-r1c1

Tentei fazer aqui com a ajuda dos vídeos mas não entendi, não

Seja específico.
Qual código do vídeo você tentou?
Qual foi o erro?
O que não funcionou?
É necessário que você apresente códigos e arquivos anexos, pois isso agiliza e os outros usuários gastam menos tempo para responder.

A moda do momento é fazer isso via Power Query, voltado para pessoas que não são iniciadas em programação.

O título do tópico é Buscar dados de outro arquivo Excel por VBA. Tente focar só nisso. Quando conseguir essa parte, marque este tópico como resolvido e abra outros tópicos para as outras coisas.

 
Postado : 11/04/2018 6:20 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Fala Klarc28

Passei esses dias estudando sobre os vínculos entre as Pastas de Trabalho do Excel, mas não encontrei, dentre os vários vídeos que assisti, algo específico ou pelo menos nada que conseguisse aplicar para o meu caso, tentei de várias formas mas não funcionou, por isso recorro a vocês novamente

Abaixo segue os códigos das duas planilhas do exemplo caso dê problema ao abrir

Teste:

Private Sub Worksheet_Calculate()

i = Cells(Rows.Count, "A").End(xlUp).Row
i = i + 1

    Range("A1").Copy
    Range("A" & i).PasteSpecial Paste:=xlValues

End Sub

Visual:

Sub Worksheet_Change(ByVal Target As Range)

Dim KeyCells As Range

    Set KeyCells = [Teste usando fórmula AGORA.xlsm]Plan1!$A$1.Columns("A") 'KeyCells recebe a range da coluna A da planilha Teste
    
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

   Application.EnableEvents = False

e = [Teste usando fórmula AGORA.xlsm]Plan1!$A$1.Cells(Rows.Count, "A").End(xlUp).Row 'e recebe a última linha da coluna A da planilha Teste

e = e + 1

For e = e To [Teste usando fórmula AGORA.xlsm]Plan1!$A$1.Cells(Rows.Count, "A").End(xlUp).Row 'Faça do e até a última linha da coluna A da planilha Teste
 
a = Cells(Rows.Count, "A").End(xlUp).Row

a = a + 1

Range("A" & a).Value = [Teste usando fórmula AGORA.xlsm]Plan1!$A$1.Cells(a, "A").Value + 1 'Última linha da coluna A da planilha Visual recebe o valor da última linha da coluna A da planilha Teste + 1
 
Next e
    
    Application.EnableEvents = True

End If

End Sub

Essas duas planilhas simulam exatamente o problema que enfrento

Especificando o problema:

Quero que na pasta de trabalho "Visual" exiba nas linhas da coluna A o mesmo que é exibido na pasta de trabalho "Teste" na coluna A, porém na "Visual" somando 1 aos valores

Na Visual trabalho com Change e na Teste com Calculate

Minha dificuldade é em como escrever no código que quero puxar o dado da pasta de trabalho tal, planilha tal, célula tal, isso que não consigo encontrar pra fazer

Também notei diferenças quando abro os dois arquivos direto e quando abro um e depois abro um novo Excel pra depois dentro dele abrir o outro arquivo, porque isso acontece? Notei que no segundo caso no menu Exibição > Alternar janelas só aparece um item

Uma luz por favor!

Obrigado

 
Postado : 01/05/2018 12:29 pm
(@klarc28)
Posts: 971
Prominent Member
 

Aqui vai um exemplo:

Option Explicit

Sub copiarSomando1()
    
    Workbooks.Open ("C:UsersANDERSONGoogle Driveyoutubeorigemcopiarsomando1.xlsm")
    
    Dim wsOrigem As Workbook
    
    Set wsOrigem = Workbooks("origemcopiarsomando1.xlsm")
    
    
    Dim linha As Long
    linha = 1
    
    While wsOrigem.Sheets("Plan1").Range("A" & linha).Value <> ""
        
        ThisWorkbook.Sheets("Plan1").Range("A" & linha).Value = 1 + wsOrigem.Sheets("Plan1").Range("A" & linha).Value
        
        linha = linha + 1
    Wend
    
    wsOrigem.Close
    
End Sub
 
Postado : 01/05/2018 4:31 pm
(@edcronos2)
Posts: 346
Reputable Member
 

tbm assim

     With Workbooks.Open("C:UsersNOMEUSUARIODocumentsPlanilha2.xlsm")
          With .Sheets("DADOS")
               arr = .Range("A5:t" & .Cells(Rows.Count, 1).End(xlUp).Row).Value2
          End With
          .Close
     End With

     With ThisWorkbook.Sheets("Plan1")
          li = 3
          ci = 2
          .Range(.Cells(li, ci), .Cells(UBound(arr, 1) + li - 1, UBound(arr, 2) + ci - 1)).Value2 = arr
     End With
 
Postado : 01/05/2018 6:02 pm