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
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
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#