none
Como acessar um banco de dados Access pelo Excel 2010 64 bits RRS feed

  • Pergunta

  • Prezados,

    Antes de instalar o Excel 2010 64 bits, eu usava o seguinte código p/ acessar um banco de dados Access com uma macro do Excel:

    Referência:
    Microsoft ActiveX Data Objects 2.5 Library

    Declarações:
    Public cnn As New ADODB.Connection
    Public rs As New ADODB.Recordset

    Código para abrir a conexão:
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath_ & "\" & _
    sBanco_ & ".mdb;Jet OLEDB:Database Password=123;Persist Security Info=False"
    rs.CursorLocation = adUseClient

    Código para acessar o banco:
    Set rs = New Recordset
    sSql = "SELECT * FROM nomes WHERE nome = 'fulano'"
    rs.Open sSql, cnn, adOpenStatic, adLockOptimistic

    Por favor, alguém pode me passar a Referência, Declarações e Códigos para acessar pelo Excel 2010 64 bits?

    Desde já sou grato,

    Sergio Rubano

    quarta-feira, 9 de maio de 2012 18:00

Respostas

  • Se você tem o Excel 2010 x64, provavelmente tem o Access 2010 x64 também. Se não tem instale o Access 2010 runtime x64.

    Depois use o Provider 'Microsoft.ACE.OLEDB.12.0'.

    Ou então em lugar de usar o OLeDB utilize o DAO com a referencia 'Microsoft Office 14.0 Access Database Engine Object Library'

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:32
    quarta-feira, 9 de maio de 2012 21:40
  • Deixo-te um exemplo básico utilizando a referencia Microsoft Office 14.0 Access database engine Object Library

    Public Function CampoBdAccess(BaseDeDados, Tabela, Condicao, CampoRetorno)
        Dim DB As Database, rst As Recordset
        
        Set DB = OpenDatabase(BaseDeDados)
        Set rst = DB.OpenRecordset("SELECT * FROM " & Tabela & " WHERE " & Condicao)
        If Not rst.EOF Then
            If Not IsNull(rst(CampoRetorno)) Then
                CampoBdAccess = rst(CampoRetorno).Value
            Else
                CampoBdAccess = Empty
            End If
        Else
            CampoBdAccess = Empty
        End If
    End Function
    

    

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:32
    quinta-feira, 10 de maio de 2012 07:41
  • O erro de compilação aparece porque deves ter esquecido inserir a referência ao Microsoft Office 14.0 Access database engine Object Library

    Para abrir bases de dados com password:

    Set DB = OpenDatabase(BaseDeDados,False,False,";PWD=" & PassWord)

    Neste caso podes inserir na funcção mais um parametro para a password, ou defini-la como uma variavel publica.


    • Editado Nando Freitas quinta-feira, 10 de maio de 2012 20:09
    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:32
    quinta-feira, 10 de maio de 2012 20:07
  • O aviso ao colocar a senha informa qual o tipo de proteção.

    Nesse caso será por página (recordset) e não por linha (record).

    Ao criar um recorset todos os registos aí colocados serão bloqueados aos outros utilizadores.

    Em VBA e utilizando o DAO (neste caso) não é possivel abrir bases de dados access encryptadas com o novo método, também não consigo entender!

    Tem de alterar as opções do Access para ao encryptar conseguir na mesma abrir utilizando o DAO.

    Para isso vá a opções | Definições od Cliente | Método de Encriptação, e escolha a outra opção.

    Abra a base de dados em modo exclusivo e remova a encryptação em seguida encrypte novamente.

    Outro método, que eu uso muitas vezes é inserir a password utilizando o VBA:

        Dim DB As Database
        Set DB = OpenDatabase("C:\.....\Database.accdb", True )
        DB.NewPassword "password", "novapassword"
        DB.Close
    

    É claro que nenhum outro utilizador pode ter a base de dados aberta.

    Nota: As base de dados do Access 2010 encryptadas com o novo metodo podem ser abertas em Vb.Net utilizando o OleDb sem qualquer problema.

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:33
    sexta-feira, 11 de maio de 2012 09:18
  • Para selecionar registos use o procedimento OpenRecordset, para manipulação de dados (UPDATE INSERT DELETE) use o procedimento Execute.

    Para saber a quantidade correcta de registos, tem de mover o cursor do recordset para o ultimo registo (MoveLast), e só depois obter o RecordCount.

    Se pretende saber a quantidade de registos de um recordset apenas para uso desse valor deve usar a função de agregação COUNT, (SELECT COUNT(*) FROM Tabela WHERE condição). Se quer esse valor para usar num ciclo afim de percorrer todos os registos, não precisa use o ciclo For Each ... Next

    Deve ter atenção a criar recordsets com muito registos, porque vai sobrecarregar o sistema  e caso esteja a utilizar um db em rede, irá demorar mais tempo.


    • Editado Nando Freitas domingo, 13 de maio de 2012 08:30
    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:33
    domingo, 13 de maio de 2012 08:29
  • No VB6 tem de usar o ADODB. Penso que seja essa a referência, já não uso o VB6 faz muitos anos.

    Mas como você falou no Access 2010 64 bits e o VB6 é 32 bits não sei se irá funcionar.

    Aconselho a mudar para Vb.Net e usar o OleDb.

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:33
    terça-feira, 15 de maio de 2012 07:51
  •  O Programa está AQUI

    A ajuda está AQUI e claro AQUI

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:20
    terça-feira, 15 de maio de 2012 21:27

Todas as Respostas

  • Se você tem o Excel 2010 x64, provavelmente tem o Access 2010 x64 também. Se não tem instale o Access 2010 runtime x64.

    Depois use o Provider 'Microsoft.ACE.OLEDB.12.0'.

    Ou então em lugar de usar o OLeDB utilize o DAO com a referencia 'Microsoft Office 14.0 Access Database Engine Object Library'

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:32
    quarta-feira, 9 de maio de 2012 21:40
  • Se você tem o Excel 2010 x64, provavelmente tem o Access 2010 x64 também. Se não tem instale o Access 2010 runtime x64.

    Depois use o Provider 'Microsoft.ACE.OLEDB.12.0'.

    Ou então em lugar de usar o OLeDB utilize o DAO com a referencia 'Microsoft Office 14.0 Access Database Engine Object Library'

    Nando,

    Primeiramente muito obrigado pela ajuda, eu tenho o Access do mesmo pacote instalado, acontece que tentei, mas não consegui testar. Marquei a referência, mas não consegui descobrir as declarações e códigos para abrir e para acessar o banco.

    Se for possível detalhar, desde já sou grato.

    quinta-feira, 10 de maio de 2012 01:04
  • Deixo-te um exemplo básico utilizando a referencia Microsoft Office 14.0 Access database engine Object Library

    Public Function CampoBdAccess(BaseDeDados, Tabela, Condicao, CampoRetorno)
        Dim DB As Database, rst As Recordset
        
        Set DB = OpenDatabase(BaseDeDados)
        Set rst = DB.OpenRecordset("SELECT * FROM " & Tabela & " WHERE " & Condicao)
        If Not rst.EOF Then
            If Not IsNull(rst(CampoRetorno)) Then
                CampoBdAccess = rst(CampoRetorno).Value
            Else
                CampoBdAccess = Empty
            End If
        Else
            CampoBdAccess = Empty
        End If
    End Function
    

    

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:32
    quinta-feira, 10 de maio de 2012 07:41
  • Fiz o seguinte teste:

    Sub teste()
    ' Atalho do teclado: Ctrl+m
      MsgBox CampoBdAccess("C:\Teste\banco.accdb", "bancos", "empresa = 'default'", "banco")
    End Sub

    Public Function CampoBdAccess(BaseDeDados, Tabela, Condicao, CampoRetorno)
        Dim DB As Database, rst As Recordset
       
        Set DB = OpenDatabase(BaseDeDados)
        Set rst = DB.OpenRecordset("SELECT * FROM " & Tabela & " WHERE " & Condicao)
        If Not rst.EOF Then
            If Not IsNull(rst(CampoRetorno)) Then
                CampoBdAccess = rst(CampoRetorno).Value
            Else
                CampoBdAccess = Empty
            End If
        Else
            CampoBdAccess = Empty
        End If
    End Function

    Apresentou o seguinte erro:

    Erro de compilação:
    O tipo definido pelo usuário não foi definido

    Dim DB As Database

    Também não sei onde colocar a senha do banco

    quinta-feira, 10 de maio de 2012 16:41
  • O erro de compilação aparece porque deves ter esquecido inserir a referência ao Microsoft Office 14.0 Access database engine Object Library

    Para abrir bases de dados com password:

    Set DB = OpenDatabase(BaseDeDados,False,False,";PWD=" & PassWord)

    Neste caso podes inserir na funcção mais um parametro para a password, ou defini-la como uma variavel publica.


    • Editado Nando Freitas quinta-feira, 10 de maio de 2012 20:09
    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:32
    quinta-feira, 10 de maio de 2012 20:07
  • Nando, desculpe-me, na verdade não me esqueci de marcar a referência, tinha marcado errado.
    Funcionou com o banco sem senha.
    Quando eu coloco uma senha no banco vem este aviso:
    A criptografia com uma codificação de bloco não é compatível com o bloqueio de nível de linha. O bloqueio de nível de linha será ignorado.
    E quando executo o código:
    Set DB = OpenDatabase(BaseDeDados, False, False, ";PWD=123")
    Dá o seguinte erro:
    Erro em tempo de execução '3031':
    Senha inválida.
    sexta-feira, 11 de maio de 2012 03:35
  • O aviso ao colocar a senha informa qual o tipo de proteção.

    Nesse caso será por página (recordset) e não por linha (record).

    Ao criar um recorset todos os registos aí colocados serão bloqueados aos outros utilizadores.

    Em VBA e utilizando o DAO (neste caso) não é possivel abrir bases de dados access encryptadas com o novo método, também não consigo entender!

    Tem de alterar as opções do Access para ao encryptar conseguir na mesma abrir utilizando o DAO.

    Para isso vá a opções | Definições od Cliente | Método de Encriptação, e escolha a outra opção.

    Abra a base de dados em modo exclusivo e remova a encryptação em seguida encrypte novamente.

    Outro método, que eu uso muitas vezes é inserir a password utilizando o VBA:

        Dim DB As Database
        Set DB = OpenDatabase("C:\.....\Database.accdb", True )
        DB.NewPassword "password", "novapassword"
        DB.Close
    

    É claro que nenhum outro utilizador pode ter a base de dados aberta.

    Nota: As base de dados do Access 2010 encryptadas com o novo metodo podem ser abertas em Vb.Net utilizando o OleDb sem qualquer problema.

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:33
    sexta-feira, 11 de maio de 2012 09:18
  • Fiz conforme orientado e a pesquisa funcionou como esperado.

    Nando, gostaria me merecer mais alguma ajuda sua:
    SELECT funcionou, mas DELETE, UPDATE e INSERT INTO deu erro:
    Erro em tempo de execução 3219
    Operação inválida.
    Também após uma pesquisa SELECT precisaria saber quantos registros tem o recordset. rst.RecordCount informa o ponteiro e não a quantidade.

    domingo, 13 de maio de 2012 02:04
  • Para selecionar registos use o procedimento OpenRecordset, para manipulação de dados (UPDATE INSERT DELETE) use o procedimento Execute.

    Para saber a quantidade correcta de registos, tem de mover o cursor do recordset para o ultimo registo (MoveLast), e só depois obter o RecordCount.

    Se pretende saber a quantidade de registos de um recordset apenas para uso desse valor deve usar a função de agregação COUNT, (SELECT COUNT(*) FROM Tabela WHERE condição). Se quer esse valor para usar num ciclo afim de percorrer todos os registos, não precisa use o ciclo For Each ... Next

    Deve ter atenção a criar recordsets com muito registos, porque vai sobrecarregar o sistema  e caso esteja a utilizar um db em rede, irá demorar mais tempo.


    • Editado Nando Freitas domingo, 13 de maio de 2012 08:30
    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:33
    domingo, 13 de maio de 2012 08:29
  • Boa noite.

    Talvez há uma solução mais simples, que não tenho como testar.

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath_ & "\" & _
    sBanco_ & ".mdb;Jet OLEDB:Database Password=123;Persist Security Info=False"

    Usando seu código inicial, tente alterar:

    para:

    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath_ & "\" & _
    sBanco_ & ".mdb;Jet OLEDB:Database Password=123;Persist Security Info=False"


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    domingo, 13 de maio de 2012 23:38
    Moderador
  • Boa noite.

    Talvez há uma solução mais simples, que não tenho como testar.

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath_ & "\" & _
    sBanco_ & ".mdb;Jet OLEDB:Database Password=123;Persist Security Info=False"

    Usando seu código inicial, tente alterar:

    para:

    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath_ & "\" & _
    sBanco_ & ".mdb;Jet OLEDB:Database Password=123;Persist Security Info=False"


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    Não tenho mais como testar este código, pois já alterei todo o projeto para usar:
    Microsoft Office 14.0 Access database engine Object Library e esta funcionando blz.
    Grato.
    terça-feira, 15 de maio de 2012 01:24
  • Nando, boa noite,
    Muito obrigado por tudo. A macro esta funcionando de acordo.
    A macro é para tirar um relatório, o projeto mesmo é em VB6.
    Tem como fazer o VB6 reconhecer o banco de dados Access 2007/2010?
    terça-feira, 15 de maio de 2012 01:43
  • No VB6 tem de usar o ADODB. Penso que seja essa a referência, já não uso o VB6 faz muitos anos.

    Mas como você falou no Access 2010 64 bits e o VB6 é 32 bits não sei se irá funcionar.

    Aconselho a mudar para Vb.Net e usar o OleDb.

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:33
    terça-feira, 15 de maio de 2012 07:51
  • Tenho mesmo que migrar para VB.Net, mas não tenho conhecimento da linguagem.
    Você poderia me indicar um local mais em conta para aprender.
    terça-feira, 15 de maio de 2012 16:31
  •  O Programa está AQUI

    A ajuda está AQUI e claro AQUI

    • Marcado como Resposta Sergio Rubano terça-feira, 15 de maio de 2012 22:20
    terça-feira, 15 de maio de 2012 21:27
  • Muito obrigado por toda ajuda.

    quarta-feira, 16 de maio de 2012 15:38
  • Por favor, como faço para saber se uma conexão está aberta?
    Antes fazia DB.State e obtinha uma resposta sim/não.
    Desde já sou grato.

    domingo, 20 de maio de 2012 01:37
  • No VB.Net e usando OleDb.Connection ou ADODB.Connection:

    If Conn.State = ConnectionState.Closed Then ... Else ...

    domingo, 20 de maio de 2012 08:43
  • Grato
    domingo, 20 de maio de 2012 18:33