Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Excel: Microsoft Scripting Runtime

O Microsoft Scripting Runtime está incluído em diversos programas do Windows, como é o caso do Office e do próprio sistema operativo, e permite um fácil acesso a ficheiros e pastas, bem como simplifica o acesso de leitura e escrita de ficheiros de texto.

Por ser uma ferramenta disponível no sistema operativo pode ser usada por o Excel (VBA) mas também por outras aplicações que utilizem VBA (Access, Word, Outlook, etc) ou pelo Visual Basic 6.

O Microsoft Scripting Runtime tem 6 objectos que podem ser usados com bastante simplicidades: Dictionary (criação de colecções); Drive (acesso às drives do sistema); File (acesso a ficheiros); FileSystemObject (objecto base para acesso a drives, pastas e ficheiros); Folder (acesso a pastas) e TextStream (leitura e escrita em ficheiros de texto).

No seguinte exemplo serão utilizados apenas alguns objectos para mostrar como aceder a todos os ficheiros, com base em uma pasta inicial e suas sub-pastas, e listar seus nomes e alguns dados adicionais. 

Para implementar o exemplo é apenas necessário adicionar referência no VBE (Visual Basic Editor) ao Microsoft Scripting Runtime através do menu Tools - References e utilizar o seguinte código:

 

    Option Explicit

    ' Cria uma nova instância do FileSystemObject
    Private fso As New FileSystemObject

    ' Declaração de variáveis
    Private sFolder As Scripting.Folder
    Private myFile As Scripting.File
    Private myFolder As Scripting.Folder
    Private pos As Long

    ' --------------------------------------------------------------------
    ' Sub auxiliar que lista os ficheiros nas sub-pastas
    ' --------------------------------------------------------------------
    Sub ShowSubFolderFiles(ByVal folderName As String)

        ' Ignora erros em pastas protegidas, pastas de sistema, etc
        On Error Resume Next

        Set sFolder = fso.GetFolder(folderName) 

        ' Ciclo em todas as pastas 
        For Each myFolder In sFolder.SubFolders

        ‘ Ciclo em todos os ficheiros
            For Each myFile In myFolder.Files
                Cells(pos, 1).Value = myFile.Path
                Cells(pos, 2).Value = myFile.DateCreated
                Cells(pos, 3).Value = myFile.Size & " bytes"
                Cells(pos, 4).Value = myFile.Type
                Cells(pos, 5).Value = myFile.DateLastAccessed
                pos = pos + 1
            Next

            ' Recursividade: Caso a pasta tenha sub-pastas chama novamente
            ' o mesmo código - Sub ShowSubFolderFiles()
            If myFolder.SubFolders.Count > 0 Then
                ShowSubFolderFiles myFolder.Path
            End If 

        Next

    End Sub

 

    ' --------------------------------------------------------------------
    ' Sub principal que inicia o processo de listagem de
    ' todos os ficheiros, com base numa pasta inicial
    ' --------------------------------------------------------------------
    Sub ShowFolderFiles()
        Dim initialFolder As String 

        ' Ignora erros em pastas protegidas, pastas de sistema, etc
        On Error Resume Next

        ' Pasta inicial e linha da folha de cálculo onde será 
        ' iniciada a escrita dos ficheiros encontrados
        initialFolder = "C:\"
        pos = 1 

        ' Verifica se a pasta indicada existe
        If Not fso.FolderExists(initialFolder) Then
            MsgBox "A pasta " & initialFolder & " não existe!", vbCritical
            Exit Sub
        End If

        ' Define a pasta inicial
        Set sFolder = fso.GetFolder(initialFolder)

        ' Mostra os ficheiros na pasta inicial
        ' incrementado a posição (linha) onde escreve
        For Each myFile In sFolder.Files
            Cells(pos, 1).Value = myFile.Path
            Cells(pos, 2).Value = myFile.DateCreated
            Cells(pos, 3).Value = myFile.Size & " bytes"
            Cells(pos, 4).Value = myFile.Type
            Cells(pos, 5).Value = myFile.DateLastAccessed
            pos = pos + 1
        Next

        ' Mostra os ficheiros nas sub-pastas
        Call ShowSubFolderFiles(sFolder.Path)

        ' Limpa as variáveis da memória
        Set fso = Nothing
        Set myFolder = Nothing
        Set myFile = Nothing

    End Sub

 

Finalmente para testar o nosso código basta ir ao menu Tools – Macro – Macros (ALT+F8) e escolher a macro ShowFolderFiles(). Poderá, obviamente, ser utilizada através de um botão, menu, etc.

O seguinte exemplo mostra como listar ficheiros numa folha de cálculo mas o objectivo é mostrar as potencialidades desta biblioteca e como se podem fazer algumas operações.

Podem ser criados pastas, eliminados ficheiros, verificar se determinado ficheiros existe, escrever em ficheiros de texto, etc etc, de uma forma muito mais simples e sem o recurso a API’s ou códigos demasiado complicados.

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

10 comentários:

Kazu disse...

Olá amigo!

Muito bom o seu blog, já cadastrei nos meus favoritos e pretendo visitá-lo com frequencia.
Uma pergunta:
Como eu coloco o código indentado nas postagens?
Sempre que eu copio e colo um código, ele perde toda a formatação, os espaços, as cores, etc.

Obrigado e um abraço!

Anónimo disse...

Boas..
Sou um visitante assíduo do blog e gosto da forma como fazes os posts, muito bom!
Quero apenas deixar a sugestão de escreveres um post sobre o Crystal Reports na nova versão do VB (2008).
Continua o bom trabalho.

Jorge Paulino disse...

Olá,

Assim que possível coloco algo sobre Crystal Reports (utilizar parametros, criar pdf's dinâmicamente, etc).

Obrigado pelas sugestões!

Jorge Paulino

Repórter de Improviso disse...

Viva...

Bom esta deve ser, para quem sabe, muito básica mas pronto... Coloquei o código e ele diz-me logo que a minha unidade c:\ não existe. Tentei alterar para d:\ (porque tenho duas partições, e ele continua a dizer que não existe? Onde posso ir ver qual o nome do disco que esta macrová buscar??

Ah, já agora, criei um botão e coloquei o código dentro do botão. QUando lhe clico ele dá erro por causa do option explicit... Tenho que ir ao menu das macros e correr o outro. DE que forma o poso por a correr com o clique no botão??

Jorge Paulino disse...

Olá João

Para verificares se uma drive existe, apenas precisas de usar o seguinte código:

Dim fso As New FileSystemObject
If Not fso.DriveExists("C") Then
MsgBox "A drive pretendida não existe"
End If

Relativamente ao botão, o mais fácil é quando colocas o botão na folha, aparece um wizard das macros. Seleccionas novo e ele cria o código. É algo do género num módulo:

Sub Button1_Click()
' código aqui
End Sub

John Santos disse...

Sou novato em VB
construí uma macro que ao fim de alguns minutos sempre dá um erro normalmente o 28. É possivel através do On error fazer com que automaticamente execute uma rotina tipo Sub () End Sub?

Jorge Paulino disse...

Olá trigenium,

Pelo código do erro não dá para saber como resolver. Se possível mostre o seu código e coloque a questão na secção de VBA em www.portugal-a-programar.org

Eduardo Czarnecki Scalisa disse...

Olá, antes de mais nada parabéns pelo seu blog!!
Vamos a minha pergunta... gostaria de abrir um REPORT do ACCESS atraves do VB6. Já consegui fazê-lo mas para tal feito eu preciso ter instalado a versão full do access na máquina. Gostaria de saber se há a possibilidade de abrir o report do access atraves do vb6 tendo instalado apenas a versão RUN TIME do ACCESS? Desde já agradeço a atenção!
Att. Eduardo

Jorge Paulino disse...

Olá!

Obrigado pelos comentários sobre o Blog. Em relação à questão, não sei se é possível fazer o que pretende, mas penso que não é possível dessa forma.

Cumprimentos,
Jorge Paulino

Anonimo disse...

Precisa dizer algo? Show de bola! Muito Obrigado!



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico