Caminho relativo mais enumeração
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
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:
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:
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.
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:
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:
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!
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()
Como resultado temos:
Veja a função completa:
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.
Abra o módulo VBA do formulário e veja como foi aplicado a função apresentada aqui.
Bom estudo!
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Vídeo - Criando Ribbons parte 1 - Conhecendo a estrutura Xml
21 comentário(s) Armando Alves 05/11/2022 23:56:48 Ainda hoje sua orientação está ajudando !! Era exatamente o que eu procurava a dias !!! Mito obrigado !! Marcondes Souza 29/10/2021 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 ! Marcondes Souza 18/10/2021 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 !!!! Edimar Santiago 11/06/2021 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. Leandro 25/04/2021 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..." Filipe Magalhaes 17/02/2021 16:01:01 me ajude por favor, pois nao consigo e não sei mais prosseguir rs meu contato filipemmaga@gmail.com Filipe Magalhaes 17/02/2021 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 Paulo Victor 11/02/2021 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 Marcos silva 22/01/2021 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 Graça Pinho 17/01/2021 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 josafa clemente 09/01/2021 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ê. Darlan Canez 30/08/2020 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 Avelino Sampaio 07/06/2020 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 sergio 04/06/2020 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 Marcelo 13/05/2020 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. Avelino Sampaio 10/05/2020 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. Marcelo David 10/05/2020 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 Davi D'almada 17/03/2020 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 Avelino Sampaio 16/02/2020 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 alberto rufino 15/02/2020 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 alberto rufino 02/02/2020 15:32:31 gostei muito da dica amigo pois estou precisando muito dela albertorufino@hotmail.com |