2012-08-28 7 views
1

J'ai une classe qui gère ma connexion à une base de données Access 2003. Je voudrais configurer la même chose seulement pour les fichiers Access 07/10 .accdb. Toute aide est appréciée! Je vous remercie!Connexion Excel VBA à Access 2010

Voici une liste de mes références et une copie de l'objet de classe

Références:

  • Microsoft Access 14.0 Object Library
  • Microsoft DAO 3.6 Object Library

ConnectionClass:

Option Explicit 

Private Const DbFile = "\\server\folders\Report.mdb" 
Dim OpenConn As DAO.Database 
Dim ObjAccess As Object 

Private Sub Class_Initialize() 
    On Error Resume Next 
    Set OpenConn = DAO.OpenDatabase(DbFile) 
    If Err.Number = 3024 Then MsgBox "Check connection string in the VBA StaticClass object", vbOKOnly 

    Set ObjAccess = CreateObject("Access.Application") 
    ObjAccess.Visible = False 
    ObjAccess.OpenCurrentDatabase (DbFile) 
End Sub 

Public Function runSQL(ByVal sql As String) As Recordset 
    Set runSQL = OpenConn.OpenRecordset(sql) 
End Function 

Public Function runVolumeReport(ByVal inMacro As String) 
    ObjAccess.DoCmd.RunMacro inMacro 
End Function 

Public Function closeResources() 
    Set ObjAccess = Nothing 
    OpenConn.Close 
End Function 
+0

Je voudrais aussi 'Dim OpenConn As Object' au lieu de' DAO.Database'. Cela permet un code indépendant de la version (mais supprime les popups mignons que vous obtenez lorsque vous tapez le '. 'Après OpenConn ou DAO) – SeanC

+0

Lorsque je passe de .mdb à .accdb, il donne une erreur non reconnue. Je vais essayer de déterrer l'erreur exacte plus tard. – JKK

+0

J'ai eu le fichier ouvert, est allé de l'avant et l'a retourné à .accdb. Il échoue sur la fonction runSQL, donne l'erreur d'exécution 91, la variable d'objet ou avec la variable de bloc non définie. La fonction runVolumeReport s'exécute correctement pour le lancement de la macro dans la base de données. Juste n'aime pas la façon dont j'essaie de tirer un ensemble d'enregistrements à partir d'Access quand je le passe au format .accdb – JKK

Répondre

1

Un problème est survenu dans Class_Initialize.

On Error Resume Next 
Set OpenConn = DAO.OpenDatabase(DbFile) 
If Err.Number = 3024 Then MsgBox "Check connection string in the VBA StaticClass object", vbOKOnly 

En raison de On Error Resume Next, toute erreur autre que 3024 (« Impossible de trouver le fichier ») passera en silence et OpenConn ne sera pas défini comme vous avez l'intention. Plus tard lorsque vous essayez d'utiliser OpenConn, vous allez déclencher une autre erreur. Et, dans un commentaire, vous avez déclaré que vous obtenez une autre erreur avec cette ligne:

Set runSQL = OpenConn.OpenRecordset(sql) 

Malheureusement, en raison de On Error Resume Next, nous ne savons pas pourquoi OpenDatabase a échoué en laissant OpenConn unset. Étant donné que ObjAccess semble fonctionner en tant qu'objet d'application Access, vous pouvez essayer de définir OpenConn à ObjAccess.CurrentDb.

Private Sub Class_Initialize() 
    Set ObjAccess = CreateObject("Access.Application") 
    ObjAccess.Visible = False 
    ObjAccess.OpenCurrentDatabase DbFile 
    Set OpenConn = ObjAccess.CurrentDb 
End Sub 

OTOH, vous pouvez être en mesure de se passer entièrement OpenConn si vous changez votre fonction runSQL comme ça ...

Public Function runSQL(ByVal sql As String) As Recordset 
    'Set runSQL = OpenConn.OpenRecordset(sql) ' 
    Set runSQL = ObjAccess.CurrentDb.OpenRecordset(sql) 
End Function 
+0

Super, merci! – JKK

0

Une façon d'ouvrir une accdb table (SQL Server) est la suivante:

Dim cmd As New ADODB.Command 
Dim rs As ADODB.Recordset 
Dim strSQL As String 

strSQL = "select SomeStuff from SomeTable" 

cmd.ActiveConnection = CurrentProject.Connection 
cmd.CommandText = strSQL ' you can put in the SQL directly, 
         ' but I find the string easier to manipulate away from the .CommandText 
Set rs = cmd.Execute 

Mes références (Access 2010):
list of references
Je pense que l'une critique vous devrez ajouter serait Microsoft Bibliothèque ActiveX Data Objects XX

0
Imports System.Data.OleDb 

Public Class Form1 
    Dim strSQL As String 
    Dim ds As New DataSet 
    Dim strConnection As String 
    Dim DBconnection As New OleDbConnection 
    Dim oledbAdapter As New OleDbDataAdapter 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=P:\Informatica\April - Juni\Acces\db-games.accdb" 
     DBconnection = New OleDbConnection(strConnection) 
     strSQL = "SELECT * from tbl_games" 

     Try 
      DBconnection.Open() 
      oledbAdapter = New OleDbDataAdapter(strSQL, DBconnection) 
      oledbAdapter.Fill(ds) 
      DataGridView1.DataSource = ds.Tables(0) 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 
     DBconnection.Close() 
    End Sub 
End Class 

Dim con As New OleDbConnection ("Provider = Microsoft. ACE.OLEDB.12.0; Source de données = P: \ Informatica \ Acces \ db_Games.accdb; Persist Security Info = False ") Dim cmd comme nouveau OleDbCommand

con.Open() 

    cmd.Connection = con 

    cmd.CommandText = "INSERT INTO tbl_gerne(Omschrijving) VALUES('adventure')" 
    cmd.ExecuteNonQuery() 

    con.Close() 
+0

Bonjour Peter, bienvenue sur Stack Overflow. Veuillez prendre le temps de regarder [réponse] et envisager d'ajouter un texte de soutien à votre message pour expliquer ce que fait votre code. – TZHX