... Pague apenas R$67,00 uma única vez e tenha acesso por 1 ano aos vídeos e arquivos exemplos do site ...

Clique aqui e obtenha mais detalhes.


Como saber pelo VBA se uma tabela existe

Existem duas formas simples para verificarmos a existência de tabela:  uma, é tentarmos abrir a tabela pelo objeto Recordset e a outra, é consultarmos a tabela de sistema MSysObjects.

Objeto Recordset

Ao tentarmos abrir uma tabela não existente pelo Recordset, o VBA acusará um erro. 

Dim rs As DAO.Recordset
'-------------------------------
'Abrindo a tabela pelo Recordset
'-------------------------------
Set rs = CurrentDb.OpenRecordset("tblAlunos")

Veja o número(3078) e a mensagem informada pelo VBA , por não encontrar a tabela:

Usando Access - Código fonte página HTML

 

Com a linha On error Resume next no início do código, o VBA prossegue com a execução, mesmo havendo erro e nenhuma mensagem é exibida .

Logo após a execução da linha do Recordset, podemos consultar se o número 3078 foi registrado no objeto Err

Veja o código completo abaixo e leia com atenção os comentários:

Public Function fncTabelaExiste(strNomeTabela As String) As Boolean
Dim rs As DAO.Recordset
'---------------------------------------------------------------
'Solicita ao VBA que prossiga com a execução do código,
'mesmo havendo erro e não mostre nenhuma mensagem.
'---------------------------------------------------------------
On Error Resume Next
'-----------------------------------
'Abre a tabela pesquisada
'-----------------------------------
Set rs = CurrentDb.OpenRecordset(Nometabela)
'---------------------------------------------------------------
'Se a tabela não existir, haverá erro e o valor(3078) será 
'armazenado no objeto Err.  Este valor poderá ser investigado
'através do comando Err.number
'---------------------------------------------------------------
fncTabelaExiste = Not Err.Number = 3078
Set rs = Nothing
End Function

Agora é só utilizar a função no seu código.  Exemplo:

If fncTabelaExiste("tblAlunos") then
'Se a tabela existe, faço algo aqui
else
'Se a tabela NÃO existe, faço algo aqui
end if

Tabela MsysObject

Quando criamos ou vinculamos uma tabela, o Access armazena o nome (name) e o seu tipo (type) na tabela de sistema MSysObjects.  Se a tabela criada for local, o campo type armazenará o valor 1 e se a tabela for vinculada, a type armazenará o valor 6.

Basta, então, usarmos a função Dcount() para contar a quantidade de registros existentes na tabela MSysObject, que contenha o nome da tabela pesquisada.  Se a contagem for maior que zero a tabela pesquisada existe.  Veja no código abaixo:

Public Function fncTabelaExiste(strNomeTabela As String) As Boolean
Dim filtro$
filtro = "(type = 1 or type =6) AND name='" & strNomeTabela & "'"
fncTabelaExiste = DCount("name", "MsysObjects", filtro) > 0
End Function

Modificando um pouco a função acima, podemos ampliar a pesquisa para os objetos consulta, formulário e relatório:

Option Compare Database

Enum TipoObjeto
   Formulario = -32768
   Consulta = 5
   TabelaLocal = 1
   TabelaVinculada = 6
End Enum
 
Public Function fncObjetoExiste(NomeObjeto As String, Tipo as TipoObjeto) As Boolean
Dim Filtro$
Filtro = "type = " & Tipo & " AND name='" & NomeObjeto & "'"
fncObjetoExiste = DCount("name", "MsysObjects", filtro) > 0
End Function

Para pesquisarmos se um formulário existe, basta utilizarmos a função da seguinte forma:

If fncObjetoExiste("frmAlunos", Formulario) then
'Formulário existe, faço algo aqui
else
'Formulário NÃO existe, faço algo aqui
end if

Para saber sobre enumeração (Enum), clique aqui e leia o meu artigo.

Existência de campo na tabela

Com esta linha de comando abaixo, conseguimos contar a quantidade de campos em uma tabela:

CurrentDb.TableDefs("NomeDaTabela").Fields.Count

Com esta linha abaixo, capturamos o nome do campo na tabela:

CurrentDb.TableDefs("NomeDaTabela").Fields(NúmeroIndice).Name

Através do FOR, conseguimos percorrer todos os campos da tabela e assim investigarmos o seu nome:

Public Function fncCampoExiste(strNomeCampo As String, strNomeTabela As String) As Boolean
Dim j%
For j = 0 To CurrentDb.TableDefs(strNomeTabela).Fields.Count - 1
   If CurrentDb.TableDefs(strNomeTabela).Fields(j).Name = strNomeCampo Then
      fncCampoExiste = True
      Exit Function
   End If
Next
fncCampoExiste = False
End Function

Utilizando a função:

If fncCampoExiste("NomeAluno", "tblAlunos") then
'Campo existe, faço algo aqui
else
'Campo NÃO existe, faço algo aqui
end if

Sucesso!


 

 


6 comentário(s)

Gilailson   26/08/2013 13:20:54

Avelino como faço para aprender a utilizar os Actvex - TreeView e ListView????
Procurei em vários sites e não encontro.
E seu modo de ensinar é tudo de bom!!!


Att...gilailsonpl@yahoo.com

Eduardo Rubio   26/08/2013 17:33:11

Muito boa explicação, parabéns!!!
Isso é muito útil nos aplicativos...

Marcio Melo - RJ   01/09/2013 19:58:09

Nunca tive uma idéia de como poderia manipular tabela e campo no access, agora com esse método de abordagem. Era o que me faltava para incrementar novos campos quando preciso adicionar em uma tabela eu faço manualmente, agora se não existir posso fazer um create. Muito bacana as possibilidades... Avelino deixo essa idéia de um exemplo de form onde podemos criar novos campos X numa tabela X (vincula com senha) que determinarmos.

Sou mais Brasil!

Forte abraço!

Vítor Perotto   13/02/2014 10:16:22

Excelente postagem. Utilizei a função "fncCampoExiste" e funcionou perfeitamente. Muito obrigado!

Joseny    09/09/2014 11:41:19

Prezado Avelino,
Peguei a rotina acima para testar e realmente ele encontra a tabela quando existe, porém, quando não existe ele não inibe o erro mesmo estando com a linha "On Error Resume Next" conforme vc explicou. Será que tem algum parâmetro que preciso mexer?

Obigado!

Selle   21/03/2017 16:58:13

Avelino, um pequeno adendo no seu código...
Nesta linha --> Set rs = CurrentDb.OpenRecordset(Nometabela) <-- Voce nao digitou o "str" na frente de (Nometabela).

Public Function fncTabelaExiste(strNomeTabela As String) As Boolean
Dim rs As DAO.Recordset
'---------------------------------------------------------------
'Solicita ao VBA que prossiga com a execução do código,
'mesmo havendo erro e não mostre nenhuma mensagem.
'---------------------------------------------------------------
On Error Resume Next
'-----------------------------------
'Abre a tabela pesquisada
'-----------------------------------
Set rs = CurrentDb.OpenRecordset(Nometabela)
'---------------------------------------------------------------
'Se a tabela não existir, haverá erro e o valor(3078) será
'armazenado no objeto Err. Este valor poderá ser investigado
'através do comando Err.number
'---------------------------------------------------------------
fncTabelaExiste = Not Err.Number = 3078
Set rs = Nothing
End Function


Envie seu comentário: