... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$182,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Caminho relativo mais enumeração

Lá no meu começo de programador, eu tinha o hábito de indicar o local de arquivos, utilizando o caminho absoluto.  Um exemplo de como eu carregava uma imagem:

me!MeuCampoImagem.Picture = "C:\MeuProjeto\imagens\NomeImagem.gif"

Imagina um projeto grande e cheio de "c:\" espalhado pelo vba?  Pois é, se tivesse que mudar a minha pasta de local, como por exemplo, para o Arquivos de Programas ou para uma unidade de pendrive, passaria a ter uma pequena dor de cabeça.  Isso é até relativamente fácil de se resolver com o Localizar e Substituir do vba, mas ter que mexer em algo que já estava funcionando é perda de tempo.

Isso é bem fácil de se resolver com a propriedade Path do objeto CurrentProject.  Exemplo:

me!MeuCampoImagem.Picture = currentProject.path & "\imagens\NomeImagem.gif"

O CurrentProject.path informa então o caminho completo aonde se encontra o banco de dados.  Abra a Janela Imediata do Visual Basic, através do menu exibir ou dando um CTRL+G e faça um teste digitando o comando CurrentProject.path.  Veja o meu teste na figura abaixo:

Usando Access

 

Mesmo que se troque a localidade da pasta ou o nome da pasta, o caminho sempre será indicado corretamente.

Então o currentproject.path acaba se tornando um caminho relativo para todas as subpastas aonde se encontra o banco de dados.  Veja na figura abaixo um exemplo de como você deve montar a arquitetura de pastas e arquivos do seu projeto:

Usando Access

 

Baseada na estrutura do exemplo acima, vou sofisticar o caminho relativo montando uma função para acrescentar as subpastas.  No exemplo do caminho da imagem eu teria uma escrita assim:

me!MeuCampoImagem.Picture = fncOrigem(4) & "NomeImagem.gif"

Onde fncOrigem(4) retorna o caminho C:\MeuProjeto\Imagens.  Observou bem a função incluindo a subpasta imagens.

Vamos montar nosso primeiro esboço da função, que retorna o caminho relativo acrescentando as subpastas.

Public Function fncOrigem(pasta as byte)

Dim strlocal As String
 
  Select Case pasta
    Case 0: strlocal = "\backup\"
    Case 1: strlocal = "\"
    Case 2: strlocal = "\div"
    Case 3: strlocal = "\icones\"
    Case 4: strlocal = "\imagens\"
    Case 5: strlocal = "\sons\"
  End Select
fncOrigem = Application.CurrentProject.Path & strlocal

End Function

O Select Case lê o valor numérico informado do argumento pasta e então carrega a variável  strlocal com o nome da subpasta correspondente.  Essa variável strlocal é então concatenada com o currentproject.path.

fncOrigem(3)  me retornará C:\MeuProjeto\icones\

Não está prático ficar lembrando do número correspondente à pasta.  Felizmente temos um recurso à nossa  disposição muito interessante que é a de se poder criar uma lista suspensa para argumentos, através da instrução enum.  Veja como é simples:

Public Enum mPasta
   mBackup
   mBd
   mDiv
   mIcones
   mImagens
   mSons
End Enum
 

Os itens da enum assumem um número, conforme a posição na lista, começando por 0(zero).  Por exemplo, mIcones = 3

Poderíamos montar com uma numeração diferente.  Exemplo:

Public Enum mPasta
   mBackup = 5
   mBd = 6
   mDiv = 4
   mIcones = 2
   mImagens =3
   mSons = 1
End Enum

Para o argumento assumir esta lista, basta referenciar o enum mPasta a variável pasta

Public Function fncOrigem(pasta as mPasta)

Quando você então abre o colchete da função para digitar o argumento, veja o que acontece!

Usando Access

 

Show, não é? Não tem que decorar mais nada.  Mesmo assim se quiser entrar com o número correspondente também pode.

O item mbd da lista é o único que não se refere a uma subpasta e sim ao local do banco de dados, ou seja, retorna a pasta do projeto.  fncOrigem(mbd) retona C:\MeuProjeto\.   O que eu quero acrescentar ao projeto é uma comodidade da função, retornando o caminho do projeto e omitindo o argumento da função. Assim: fncOrigem() deverá  retornar também C:\MeuProjeto\

Para se omitir o argumento da função é necessário acrescentarmos a palavra chave Optional na frente do argumento.  exemplo:

Public Function fncOrigem(Optional pasta as mPasta)

Ao omitirmos o argumento, pasta assumirá o valor padrão zero , que é o primeiro item da lista de mPasta.  Só que o primeiro item da lista refere-se a subpasta Backup e não o local do banco de dados.  Então fncOrigem() retornará C:\Meuprojeto\Backup\ .    Para resolver a questão, basta informarmos o item que desejamos como padrão.  Assim:

Public Function fncOrigem(Optinal pasta as mPasta = mbd)

Observe bem a figura abaixo.  Quando se digita a função é fornecida uma dica de qual item é o padrão, caso você não entre com o argumento. 

Isso é muito comum aparecer nas funções do Access.  Por exemplo, você pode observar isso na função msgbox()

Usando Access

 

Como resultado temos:

Usando Access

 

Veja a função completa:

Option Compare Database
'-------------------------------------------------
'Cria uma lista para usar com o argumento pasta
'Cada item corresponde a número começando do zero
'-------------------------------------------------
Public Enum mPasta
  mBackup
  mbd
  mDiv
  mIcones
  mImagens
  mSons
End Enum

---------------------------------------------------------------------------

Public Function fncOrigem(Optional pasta As mPasta = mbd)
 
On Error Resume Next
Dim strLocal As String
 
Select Case pasta
  Case 0: strLocal = "\backup\"
  Case 1: strLocal = "\"
  Case 2: strLocal = "\div\"
  Case 3: strLocal = "\icones\"
  Case 4: strLocal = "\imagens\"
  Case 5: strLocal = "\sons\"
  Case Else: MsgBox "Pasta informada fora da lista...", vbInformation, "Aviso"
End Select
 
fncOrigem = Application.CurrentProject.Path & strLocal

End Function

Coloquei o projeto em um arquivo zip pra você baixar.  Independente do local que você escolher baixar, ele tem que carregar a figura no formulário e quando der o clique no botão, a caixa de mensagem tem que informar o valor 4.   Essa é a idéia: de você escolher o local qualquer e tudo continuar  funcionando.

Usando Access

 

Abra o módulo VBA do formulário e veja como foi aplicado a função apresentada aqui.

Bom estudo!


 

 


20 comentário(s)

alberto rufino   02/02/2010 15:32:31

gostei muito da dica amigo
pois estou precisando muito dela
albertorufino@hotmail.com

alberto rufino    15/02/2010 22:59:10

ai amigo gostei muinto do artigo.. so queria era sabe como cria uma pasta
digitando o nome no campo e cria direto um diretorio .. se vc pode mim da uma dica agradeço
e pq estou desenvolvento sisteama para digitalizar documento e tem q grava em cada pasta diferentes
alberto rufino (albertorufino@hotmail.com

Avelino Sampaio   16/02/2010 07:47:23

Alberto,

estude pelo help do Access o comando FileSystem do VBA

Para criar um diretório:

FileSystem.mkdir("c:\PastaDoSeuProjeto\NomeDaSuaNovaPasta")


Sucesso


Marcelo   13/05/2010 14:40:05

Grande Avelino, sempre colaborando com o aprendizado dos menos favorecidos. Eu estava mesmo precisando desse recurso, pois estou desenvolvendo um bd aqui e estava pegando as imagens pelo caminho absoluto. Aí pensei que se simplesmente colocasse "\Meu projeto\Imagens\imagem.bmp" fosse dar certo, mas não deu. Então joguei a questão no Google e ele me enviou à essa página. O CurrentProject.Path funcionou direitinho. Agora não preciso mais me preoucupar com o local aonde colocarão o sistema, pois esse sistem será ampacotado no developer e distribuído para algumas pessoas juntamente com o runtime.
Valeu mesmo pela dica.
Abração.

sergio   04/06/2010 09:52:09

Show de bola, pena que o 2000 e 2003 esteja tão esquecido e só o 2007 seja o rei. De qualquer forma os meus parabéns pelos códigos fantásticos e pelo ecelente trabalho que está à disposição de toda a comunidade.

Abraço

Avelino Sampaio   07/06/2010 08:28:34

Sergio,

Fico muito feliz por ter ajudado. Com o lançamento do Office 2010 a coisa piorou ainda mais para o Access 2003 e 2000.

Sucesso

Darlan Canez   30/08/2010 11:22:55

Caro Avelino, realmente a dica é muito boa, sou iniciante no acces e gostaria de sebar porque no seu exemplo, não consigo carregar JPEG, se puder me ajudar fico grato, pois quero usar estas imagens para vincular como fundo de formulário e está dando erro, uso o 2007.
Obrigado

Davi D'almada   17/03/2011 11:00:52

Olha!
vc é um génio.
mt obrigado pela dica,
encontrei seu tuto nao faz tempo, mas tou gostando d+++ essa é uma aula completa q tas oferecendo!
sucessos, em breve serei como vc! te adimiro mt

Marcelo David   10/05/2011 02:02:10

Olá Avelino, mas uma vez venho lhe agradecer por suas dicas e aulas. Tenho aprendido muito no seu site. Também gostaria de lhe fazer uma pergunta: e no caso das fotos terem que ficar na mesma pasta do back-end, num servidor, e varios usuários usarem a mesma base de dados, teria como adapitar seu código para localiza em rede? A minha dúvida vem da seguete razão: A propriedade Path do objeto CurrentProject condidera o projeto atual o front-end ou o back-end?
Grato

Avelino Sampaio   10/05/2011 06:02:18

Marcelo,

path considera o front-end.

Baixe o aplicativo exemplo Maestro. No módulo mod_checaVinculo tem uma função chamada de fncBackEndAtual(). Esta função captura o caminho completo do back-end. Poderá então usa-lá para indicar o local das suas fotos.

Sucesso.

Filipe Magalhaes   17/02/2012 15:59:27

muito bom o artigo porém estou precisando fazer uma busca dentro de várias pastas mas consigo apenas em uma pasta veja meu codigo:

Dim Linha As Long
Dim strDBPath As String
Dim strDBFile As String
Dim test As Object

strDBPath = "\\caminho da pasta\"


Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(strDBPath)
Set fc = f.subfolders

For Each f1 In fc

Dim FSO As Object, Pasta As Object, Arquivo As Object, Arquivos As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

'verifica se existe o caminho digitado
If FSO.folderexists(f1.Name) Then
MsgBox "A pasta '" & t & "' não existe.", vbCritical, "Erro"
Exit Sub
End If

'seta a variavel pasta o diretorio que está em f1
Set Pasta = FSO.GetFolder(f1)
Set Arquivos = Pasta.Files

arqs = 0

MsgBox (arqs)

'enquanto não acabarem os arquivos dentro da pasta arqs continua recebendo
For Each Arquivo In Arquivos



'Arqs = Arqs + 1

'MsgBox UCase$(Arquivo.Path)
'MsgBox Format$((Arquivo.Size / 1024), "#,##0") & " KB"
'MsgBox Format$(Arquivo.Type)
'MsgBox Format$(Arquivo.Name)

Next
'preenche na tela qual total de arquivos na pasta determinada
MsgBox "Total de arquivos da pasta " & f1.Name & " é " & arqs

Next

Filipe Magalhaes   17/02/2012 16:01:01

me ajude por favor, pois nao consigo e não sei mais prosseguir
rs
meu contato
filipemmaga@gmail.com

Marcondes Souza   18/10/2012 17:41:10

Olá Avelino,

Estou com um probleminha, tenho um projeto que trabalho nele a quase 1 ano, pois trabalho num depto. de Projetos e Engenharia de uma empresa sucroalcooleira, nesse projeto criei um sistema que cadastramos todos os desenhos da empresa no BD, pois esses dias pra ká, tive um problema de armazenamento de anexos no BD, pois o BD não está suportando mais anexos, ou seja, hoje o BD está com 2 Gb. Realmente preciso de sua ajuda, sendo o seguinte: no meu projeto quando faço o Login pela primeira vez na máquina, automáticamente pede para localizar o back-end, após a localização eu salvo o endereço. O que necessito da sua ajuda é, preciso criar um campo "Endereço" na tabela de cadastro de desenhos para que cada desenho cadastrado receba o endereço de onde o desenho está armazenado na pasta, ou seja, fora do BD, estou tentando adaptar o código lá da função localiza arquivo. Pode ser a mesma coisa ? Um abraço !!!!

Marcondes Souza   29/10/2012 17:08:19

Avelino,

Obrigado por sua atenção !!!! estou até hoje esperando uma posição do meu questionário do dia 18/10/2012 17:41:10 para que você me ajudasse num impasse, mas tudo bem !! creio q vc esteja muito ocupado !!! desculpa lhe encomodar !!!! um abraço !

Marcos silva   22/01/2013 14:56:34

Boa tarde,
Avelino, gostaria muito de seu apoio, pois tenho um banco de dados que é acessado por varias maquinas e necessita importar um arquivo do excell, porem em cada máquina este arquivo esta em um local diferente e com nome diferente, vc pode me ajudar a cria um vba em que eu vou indicar o caminho e o nome do arquivo num formulario?
Obrigado

Paulo Victor   11/02/2013 19:21:15

Estou fazendo um trabalho de cadastro de clientes, como posso carregar uma lista suspensa para uma lista de vendedores? Estou utlizando VBA no Acces

Leandro   25/04/2013 16:06:11

Avelino, boa tarde!
Usei o código em um projeto onde cada registro tem uma imagem diferente...
porém está apresentando erro na compilação... sou iniciante e gostaria muito de entender sobre caminho relativo.
Não tem como você postar um exemplo?
obrigado...
"Que Deus possa te abençoar mais e mais..."

josafa clemente   09/01/2014 11:00:29

Avelino, muitíssimo obg. Sempre que tenho alguma duvida, encontro resposta muito satisfatórias. Muito bem explicadas. Muito mais sucesso pra você.

Graça Pinho   17/01/2014 13:09:13

Gostaria de saber o seguinte, quem tiver a gentileza de me ajudar. Tenho uma base de dados em access, e aquilo que necessito é que o access me dê um alerta ou envie mg para o outlook ,quando se verificar uma condição que é quando os documentos cuja data de saída é superior a 6 meses. Como hei-de fazer??? Desde já agradeço

Edimar Santiago   11/06/2014 11:45:28

Bom dia, moro em Padre Bernardo Goias, e gostaria de saber:

Na linha "PlaySound fncOrigem(mSons) & "click.wav", 10, 1"

Os números 10 e 1, representa o que?

Desdi já agradeço e aproveito para elogiar pelo o excelente trabalho.


Envie seu comentário: