Notifications
Clear all

Macro para buscar valores em planilhas variadas

3 Posts
2 Usuários
0 Reactions
1,100 Visualizações
(@ravargon)
Posts: 0
New Member
Topic starter
 

Olá galera,
Estou fazendo uma planilha que gera um relatório de vendas (REL.xlsm) buscando dados de outras planilhas (BASE1, BASE2, etc).
Consegui fazer com que ela busque os valores através de diversas macros, sendo uma para cada base.
Minha ideia é melhorar isso, fazendo com que, ao clicar em um botão "atualizar dados", me venha uma caixa de seleção com as bases disponíveis e a partir daí o nome/caminho da planilha seja armazenado numa variável e a atualização seja realizada.

Como pode-se ver no módulo 1, está funcionando dessa forma (com uma sub para cada base):

Sub BASE1()
' 
' Buscar Clientes e Vendas BASE1
'
    'Calculo Manual
    Application.Calculation = xlManual
    
    'Nao Apresentar Caixa de Dialogo
    Application.DisplayAlerts = False
    
    'Nao Piscar Tela
    Application.ScreenUpdating = False
    
    'Variável
    Dim A As Boolean 'True se já estiver aberto e false caso contrário
    Dim WBName As String

    'Abrir Arquivo Origem
        
        'Se estiver aberto
        On Error Resume Next
        WBName = Workbooks("BASE1.xlsx").Name
        If Err.Number = 0 Then
        A = False
        Else 'Se não estiver aberto
        A = True
        Workbooks.Open Filename:=ThisWorkbook.Path & "BASE1.xlsx"
        End If

    'Copiar e Colar Vendas
    Windows("BASE1.xlsx").Activate
    Sheets("Plan1").Range("A:C").Copy
    Windows(ThisWorkbook.Name).Activate
    Sheets("Plan1").Range("A1").PasteSpecial Paste:=xlPasteValues
    
    'Fechar Arquivo Origem
    If A = True Then
    Workbooks("BASE1.xlsx").Close savechanges:=False
    Else
    End If
        
    'Aponta Empresa Calculada
    Windows(ThisWorkbook.Name).Activate
    Sheets("Plan1").Range("D1").Value = "BASE1"
    
    'Calculo Automatico
    Application.Calculation = xlAutomatic
    
    'Nao Apresentar Caixa de Dialogo
    Application.DisplayAlerts = True
    
    'Nao Piscar Tela
    Application.ScreenUpdating = True
        
    MsgBox "TROCA DE EMPRESA CONCLUÍDA - BASE1"
        
End Sub

Quero fazer algo desse tipo, só que não consigo "chamar" o arquivo/caminho através da variável (como está no módulo2):

Sub Base()
'
' Buscar Clientes e Vendas BASE2
'

    'Calculo Manual
    Application.Calculation = xlManual
    
    'Nao Apresentar Caixa de Dialogo
    Application.DisplayAlerts = False
    
    'Nao Piscar Tela
    Application.ScreenUpdating = False
    
    'Variável
    Dim Arquivo As String
    Dim A As Boolean 'True se já estiver aberto e false caso contrário
    Dim WBName As String

    'Abrir Arquivo Origem
        
        'Se estiver aberto
        On Error Resume Next
        WBName = Workbooks(Arquivo).Name
        If Err.Number = 0 Then
        A = False
        Else 'Se não estiver aberto
        A = True
        Workbooks.Open Filename:=ThisWorkbook.Path & "" & Arquivo
        End If

    'Copiar e Colar Vendas
    Windows(Arquivo).Activate
    Sheets("Plan1").Range("A:C").Copy
    Windows(ThisWorkbook.Name).Activate
    Sheets("Plan1").Range("A1").PasteSpecial Paste:=xlPasteValues
    
    'Fechar Arquivo Origem
    If A = True Then
    Workbooks(Arquivo).Close savechanges:=False
    Else
    End If
        
    'Aponta Empresa Calculada
    Windows(ThisWorkbook.Name).Activate
    Sheets("Plan1").Range("E1").Value = Arquivo
    
    'Calculo Automatico
    Application.Calculation = xlAutomatic
    
    'Nao Apresentar Caixa de Dialogo
    Application.DisplayAlerts = True
    
    'Nao Piscar Tela
    Application.ScreenUpdating = True
        
    MsgBox "TROCA DE EMPRESA CONCLUÍDA - " & Arquivo
        
End Sub

Agradeço a ajuda

OBS: talvez eu demore alguns dias para entrar novamente no site, pois estarei viajando

 
Postado : 26/10/2015 11:41 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Crie uma pasta Ex: MinhaPasta, nele deixo os arquivos que quer importar.

o código abaixo, vai abrir todos os arquivos (com a extenção .xlsx) que está dentro da pasta criada de nome minhaPasta, copiar os dados para o arquivo ativo.

Option Explicit

Sub AleVBA_17876()
    Dim sPath As String
    Dim sFil As String
    Dim strName As String
    Dim twbk As Workbook
    Dim owbk As Workbook
    Dim ws As Worksheet
     
    Set twbk = ActiveWorkbook
    sPath = "C:UsersalexandreVBAMinhaPasta" 'Mude o caminho para o seu diretório
    sFil = Dir(sPath & "*.xlsx") 'Eu uso a extensão .xlsx, caso vc contrario mude para .xls
     
    Do While sFil <> ""
        strName = sPath & sFil
        Set owbk = Workbooks.Open(strName)
        Set ws = owbk.Sheets(1)
        ws.Range("A2", Range("C" & Rows.Count).End(xlUp)).Copy
        twbk.Sheets("Plan1").Range("A65536").End(xlUp)(2).PasteSpecial xlPasteValues
        owbk.Close False
        sFil = Dir
    Loop
     
    twbk.Save
End Sub

Att

 
Postado : 27/10/2015 6:40 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Uma outra alternativa seria :

Sub Base_Mauro()
    '
    ' Buscar Clientes e Vendas BASEs

        'Calculo Manual
        Application.Calculation = xlManual
        
        'Criamos o objeto
        Set fs = CreateObject("Scripting.FileSystemObject")
        
        'Nao Apresentar Caixa de Dialogo
        Application.DisplayAlerts = False
       
        'Nao Piscar Tela
        Application.ScreenUpdating = False
       
        'Variável
        Dim Arquivo  As String
        Dim A As Boolean 'True se já estiver aberto e false caso contrário
        Dim WBName As String
        
        'Se os arquivos estiverem no mesmo diretorio deixe ThisWorkbook.Path
        ChDir ThisWorkbook.Path
        'Se for outro desabilite a linha acima ec oloque aqui o Caminho e Pasta que deseja abrir
        'ChDir "C:SeusArquivosBase"
        
        'Definido o diretorio, a caixa de dialogo abrirá no local definido acima
        FiletoOpen = Application _
        .GetOpenFilename("Excel (.xlsx), .xlsx", , "Selecione a planilha")
        
        'Verifica se foi selecionado algum arquivo, se não sai da rotina
        If FiletoOpen <> False Then
            WdlFolder = fs.getParentFolderName(FiletoOpen)
            Arquivo = fs.GetFileName(FiletoOpen)
        Else
            Exit Sub
        End If
        
            'Armazena os nomes de cada arquivo
            'Se estiver aberto
            On Error Resume Next
            WBName = Workbooks(Arquivo).Name
            If Err.Number = 0 Then
                A = False
            Else 'Se não estiver aberto
                A = True
                Workbooks.Open Filename:=WdlFolder & "" & Arquivo
            End If

        'Copiar e Colar Vendas
        Windows(Arquivo).Activate
        Sheets("Plan1").Range("A:C").Copy
        Windows(ThisWorkbook.Name).Activate
        Sheets("Plan1").Range("A1").PasteSpecial Paste:=xlPasteValues
       
        'Fechar Arquivo Origem
        If A = True Then
            Workbooks(Arquivo).Close savechanges:=False
        Else
        End If
           
        'Aponta Empresa Calculada
        Windows(ThisWorkbook.Name).Activate
        Sheets("Plan1").Range("E1").Value = Arquivo
       
        'Calculo Automatico
        Application.Calculation = xlAutomatic
       
        'Nao Apresentar Caixa de Dialogo
        Application.DisplayAlerts = True
       
        'Nao Piscar Tela
        Application.ScreenUpdating = True
           
        MsgBox "TROCA DE EMPRESA CONCLUÍDA - " & Arquivo
        
    End Sub

Resolvi colocar esta uma vez que pelo exemplo que enviou vi que apos copiar da Base1 e colar ao executar a rotina para a Base2 os dados são substituídos, não sei se é isto mesmo ou irá salvar em um novo arquivo os dados copiados.

[]s

 
Postado : 27/10/2015 6:56 am