Connexion Oracle depuis VBA avec ADODB

Bonjour ,

J'ai changé de version Windows (W7 a W10) et les codes VBA que j'avais sous mon Excel de la W7 ne s'execute pas sur mon Excel W10 notamment a cause d'un pb de DLL (Composant DAO360) donc je ne peux pas utiliser cette reference.

Mon ancien code se presentait comme ceci (A noter que je pouvais utiliser la reference DAO Librairy dans l'ancienne version) :

Function GET_DATA_DB(X_k As Long)

Workbooks("FlexSJ_7.xlsm").Sheets(X_k).Activate
'ActiveSheet.Range(Range(Range("A2"), Range("A2").End(xlToRight)), Range(Range("A2"), Range("A2").End(xlToRight)).End(xlDown)).ClearContents
If Range("A2").Value <> "" Then
ActiveSheet.Range(Range(Range("A1"), Range("A1").End(xlToRight)), Range(Range("A1"), Range("A1").End(xlToRight)).End(xlDown)).Offset(1, 0).ClearContents
End If

requete_text = Sheets("Requete").Shapes(CStr(X_k)).TextFrame.Characters.Text

Set Query = cnx.CreateQueryDef("DATA")

With Query

.Sql = requete_text

Set Bonds_Data = .OpenRecordset(dbOpenDynaset)

ThisWorkbook.Sheets(X_k).Activate
ActiveSheet.Range("A2").CopyFromRecordset Bonds_Data

.Close

.Refresh
End With

Edit modo : merci de mettre le code entre balises avec le bouton </>

J'aimerai adapter ce code a la specificité ADODB , sans faire intervenir les references ADO.

Quelqu'un peut il m'aider svp ?

bonjour,

ton code avec ADO sera complètement différent!

avant de partir sur ADO je te suggérai de regarder les références de ton projet!

dans VBA Menu=>outils=>références

tu décoche toute les librairies manquantes et tu réactive DAO !

Aucune librairie n’est manquante

Et je ne veux pas aller sur ADO mais plutôt ADODB vu que je ne peux pas utiliser ADO depuis mon Windows

Quand je veux charger ADO ça me sort comme message d’erreur “erreur lors du chargement de la DLL”

Dans les références il faut activer Microsoft ActiveX Data Object

il y'a plusieurs Microsoft Active X. C'est lequel plus precisement ?

image

Bonjour monsieur henri27 ,

il y'a plusieurs Microsoft Active X. C'est lequel plus precisement ?

J'utilise dans mes feuilles de calcul le Microsoft Activex Data Objects 2.8 Library (et fonctionne bien) . Faire un test avec le Microsoft Activex Data Objects 2.7 Library .

Pourrait joindre un échantillon de votre fichier avec votre code vba déjà installé, je voudrais vérifier le fonctionnement de votre code mentionné ci-dessus .

câlins .

bonjour,

voici un exemple en relation avec ton premier poste!

With CreateObject("Adodb.connection")
    .Open "Driver={Microsoft ODBC for Oracle};Server=ServeurOracle.schema;Uid=NomUtilisateur;Pwd=MotDePasse;"
    ActiveSheet.Range("A2").CopyFromRecordset .Execute("Select * from DATA")
    .Close
End With
63classeur2.xlsm (23.98 Ko)

Bonjour,

Ci joint un extrait de code et son fichier .

Je galère en effet sur la fonction Get Data et comme je l'ai dit plus haut je ne reussis pas a charger la reference Microsoft DAO 3.6 Object librairie..

Si quelqu'un a un code adaptable merci d'avance .

Je comprends pas tu demandes avec ADO je te donnes un exemple et maintenant tu parles de DAO???????

tu décoches la librairie DAO et tu prends le code que j'ai fourni !

Comment est ce possible que je ne réussisse pas a executer ce code qui me renvoi le message d'erreur suivant sur la ligne de la creation du Workspace

image

Sub WorkspaceX()

Dim wrkNewAcc As Workspace
Dim wrkLoop As Workspace
Dim prpLoop As Property

' Create a new Microsoft Access workspace.
Set wrkNewAcc = CreateWorkspace("NewAccessWorkspace", _
"admin", "", dbUseJet)
Workspaces.Append wrkNewAcc

' Enumerate the Workspaces collection.
For Each wrkLoop In Workspaces
With wrkLoop
Debug.Print "Properties of " & .Name
' Enumerate the Properties collection of the new
' Workspace object.
For Each prpLoop In .Properties
On Error Resume Next
If prpLoop <> "" Then Debug.Print " " & _
prpLoop.Name & " = " & prpLoop
On Error GoTo 0
Next prpLoop
End With
Next wrkLoop

wrkNewAcc.Close
End Sub

J'ai pu finalement installer la reference DAO 3.6 Library

Merci d'avance

Sinon quand j'essaye d'executer le nouveau code ci dessous en prenant en compte ce que vous m'avez fourni j'ai un message d'erreur:

Function GET_DATA_DB(X_k As Long)

Workbooks("FlexSJ_7.xlsm").Sheets(X_k).Activate
'ActiveSheet.Range(Range(Range("A2"), Range("A2").End(xlToRight)), Range(Range("A2"), Range("A2").End(xlToRight)).End(xlDown)).ClearContents
If Range("A2").Value <> "" Then
ActiveSheet.Range(Range(Range("A1"), Range("A1").End(xlToRight)), Range(Range("A1"), Range("A1").End(xlToRight)).End(xlDown)).Offset(1, 0).ClearContents
End If

requete_text = Sheets("Requete").Shapes(CStr(X_k)).TextFrame.Characters.Text

With CreateObject("Adodb.connection")
.Open "Provider=oraoledb.oracle;Data Source=" & ODBCName & ";User Id=" & User & ";Password=" & Pwd
ActiveSheet.Range("A2").CopyFromRecordset Bonds_Data.Execute("Select * from DATA")
.Close
End With

image

J'ai 2 questions:

1- Comment introduire ma requete etant donné qu'elle se presente sur une feuille Excel comme vous pouvez le voir sur mon fichier Execl transmis plus haut ?

2-Comment integer la syntaxe "Set Bonds_Data = .OpenRecordset(dbOpenDynaset)" comme dans mon premier bout de code ?

Merci d'avance

Bonsoir,

ton erreur c'est d'avoir utilisé Bonds_Data.Execute("Select * from DATA") n'est pas déclaré vue qu'on utilise

With CreateObject("Adodb.connection")
With CreateObject("Adodb.connection")
.Open "Provider=oraoledb.oracle;Data Source=" & ODBCName & ";User Id=" & User & ";Password=" & Pwd
ActiveSheet.Range("A2").CopyFromRecordset .Execute("Select * from DATA") 'retrourne un recorset vers le CopyFromRecordset
.Close
End With
 .Execute 'C'est comme OpenRecordset ça retourne un recordset que tu peux utiliser directement dans le CopyFromRecordset!

Quand j'execute j'ai ce message d'erreur encore:

image

Par contre la syntaxe SQL "("Select * from DATA")" n'est elle pas cené etre remplacé par ma requete "requete_text = Sheets("Requete").Shapes(CStr(X_k)).TextFrame.Characters.Text" ?

Merci

Bonjour,

Le message est clair,il dit que la table n'existe pas !

Execute la requête dans SQL Manager !

ActiveSheet.Range("A2").CopyFromRecordset .Execute(Sheets("Requete").Shapes(CStr(X_k)).TextFrame.Characters.Text)

Bonjour,

remplace

.execute("select * from DATA") qui est un exemple de SQL

par

.execute(requete_text) qui est le SQL que tu veux exécuter

J'ai ce message d'erreur :

image

Quand je remplace par ".execute(requete_text)" 

Pareil:

image

j'ai ajouter un Debug.Print requete_text dans ton code !

ta requête devrait apparaitre dans la fenêtre d'exécution de VBA! copy colle la dans oracle Sql Manager pour la tester!

Workbooks("FlexSJ_7.xlsm").Sheets(X_k).Activate
'ActiveSheet.Range(Range(Range("A2"), Range("A2").End(xlToRight)), Range(Range("A2"), Range("A2").End(xlToRight)).End(xlDown)).ClearContents
If Range("A2").Value <> "" Then
ActiveSheet.Range(Range(Range("A1"), Range("A1").End(xlToRight)), Range(Range("A1"), Range("A1").End(xlToRight)).End(xlDown)).Offset(1, 0).ClearContents
End If

requete_text = Sheets("Requete").Shapes(CStr(X_k)).TextFrame.Characters.Text
Debug.Print requete_text
With CreateObject("Adodb.connection")
.Open "Provider=oraoledb.oracle;Data Source=" & ODBCName & ";User Id=" & User & ";Password=" & Pwd
'ActiveSheet.Range("A2").CopyFromRecordset Bonds_Data.Execute("Select * from DATA")
.Close
End With

Meme message d'erreu mais j'aimerai etre fixé sur quelques points:

- Je ne pense pas avoir Sql Manager (si oui je ne sais pas comment y avoir acces)

-C'est une macro que j'essaye d'automatiser et il y'a plein d'autres fonctions derrière , je ne peux donc pas me permettre d'ouvrir un autre programme manuellement

-j'ai toujours le meme message d'erreur sur la commande SQL, est ce que de votre coté ca s'execute parfaitement ?

image

Bonjour,

c'est une message d'erreur SQL ORACLE, pas VBA. Donc tu valides d'abord ta syntaxe SQL avec l'outil SQL d'oracle puis tu utilises cet SQL correct dans ton programme VBA.

Pour t'aider, mets-nous la commande SQL que tu essaies d'exécuter (cad le contenu de la variable requete_text)

Rechercher des sujets similaires à "connexion oracle vba adodb"