segunda-feira, 8 de abril de 2013

Abrir Janela para Selecionar Arquivo no VBA

Boa noite, pessoal!

Recentemente tive de criar uma ferramenta em Access onde o usuário deveria indicar o caminho de uma planilha para importar no banco de dados. O caminho do arquivo deveria ser flexível e fácil de alterar, e a melhor maneira de fazê-lo pareceu ser então com as já conhecidas telinhas de seleção de arquivos do Windows.

Após alguma leitura na internet, encontrei a codificação necessária. É bastante simples, mas muito útil no desenvolvimento de soluções e basicamente não há alterações para uso em ambas as ferramentas (Excel/Access). Segue o código comentado:



Function AbrirArquivo()

    Dim Caminho As String 'Caminho do arquivo
    Dim fDialog As Office.FileDialog
    
    'Configura caixa de seleção do arquivo
    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
    With fDialog
        .AllowMultiSelect = False 'Habilita ou desabilita a seleção de múltiplos arquivos
        .Title = "Selecionar arquivo..."
        '.InitialFileName =  'Caminho inicial para seleção, não utilizado no exemplo
        
        'Configura filtros da caixa de seleção
        .Filters.Clear 'Limpa os filtros
        .Filters.Add "Arquivos Excel - .xlsb", "*.xlsb" 'Adiciona filtro para arquivos .xlsb
        .Filters.Add "Arquivos Excel - .xls", "*.xls" 'Adiciona filtro para arquivos .xlsb
        
        If .Show = True Then    'Se o parâmetro .Show for igual à True significa
                                'que algum arquivo foi selecionado
            Caminho = .SelectedItems.Item(1)    'Local + arquivo selecionados são passados para
                                                'a variável chamada de "Caminho"
        Else
            MsgBox "Você clicou em cancelar"
        End If
        
    End With

    AbrirArquivo = Caminho 'Atribui o caminho do arquivo ao retorno da função

End Function



Caso chamada dentro de uma célula do Excel, a função acima irá abrir a janela para seleção do arquivo e retornar o caminho indicado acrescido do nome do arquivo! Por exemplo, ao selecionar o arquivo "Exemplo.xlsb" na raiz do disco rígido "C:\", a função irá retornar a string "C:\Exemplo.xlsb". Ela também pode ser chamada diretamente de outra subrotina.

É isso, pessoal... Qualquer dúvida, sugestões ou consultoria, por favor escrevam para guiamacroexcel@gmail.com!

Obrigado e até a próxima!

domingo, 7 de abril de 2013

Dica: Calcular Range

Pessoal, boa noite!

Hoje vou compartilhar um código simples mas muito poderoso e que tem me auxiliado bastante no desenvolvimento de planilhas que trabalham com grande volume de cálculo.

Mesmo em arquivos que não ocupam muito espaço na memória, um volume elevado de funções pode deixar o cálculo muito lento. Aguardar 40 segundos, por exemplo, quando alguma nova função é implementada no arquivo pode ser extremamente oneroso ao longo de qualquer desenvolvimento.

Lendo o artigo presente neste link (leitura interessante), encontrei algumas dicas para otimização de performance. Também encontrei uma referência ao método "Range.Calculate", que permite calcular apenas uma área selecionada na planilha em uso! Este método pode ser chamado apenas através do VBA, o que pode ser implementado com a inserção da rotina abaixo:


Sub CalculaRange()

'Macro para calcular apenas as células no Range selecionado da planilha.

    Dim rng As Range
    Set rng = ActiveSheet.Range(Selection.Address(False, False)) 'Passa para a variável 'rng' o Range selecionado
        
    On Error Resume Next
    Application.Calculation = xlManual 'Muda modo de cálculo para manual
    rng.Calculate 'Calcula apenas o Range selecionado

End Sub

Uma outra dica: com o cálculo manual ativado, é que é possível calcular apenas as abas selecionadas usando "SHIFT + F9".

Estas funções são poderosas e muito úteis, mas devem ser usadas com cautela. Como nem sem o arquivo inteiro é recalculado, pode ser que o resultado visualizado na tela não seja igual ao do cálculo completo do arquivo.

Aos que se interessarem, recomendo também a leitura deste artigo que tem muita informação interessante.

Bom, é isso... Espero que tenham gostado!

Até a próxima!