VBA - Excel - Preenchendo um controle ListView usando FileSystemObject


Neste artigo vamos abordar os recursos do  ListView e do FileSystemObject do VBA e veremos como preencher o  controle ListView com os arquivos de uma determinada pasta selecionada pelo usuário usando o FileSystemObject. Veremos também como exportar o conteúdo do ListView para a planilha Excel.

Neste exemplo vamos usar também o FileDialog para abrir uma janela de diálogo para seleção de pastas e a função MsgBox que exibe uma mensagem em uma caixa de diálogo.

O Visual Basic for Applications (VBA) é uma implementação do Visual Basic da Microsoft incorporada em todos os programas do Microsoft Office, bem como em outras aplicações da Microsoft, como o Visio, e que foi também incorporada pelo menos parcialmente em outros programas de terceiros como o AutoCAD, Mathcad e WordPerfect. Ele substitui e estende as capacidades de anteriormente existentes linguagens de programação de macros específicas para as aplicações e pode ser usado para controlar a quase totalidade dos aspectos da aplicação anfitriã, incluindo a manipulação de aspectos do interface do usuário tais como menus e barra das ferramentas e o trabalho com formulários desenhados pelo usuário ou com caixas de diálogo.
http://pt.wikipedia.org/wiki/Visual_Basic_for_Applications

Eu estou usando o Microsoft Office Excel 2007 e sistema operacional Windows 7, e portanto o código deste artigo foi testado somente nesta versão e ambiente.

Antes de prosseguir eu sugiro que você leia os seguintes artigos da seção VBA do site Macoratti .net

Carregando um ListView com arquivos de uma pasta usando FileSystemObject

Abra o Microsoft Excel 2007, e clique no ícone para abrir o menu de opções.

Selecione a opção Salvar ou Salvar Como;

Na janela Salvar Como, informe o nome do projeto : Excel_ListViewListaArquivos e altere a opção Tipo para : Pasta de Trabalho Habilitada para Macro do Excel e clique em Salvar:

Este procedimento irá criar uma nova pasta de trabalho (Workbook) em branco contendo três planilhas.

Definindo Macros

O que é uma macro?

Uma macro é uma coleção de comandos que você pode aplicar com um único clique. As macros podem automatizar quase tudo que seja possível executar no programa que você está usando e até mesmo permitem fazer coisas que talvez você não soubesse que fossem possíveis.

As macros são programação, mas para usá-las, você não precisa ser um desenvolvedor e nem mesmo ter conhecimento de programação. A maioria das macros que você pode criar nos programas do Office é escrita em uma linguagem chamada Microsoft Visual Basic for Applications, ou VBA.

Em muitos programas do Office, você pode criar uma macro gravando uma série de ações ou escrevendo a macro. Vamos escrever uma macro que será usada para abrir o formulário UserForm1.

Para isso vamos incluir um Módulo em nosso projeto. Pressione ALT+F11 para abrir o Editor Visual Basic, clique no menu Inserir -> Módulo;

Após essa operação digite o código abaixo no módulo inserido:

Sub AbreFormulario()
    UserForm1.Show
End Sub

Este código usa o método Show que exibe um objeto UserForm.

Criamos assim o código em uma Macro pois vamos abrir o formulário UserForm1 a partir da planilha Excel.

Pressione ALT+F11 novamente, estando no editor Visual Basic, para retornar à planilha Excel.

Usando a planilha Plan1 clique na guia Desenvolvedor e a seguir na opção Inserir e selecionando o controle de formulário Botão:

Após selecionar o Botão coloque-o na planilha Excel. Fazendo isso de imediato será aberta a janela atribuir macro, exibindo as duas macros que criamos no  Módulo.

Selecione a macro AbreFormulario e clique em OK;

Com isso atribuímos a macro AbreFormulario criada ao botão de comando da planilha:

A seguir selecione o botão e altere o nome de Botão 4 para Pesquisar no ListBox;

Pronto ! agora podemos abrir a planilha Excel e clicar no botão para abrir o formulário UserForm1.

Criando o formulário com ListView

Agora temos que criar o formulário UserForm1 e vamos fazer isso no Editor Visual Basic (VBE).

Pressione ALT+F11 para abrir o Editor Visual Basic (VBE);

Do VBE você pode ir para o Excel clicando no botão Excel no topo/esquerdo de sua tela . Assim usando os dois botões você pode navegar no VBE para o Excel e, vice-versa.

Nota: Você também pode abrir o Editor Visual Basic clicando no menu Desenvolvedor e a seguir no ícone Visual Basic.

Vamos incluir no projeto VBA um formulário ou UserForm, para isso, clique no menu Inserir -> UserForm;

Podemos agora a partir da Caixa de Ferramentas selecionar controles e arrastar e soltar no formulário.

Vamos selecionar os seguintes controles  arrastando cada um  e soltando no UserForm1 :

Obs: Eu estou usando os nomes padrões dos controles neste exemplo por pura preguiça de alterar a propriedade name. O correto em um projeto real é sempre dar nomes significativos aos controles. Ex: lbDados, cmdPreencher, etc.

Vamos dispor os controles conforme o leiaute abaixo usando o mouse para dimensionar os controles do tamanho desejado.

Altere também as seguintes propriedades do UserForm diretamente na janela de propriedades:

Este formulário será aberto a partir do controle de formulário Botão que incluímos na planilha Excel através da ação de uma  macro

Quando o formulário UserForm1 for aberto o usuário deverá selecionar uma pasta a partir da qual serão obtidos os arquivos para preenchimento do ListView após o usuário clicar no botão Preencher Lista.

Após isso o usuário poderá exportar o conteúdo do ListView para uma planilha Excel clicando no botão - Exportar para o Excel, ou retornar ao Excel clicando no botão - Retornar ao Excel.

Para encerrar o Excel o usuário deve clicar no botão Encerrar o Excel.

Vejamos a seguir o código de cada uma dessas funcionalidades.

Clique com o botão direito sobre UserForm e selecione Exibir Código.

A  seguir digite o código abaixo para criar o procedimento preencherLista no módulo:

Private Sub preencherLista()
    'define variáveis que serão usadas no código
    Dim fso As Object
    Dim fldr As Object
    Dim Files As Object
    Dim oFile As Object
    Dim li As ListItem
     
    On Error GoTo ErrHandler    
     'define os cabeçalhos da coluna
    With ListView1
        With .ColumnHeaders
            .Clear 
             'adiciona colunas
            .Add , , "Nome", 110
            .Add , , "Tipo", 140, lvwColumnLeft
            .Add , , "Tamanho", 60, lvwColumnRight
            .Add , , "Data Modificação", 60, lvwColumnCenter
            .Add , , "Data Acessado", 60, lvwColumnCenter
            .Add , , "Data Criação", 60, lvwColumnCenter
        End With
        .View = lvwReport 'exibir em modo de relatório
    End With    
    'cria o objeto FileSystemObject
    Set fso = CreateObject("Scripting.FileSystemObject")
    'define a pasta a partir da qual iremos obter os arquivos
    Set fldr = fso.GetFolder(TextBox1.Text)
    'obtem os arquivos da pasta
    Set Files = fldr.Files     
    'preenche o listview com os dados
    For Each oFile In Files
       'na primeira coluna informa o nome
        Set li = ListView1.ListItems.Add(, , oFile.Name)
        ' a seguir inclui os demais dados dos arquivos
        li.SubItems(1) = oFile.Type
        li.SubItems(2) = Format$(oFile.Size, "0")
        li.SubItems(3) = Format$(oFile.DateLastModified, "DD MMM YYYY")
        li.SubItems(4) = Format$(oFile.DateLastAccessed, "DD MMM YYYY")
        li.SubItems(5) = Format$(oFile.DateCreated, "DD MMM YYYY")
    Next     
EndProc:
    'se ocorreu um erro continua e libera os recursos
    On Error Resume Next
    Set li = Nothing
    Set oFile = Nothing
    Set fldr = Nothing
    Set fso = Nothing
   
     Exit Sub    
ErrHandler:   
    'exibe uma mensagem de erro e executa a rotina para liberar os recursos
    MsgBox "ERRO: " & Err.Description, vbexclmation, "Erro"
    Resume EndProc    
End Sub

O código esta comentado então vou destacar apenas os pontos principais:

1- Criando o cabeçalho no ListView

With ListView1
        With .ColumnHeaders
            .Clear
          
  'adiciona colunas
            .Add , , "Nome", 110
            .Add , , "Tipo", 140, lvwColumnLeft
            .Add , , "Tamanho", 60, lvwColumnRight
            .Add , , "Data Modificação", 60, lvwColumnCenter
            .Add , , "Data Acessado", 60, lvwColumnCenter
            .Add , , "Data Criação", 60, lvwColumnCenter
        End With
        .View = lvwReport
'exibir em modo de relatório
    End With   

Este código cria o cabeçalho no controle ListView preparando-o para receber as informações e exibir no formato de relatório (.View = lvwReport )

2- Obtendo os arquivos do sistema de arquivos a partir a pasta indicada em TextBox1

     'cria o objeto FileSystemObject
    Set fso = CreateObject("Scripting.FileSystemObject")
    'define a pasta a partir da qual iremos obter os arquivos
    Set fldr = fso.GetFolder(TextBox1.Text)
    'obtem os arquivos da pasta
    Set Files = fldr.Files    

Este código usa o objeto FIleSystemObject que fornece acesso ao sistema de arquivos do computador local, e, obtêm a relação de artigos para a pasta indica em TextBox1.

3- Preenchendo o controle ListView

'preenche o listview com os dados
    For Each oFile In Files
       'na primeira coluna informa o nome
        Set li = ListView1.ListItems.Add(, , oFile.Name)
        ' a seguir inclui os demais dados dos arquivos
        li.SubItems(1) = oFile.Type
        li.SubItems(2) = Format$(oFile.Size, "0")
        li.SubItems(3) = Format$(oFile.DateLastModified, "DD MMM YYYY")
        li.SubItems(4) = Format$(oFile.DateLastAccessed, "DD MMM YYYY")
        li.SubItems(5) = Format$(oFile.DateCreated, "DD MMM YYYY")

    Next    

Este código inicia uma laço For Each percorrendo os arquivos obtidos e incluindo-os no controle ListView.

Abaixo veja o resultado da execução deste código :

Para selecionar uma pasta o usuário deve clicar no botão de comando ao lado do TextBox1 - CommadButton3.

Para isso temos que incluir o seguinte código evento Click deste controle:

Private Sub CommandButton3_Click()
    'chama a rotina para obter os arquivos da pasta informada em TextBox1
    TextBox1.Text = GetPasta(TextBox1.Text)
End Sub

Este código apenas chama a função GetPasta() passando o nome da pasta padrão. O resultado será exibido no próprio TextBox1.

Para criar a funçao GetPasta digite logo abaixo do código acima o seguinte código:

Function GetPasta(strPath As String) As String
'define a pasta a ser escolhida
Dim pasta As FileDialog
Dim sItem As String
'o objeto FileDialog retorna um objeto que representa um instância de uma caixa 
' de diálogo para abrir arquivos  a enumeração msoFileDialogFolderPicker de 
' MsoFileDialogType retorna uma pasta
Set pasta = Application.FileDialog(msoFileDialogFolderPicker)
With pasta
      'define o titulo e desabilita a seleção múltipla
    .Title = "Selecione uma Pasta"
    .AllowMultiSelect = False
    .InitialFileName = strPath  
    'se cancelou então exibe o nome original caso contrário 
    'retorna o nome da pasta escolhida
    If .Show <> -1 Then
      sItem = strPath
    Else
      sItem = .SelectedItems(1)
   End If      
End With
'retorna a seleção e limpa recursos
GetPasta = sItem
Set fldr = Nothing
End Function

O código acima permite que o usuário selecione uma pasta a partir da qual os arquivos serão obtidos.

Exportando para o Excel

No evento Click do botão de comando - Exportar para o Excel - temos o código abaixo que abre uma nova planilha Excel e exporta os dados do ListView para a planilha.

Private Sub ExportaParaoExcel()
Dim objExcel As New Excel.Application
Dim bkWorkBook As Workbook
Dim shWorkSheet As Worksheet
Dim i As Integer
Dim j As Integer
    Set objExcel = New Excel.Application
    Set bkWorkBook = objExcel.Workbooks.Add
    Set shWorkSheet = bkWorkBook.ActiveSheet

    For i = 1 To ListView1.ColumnHeaders.Count
        shWorkSheet.Cells(1, Chr(64 + i)) = ListView1.ColumnHeaders(i)
    Next

    For i = 1 To ListView1.ListItems.Count
        shWorkSheet.Cells(i + 2, "A") = ListView1.ListItems(i).Text
        For j = 2 To ListView1.ColumnHeaders.Count
            shWorkSheet.Cells(i + 2, Chr(64 + j)) = ListView1.ListItems(i).SubItems(j - 1)
        Next
    Next   
    objExcel.Visible = True
End Sub

Esta é uma rotina genérica que percorre o listView e exporta os cabeçalho e os dados a partir da célula A1.

Veja o resultado da exportação na figura abaixo:

Finalmente temos a seguir  código do evento Click do botão Retornar para o Excel apenas descarrega o formulário UserForm1.

Private Sub CommandButton5_Click()
    Unload UserForm1
End Sub

E o código que encerra o Excel no evento Click do botão Encerrar o Excel :

Private Sub CommandButton2_Click()

    Dim iResposta As Integer
    'pergunda se deseja encerrar
    iResposta = MsgBox("Deseja encerrar a aplicação e fechar o Excel agora ?", vbYesNo, "Macoratti.net")
    If iResposta = vbYes Then Application.Quit 'se responder yes então fecha o excel

End Sub

Este código usa a função Msgbox para exibir uma mensagem ao usuário solicitando a confirmação para encerrar o Excel usando o comando :  Application.Quit

Vimos então como usar diversos recursos do Excel VBA que podem adaptados às suas necessidades na criação de suas aplicações VBA com Excel.

Aguarde novos artigos sobre os recursos VBA Excel.   

Pegue a planilha aqui : Excel_ListViewListaArquivos.zip

  • João 6:63 O espírito é o que vivifica, a carne para nada aproveita; as palavras que eu vos tenho dito são espírito e são vida. (Jesus Cristo)
  • Referências:


    José Carlos Macoratti