Accéder enregistré une requête conçue avec un générateur de requête appelé "myQuery". La base de données se connecte au système via une connexion ODBC. Les macros sont toutes incluses.
exceller a une connexion ADODB pour se connecter à la base de données via
Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "MyDatabase.accdb" End With
Habituellement, vous allez de l'avant et écrivez simplement votre SQL, ce qui est parfaitement bien, puis faites quelque chose comme
Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...
Mais je veux accéder à la requête que j'ai stockée dans la base de données d'accès. Alors, comment puis-je appeler la requête stockée sur la base de données que je viens de connecter.
Déjà essayé
- con.Execute("EXEC maRequête"), mais il m'a dit qu'il ne pouvait pas trouver myQuery.
- rs.Ouvrez "myQuery", avec mais celui-ci n'est pas valide et veut des instructions SELECT /etc
5 réponses
6
Je pense que vous pouvez le considérer comme une procédure stockée.
Si nous commençons juste avant Dim sqlQuery As String
Dim cmd comme nouveau ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()
Ensuite, prenez votre travail de jeu d'enregistrements après cela.
1
Tu y étais presque
Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb" End With con.Execute "Marequête"
Laissez Exek de côté.
Vous pouvez aussi ajouter des options, c'est un peu vieux mais ça devrait aider :
0
C'est une sorte de hack, mais vous pouvez demander une demande. Autrement dit, remplacez la ligne sql par ce qui suit :
SqlQuery = "SELECT * FROM NomRequête ;"
Avant d'exécuter ce programme, vous devez vous assurer que la base Données d'accès a été sauvé c'est-à-dire. appuyez sur Ctrl+S (il ne suffit pas d'exécuter la requête dans Access).
0
J'ai pu exécuter une requête de mise à jour qui était déjà stockée dans Access en utilisant :
Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc
Cela m'a donné des erreurs jusqu'à ce que je remplace les espaces dans le nom de la requête par des traits de soulignement à la fois dans la base de données Access et dans l'instruction d'exécution.
0
Cela fait longtemps que ce fil n'a pas été créé. Si je comprends tout correctement, je peux ajouter quelque chose d'utile. J'ai donné un nom à ce que décrit le PO, c'est-à-dire le processus en utilisant SQLà partir d'une requête stockée dans ACCDB pour s'exécuter en VBA via DAO ou ADOBD. Je lui ai donné le nom "fournisseur de propriété d'objet", même avec l'abréviation OPP dans mes notes, et le préfixe/suffixe pour le nom de l'objet.
L'idée est que objet existant dans ACCDB (généralement une requête) fournit une propriété (généralement SQL) à utiliser dans VBA. J'ai mis en place une fonction juste pour aspirer le SQL des requêtes pour cela; voir ci-dessous. Attention : désolé mais tout est en DAO, je n'utilise pas beaucoup ADODB. J'espère que vous trouverez toujours ces idées utiles.
Je suis même allé jusqu'à développer une méthode d'utilisation/insertion de paramètres de remplacement en SQL provenant de ces requêtes OPP. J'utilise ensuite VBA.Replace() pour effectuer le remplacement avant d'utiliser SQL dans VBA.
Chemin d'accès à l'objet DAO Requête SQL et dans ACCDB, cela ressemble à ceci :
MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL
J'utilise des paramètres remplaçables en évaluant ce qui doit être remplacé et en choisissant un nom inhabituel pour le paramètre qui ne peut pas exister dans la base de données réelle. Pour la plupart, les seules substitutions que j'ai faites sont des noms de champs ou de tables ou des expressions de clause WHERE et HAVING. Donc je les appelle des choses comme "(ReplaceMe00000001)" puis j'utilise remplacer la fonction() pour que ça marche...
SqlText = VBA.Replace(sqlText, "(ReplaceMe00000001)", "SomeActualParameter") ...
puis utilisez sqlText dans VBA. Voici un exemple de travail :
Public Function MySqlThing() Dim sqlText as String Dim myParamater as String Dim myExpression as String "Configurez tout. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression = "SomeDateOrSomething12/31/2017" . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Ensuite, utilisez SQL. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery(ByVal oppName As String) As String Dim app As Access.Application Dim db As DAO.Database Dim qdefs As DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText As String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppName) oppGetSqlText = qdef.SQL End Function
Exécuter la requête dans Access MakeTable à partir d'Excel
j'ai fichier Excel que je dois automatiser. Lorsque l'utilisateur ouvre un rapport Excel, il est invité à actualiser les données. S'ils disent oui, alors je dois exécuter la requête...
Exécuter la fonction VBA via une requête de vue dans MS Access 2013 à partir de JS ActiveX ADO
Comment exécuter une macro VBA via une requête de vue dans MS Access 2013 à partir de JS ActiveX ADO ? La fonction VBA est conçue pour obtenir utilisateur actuel, connecté avec : Public Declar...
Exécuter la requête enregistrée contenant "fonction" dans la base de données d'accès à partir d'Excel
J'essaie d'exécuter une requête stockée dans une base de données d'accès à partir d'Excel vba. La requête fonctionne bien si je l'ouvre et l'exécute dans la base de données d'accès, mais génère une erreur lorsque je l'exécute à partir d'un module ...
MS Access - Exécuter une requête enregistrée par nom dans VBA
Comment exécuter une requête enregistrée dans MS Access 2007 en VBA ? Je ne veux pas copier et coller SQL dans VBA. Je préfère juste faire le nom de la requête. Cela ne fonctionnera pas... VBA ne trouve pas la requête...
Comment exécuter une requête dans ms-access dans le code VBA ?
Comment puis-je interroger pour renvoyer des enregistrements dans la base de données ms-access à l'aide du code VBA?
Exécutez la demande d'accès à partir d'Excel et transmettez-lui les paramètres
Comment exécuter une requête dans la base de données MS Access à partir du code ExcelVBA ou macro. La demande MS-Access prend certains paramètres qui doivent être transmis à partir d'Excel. Merci
Contrôle d'un classeur Excel depuis Access 2010 VBA
J'ai une situation très similaire au post suivant : Demande d'accès à excel 2010 pour créer un graphique via vba Dans mon cas, j'exporte une table, mais je veux faire beaucoup plus pour le fichier...
Exécuter une requête SQL Server de bout en bout à partir d'Access VBA
J'ai une requête de passage UPDATE enregistrée dans Access 2007. Lorsque je double-clique sur la requête de passage, elle s'exécute avec succès. Comment puis-je obtenir que cette requête soit exécutée à partir de VBA? Je voudrais...
Importer un énorme ensemble de données dans Access à partir d'Excel via VBA
J'ai un énorme ensemble de données que je dois importer d'Excel vers Access (~ 800 000 lignes). Cependant, je peux ignorer les lignes avec une valeur de colonne spécifique qui totalisent environ 90 %...
Une requête MDX dans Excel vba ?
existe-t-il un moyen d'exécuter une requête MDX dans Excel VBA ? Je pensais que cela pouvait être fait via ADO , tout comme dans le cas de SQL (oui, je sais que SQL est différent de MDX - un problème qui revient souvent...
Cette leçon concerne Requêtes SQLà la base de données sur Accès VBA. Nous verrons comment les requêtes VBA INSERT, UPDATE, DELETE vers la base de données sont effectuées, et nous apprendrons également comment obtenir une valeur spécifique à partir d'une requête SELECT.
Ceux qui programment Accès VBA tout en travaillant avec la base de données serveur SQL, sont très souvent confrontés à une tâche aussi simple et nécessaire que l'envoi d'une requête SQL à la base de données, que ce soit INSERT, UPDATE ou une simple requête SQL SELECT. Et puisque nous sommes des programmeurs novices, nous devrions également être capables de le faire, alors aujourd'hui nous allons le faire.
Nous avons déjà abordé le sujet de l'obtention de données à partir d'un serveur SQL, où nous avons écrit du code en VBA pour obtenir ces données, par exemple, dans un article sur le téléchargement de données dans un fichier texte à partir de MSSql 2008 ou également abordé un peu dans le matériel Téléchargement de données depuis Access vers un modèle Word et Excel, mais d'une manière ou d'une autre, nous l'avons considéré superficiellement, et aujourd'hui je vous propose d'en parler un peu plus en détail.
Noter! Tous les exemples ci-dessous sont discutés à l'aide d'un projet Access 2003 ADP et d'une base de données MSSql 2008.
Données initiales pour exemples
Disons que nous avons une table test_table qui contiendra les numéros et les noms des mois d'une année (les requêtes sont effectuées à l'aide de studio de gestion)
CREER TABLE .( NOT NULL, (50) NULL) ON GO
Comme je l'ai dit, nous allons utiliser un projet ADP configuré pour fonctionner avec MS SQL 2008, dans lequel j'ai créé un formulaire de test et ajouté un bouton de démarrage avec une légende "Courir", dont nous aurons besoin pour tester notre code, c'est-à-dire nous écrirons tout le code dans le gestionnaire d'événements " Appuyez sur le bouton».
Requêtes de base de données INSERT, UPDATE, DELETE dans VBA
Afin de ne pas le faire traîner longtemps, commençons, disons que nous devons ajouter une ligne à notre table de test ( le code est commenté)/
Private Sub start_Click() "Déclarez une variable pour stocker la chaîne de requête Dim sql_query As String "Écrivez la requête dont nous avons besoin dedans sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "June")" "Exécuter avec DoCmd. RunSQL sql_query End Sub
Dans ce cas, la requête est exécutée en utilisant les paramètres de connexion à la base de données en cours. Nous pouvons vérifier si les données ont été ajoutées ou non.
Comme vous pouvez le voir, les données ont été insérées.
Afin de supprimer une ligne, nous écrivons le code suivant.
Private Sub start_Click() "Déclarez une variable pour contenir la chaîne de requête Dim sql_query As String "Ecrivez-y une requête de suppression sql_query = "DELETE test_table WHERE id = 6" "Exécutez-la DoCmd.RunSQL sql_query End Sub
Si nous vérifions, nous verrons que chaîne souhaitéeà la retraite.
Pour mettre à jour les données, nous écrivons une requête de mise à jour dans la variable sql_query, j'espère que le sens est clair.
Requête SELECT à la base de données dans VBA
Ici, les choses sont un peu plus intéressantes qu'avec d'autres constructions SQL.
Tout d'abord, disons que nous devons obtenir toutes les données de la table, et, par exemple, nous les traiterons et les afficherons dans un message, et vous, bien sûr, pouvez l'utiliser à d'autres fins, pour cela nous écrivons ce qui suit code
Private Sub start_Click() "Déclaration de variables" Pour un jeu d'enregistrements de la base de données Dim RS As ADODB.Recordset "Chaîne de requête Dim sql_query As String "Chaîne pour afficher les données totales dans le message Dim str As String "Création d'un nouvel objet pour le jeu d'enregistrements RS = New ADODB .Recordset "Query string sql_query = "SELECT id, name_mon FROM test_table" "Exécutez la requête en utilisant les paramètres de connexion du projet actuel pour afficher un message str = str & RS.Fields("id") & "-" & RS. Fields("name_mon") & vbnewline "aller à l'enregistrement suivant RS.MoveNext Wend "Message de sortie msgbox str End Sub
Ici, nous utilisons déjà les boucles d'accès VBA pour parcourir toutes les valeurs de notre jeu d'enregistrements.
Mais, bien souvent, il est nécessaire d'obtenir non pas toutes les valeurs d'un ensemble d'enregistrements, mais une seule, par exemple, le nom du mois par son code. Et pour cela, utiliser une boucle est en quelque sorte coûteux, nous pouvons donc simplement écrire une requête qui ne renverra qu'une seule valeur et s'y référer, par exemple, nous obtiendrons le nom du mois par le code 5
Private Sub start_Click() "Déclarer des variables "Pour un jeu d'enregistrements de la base de données Dim RS As ADODB.Recordset "Chaîne de requête Dim sql_query As String "Chaîne pour afficher la valeur finale Dim str As String "Création d'un nouvel objet pour le jeu d'enregistrements RS = Nouveau ADODB.Recordset "Query string sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "Exécuter la requête en utilisant les paramètres de connexion du projet actuel RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Obtenir notre valeur str = RS.Fields(0 ) msgbox str end sub
Pour l'universalité, ici nous avons déjà abordé non pas par le nom de la cellule, mais par son indice, c'est-à-dire 0, qui est la toute première valeur de Jeu d'enregistrements, à la fin nous avons obtenu la valeur "Peut".
Comme vous pouvez le voir, tout est assez simple. Si vous avez souvent besoin d'obtenir une valeur spécifique de la base de données ( comme dans le dernier exemple), alors je vous recommande de sortir tout le code dans une fonction séparée (Comment écrire une fonction dans VBA Access 2003) avec un paramètre d'entrée, par exemple, le code du mois ( compte tenu de notre exemple) et simplement, là où il faut afficher cette valeur, appelez la fonction dont nous avons besoin avec paramètre souhaité et c'est tout, avec cela nous réduirons considérablement le code VBA et améliorerons la perception de notre programme.
C'est tout pour aujourd'hui. Bonne chance!
Access vous permet de créer par programmation Chaînes SQL-requêtes, ainsi que des chaînes qui servent de valeurs de propriétés de formulaires, d'états, etc., de paramètres de fonction, etc., qui doivent également respecter la syntaxe SQL. Dans le même temps, il faut se rappeler que les constantes incluses dans une telle chaîne doivent également être formatées selon les règles de SQL, à savoir :
Si cela est violé, les effets suivants sont possibles :
Ci-dessous dans chaque section se trouve un exemple de chaîne SQL qui doit être obtenue lorsque création de programme, suivi du code VBA qui le crée. Vous trouverez ci-dessous quelques conseils très utiles.
1. Utilisation des chiffres
SELECT * FROM Table WHERE (((Table .Quanty)= 12
.197
));
VBA v1
Dim q As Single q = 12
.197
strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & q & "));"
VBA v2
Dim q As String q = "12 197" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & Str (q) & "));"
Noter:
Fonction GetDecimalSeparator() As String GetDecimalSeparator = Format ( 0 #, "." ) End Function Notez également que dans ce cas, certaines actions Access standard peuvent ne pas fonctionner.
2. Utiliser des chaînes
SELECT * FROM Table WHERE (((Table .Name)="All" ));
VBA v1
Dim q As String q = "All" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" "" & DoubleQuote(q) & "" "));"
VBA v2
Dim q As String q = "All" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)="" & DoubleApostrophe(q) & "" ));"
Noter:
Exemple:
état de l'échantillon :
a"a"s SQL :
OÙ champ=" un""un"s"VBA :
strOù=" OÙ champ=""" & "un""""un"s" & """
"
Exemple:
état de l'échantillon :
a"a"s SQL :
OÙ champ=" un"un""s"VBA :
strOù=" OÙ champ="" & "un""un""s" & ""
"
Fonction publique Replace97(StrMain As String , StrFind As String , StrZam As String ) As String On Error GoTo err Dim pos As Long If StrFind = "" Then GoTo err If StrMain = "" Then Replace97 = StrZam : Quitter la fonction Do Jusqu'à InStr( 1
, StrMain, StrRecherche) = 0
pos = InStr( 1
, StrMain, StrFind) StrMain = milieu (StrMain, 1
,pos- 1
) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) Loop Replace97 = StrMain Exit Function err: Replace97 = StrMain End Function
3. Utiliser les dates
SELECT * FROM Table WHERE (((Table .TimeOpen)=# 3
/31
/2003
11
:17
:19
#));
VBA
Dim q As Date q = Now strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.TimeOpen)=#" & Format (q, "mm\/dd\/yy hh\:mm \:ss" ) & "#));"
Noter:
Compiler une telle chaîne contenant une commande SQL et la soumettre pour exécution peut entraîner une erreur. Dans ce cas, imprimez cette chaîne dans la fenêtre de débogage et regardez-la avec vos yeux. Peut-être que l'erreur attirera immédiatement votre attention. Si cela ne se précipite pas, créez une nouvelle requête dans le concepteur de requêtes, passez en mode SQL, collez-y le texte de la requête et exécutez-la pour exécution. S'il y a une erreur, elle sera affichée plus explicitement.
Avec une macro OuvrirRequête Dans les bases de données Access, vous pouvez ouvrir des requêtes de sélection et des requêtes croisées en mode Feuille de données, en mode Création ou en mode Aperçu. Cette action lance une demande de modification. Vous pouvez également sélectionner le mode de saisie des données pour la requête.
Noter: Cette macro n'est disponible que dans un environnement de base de données Access (MDB ou ACCDB). Si vous utilisez Access Project Environment (ADP), voir les macros OuvrirVue, Ouvrir une procédure stockée et OuvrirFonction. macro OuvrirRequête non disponible dans les applications Web Access.
Paramètre
macro OuvrirRequête a les arguments suivants :
Macro-argument | La description |
---|---|
Nom de la demande |
Nom de la demande d'ouverture. Sélectionnez un nom dans la liste déroulante. C'est un argument requis. Lors de l'exécution d'une macro contenant une macro dans une base de données de bibliothèque OuvrirRequête, Access recherche d'abord une requête portant ce nom dans la base de données de la bibliothèque, puis dans la base de données active. |
La vue dans laquelle la requête s'ouvrira. Sélectionnez dans le champ Voir sens Table, Constructeur, Aperçu, tableau croisé dynamique ou Tableau croisé dynamique. La valeur par défaut est Table. Noter: Les vues Tableau croisé dynamique et Graphique croisé dynamique ne sont pas disponibles dans les versions d'Access à partir d'Access 2013. |
|
Mode données |
Mode de saisie des données pour la requête. Ce paramètre s'applique uniquement aux requêtes ouvertes en mode Feuille de données. Sélectionner Ajouter(les utilisateurs pourront ajouter de nouvelles entrées, mais pas modifier celles existantes), Changer(les utilisateurs pourront modifier les entrées existantes et en ajouter de nouvelles) ou Uniquement pour la lecture(les utilisateurs ne pourront voir que les entrées). La valeur par défaut est Changer. |
Remarques
Si pour l'argument Voir valeur de consigne Table, Access affiche le jeu de résultats lorsqu'une requête Sélection, une requête croisée, une requête Union ou une requête serveur est utilisée, propriété RetoursRecords ce qui compte Oui. S'il s'agit d'une demande de modification, d'une demande de définition de données ou d'une demande au serveur, la propriété RetoursRecords qui est fixé à Pas, la requête est exécutée.
macro OuvrirRequêteéquivaut à double-cliquer sur une requête dans le volet de navigation ou à cliquer dessus clic-droit souris dans la zone de navigation et sélection de la vue. Lorsque vous utilisez une macro, vous pouvez sélectionner des options supplémentaires.
Des astuces
Vous pouvez faire glisser une requête du volet de navigation vers la fenêtre du concepteur de macros. Cela créera automatiquement une macro. OuvrirRequête, qui ouvre la requête en mode Feuille de données.
Si vous passez au constructeur lorsque la requête est ouverte, la valeur de l'argument Mode données est retiré. Ce paramètre n'aura aucun effet même si l'utilisateur revient en mode Feuille de données.
Si vous ne souhaitez pas afficher message système, qui apparaissent généralement lorsque vous exécutez des demandes de modification (ils disent qu'il s'agit d'une demande de modification et du nombre d'enregistrements qu'elle affecte), vous pouvez les désactiver avec une macro Définir l'avertissement.
Pour exécuter une macro OuvrirRequête dans un module Visual Basic pour Applications (VBA), utilisez la méthode OuvrirRequête objet DoCmd.