Formation d'une chaîne de requête SQL en VBA. Comment obtenir des données à partir d'une requête SQL dans Microsoft Access VBA ? Requête SQL pour l'accès au contenu des lignes vba

Utiliser une macro Demande ouverte Dans les bases de données Access, vous pouvez ouvrir des requêtes sélection et analyse croisée en mode Grille, en mode Création ou en mode Aperçu. Cette action déclenche une demande de changement. Vous pouvez également sélectionner le mode de saisie des données pour la requête.

Noter: Cette macro n'est disponible que dans l'environnement de base de données Access (MDB ou ACCDB). Si vous utilisez Access Project Environment (ADP), voir les macros Vue ouverte, Procédure OpenSaved et Fonction ouverte... Macro Demande ouverte non disponible dans les applications Web Access.

Personnalisation

Macro Demande ouverte a les arguments suivants :

Argument de macro

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 la base de données de la bibliothèque Demande ouverte, Access recherche d'abord dans la base de données de la bibliothèque une requête portant ce nom, puis dans la base de données actuelle.

La vue dans laquelle la demande s'ouvrira. Sélectionnez dans la case Vue sens tableau, Constructeur, Aperçu, Tableau croisé dynamique ou alors Graphique croisé dynamique... La valeur par défaut est tableau.

Noter: Les vues de tableau croisé dynamique et de graphique croisé dynamique ne sont pas disponibles dans les versions d'Access à partir d'Access 2013.

Mode données

Le mode de saisie des données pour la demande. Ce paramètre s'applique uniquement aux requêtes ouvertes en mode table. Veuillez sélectionner Ajouter(les utilisateurs pourront ajouter de nouvelles entrées, mais pas modifier celles existantes), Changement(les utilisateurs pourront modifier les enregistrements existants ainsi qu'en ajouter de nouveaux) ou Uniquement pour la lecture(les utilisateurs ne pourront voir que les entrées). La valeur par défaut est Changement.

Remarques (modifier)

Si pour l'argument Vue mettre à valeur tableau, Access affiche le jeu de résultats si vous utilisez une requête sélection, une requête croisée, une requête union ou une requête serveur, propriété RetoursEnregistrements 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 de serveur, pour une propriété RetoursEnregistrements qui est réglé sur Non, la demande est en cours d'exécution.

Macro Demande ouverte revient à double-cliquer sur une requête dans le volet de navigation ou à cliquer dessus avec le bouton droit dans le volet de navigation et à sélectionner une vue. Lorsque vous utilisez une macro, vous pouvez sélectionner des options supplémentaires.

Conseils

    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-commande Demande ouverte qui ouvre la requête en vue tableau.

    Si vous passez à Constructor lorsqu'une requête est ouverte, la valeur de l'argument Mode données supprimé. Ce paramètre n'aura aucun effet même si l'utilisateur revient en mode table.

    Si vous ne souhaitez pas afficher les messages système qui apparaissent généralement lors de l'exécution des demandes de modification (ils disent qu'il s'agit d'une demande de modification et indiquent le nombre d'enregistrements qu'elle affecte), vous pouvez les désactiver à l'aide de la macro SetWarning.

Pour exécuter une macro Demande ouverte dans un module Visual Basic pour Applications (VBA), utilisez la méthode Demande ouverte objet DoCmd.

Access a enregistré une requête qui a été développée à l'aide de myQuery Query Builder. La base de données est connectée au système via une connexion ODBC. Les macros sont toutes incluses.

Excel a établit 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 écrivez simplement votre code SQL, ce qui fonctionne très bien, puis vous 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 demande que j'ai stockée dans la base de données d'accès. Alors, comment puis-je appeler la requête enregistrée sur la base de données que je viens de connecter.

Déjà essayé

  1. con.Execute ("EXEC myQuery"), mais il m'a dit qu'il ne pouvait pas trouver myQuery.
  2. rs.open "myQuery" mais il n'est pas valide et nécessite des instructions SELECT / etc

5 réponses

Je pense que vous pouvez considérer cela comme une procédure stockée.

Si nous commençons juste avant Dim sqlQuery As String

Dim cmd en tant que nouveau ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute ()

Ensuite, prenez votre travail avec un jeu d'enregistrements après cela.

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 "Ma requête"

Quittez simplement Exec.

Vous pouvez également ajouter des paramètres, c'est un peu obsolète mais devrait aider : mettre à jour 2 champs dans la base de données Access avec des données Excel et peut-être une macro

J'ai pu exécuter une requête de mise à jour qui était déjà enregistrée dans Access en utilisant :

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

Cela me donnait des erreurs jusqu'à ce que je remplace les espaces dans le nom de la requête par un trait de soulignement à la fois dans la base de données Access et dans l'instruction d'exécution.

C'est un peu un travail de piratage, mais vous pouvez demander une demande. Autrement dit, remplacez la ligne SQL par ce qui suit :

SqlQuery = "SELECT * FROM QueryName;"

Avant de commencer, vous devez vous assurer que la base de données Access a été enregistrée, c'est-à-dire appuyez sur Ctrl + S (pas assez pour que la requête s'exécute dans Access).

Il y a longtemps depuis la création de ce sujet. Si je comprends bien, je pourrais ajouter quelque chose d'utile. J'ai donné un nom à ce que décrit l'OP : c'est le processus d'utilisation de SQL à partir d'une requête stockée dans ACCDB pour s'exécuter en VBA via DAO ou ADOBD. Je l'ai nommé « Object Property Provider », même avec l'acronyme OPP dans mes notes et pour le préfixe/suffixe du nom de l'objet.

L'idée est qu'un objet existant dans ACCDB (généralement une requête) fournit une propriété (généralement SQL) qui doit être utilisée 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 vraiment ADODB. J'espère que vous trouverez toujours les idées utiles.

Je suis même allé jusqu'à proposer une méthode d'utilisation / d'insertion de paramètres remplaçables dans SQL qui provient de ces requêtes OPP. Ensuite, j'utilise VBA.Replace() pour remplacer avant d'utiliser SQL dans VBA.

Le chemin DAO vers la requête SQL dans ACCDB 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 peut ne pas exister dans une vraie base de données. Pour la plupart, les seuls remplacements que j'ai effectués sont des noms de champ ou de table ou des expressions de clause WHERE et HAVING. Je les appelle donc comme "(ReplaceMe00000001)" puis j'utilise la fonction Replace () pour faire le travail...

SqlText = VBA.Replace (sqlText, "(ReplaceMe00000001)", "SomeActualParameter")

Et puis utilisez sqlText dans VBA. Voici un exemple fonctionnel :

Fonction publique MySqlThing () Dim sqlText as String Dim myParamater as String Dim myExpression as String "Tout configurer. SqlText = getSqlTextFromQuery (" myQuery ") myParameter =" (ReplaceMe00000001) " myExpression =" SomeDate 31 / replacement " 2017 ... sqlText = VBA.Replace (sqlText, myParameter, myExpression) "Ensuite, utilisez le SQL. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery (ByVal oppName As String) As String Dim app As Access.App Dlication Dim db As String 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

Accéder enregistré une requête développée avec un générateur de requêtes appelé "myQuery". La base de données se connecte au système via une connexion ODBC. Les macros sont toutes incluses.

Exceller dispose d'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 code SQL, ce qui est parfaitement bien, puis vous 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 demande que j'ai stockée dans la base de données d'accès. Alors, comment puis-je appeler la requête enregistrée sur la base de données que je viens de connecter.

Déjà essayé

  1. con.Exécuter ("EXEC myQuery") mais il m'a dit qu'il ne pouvait pas trouver myQuery.
  2. rs.Open "myQuery", con mais celui-ci n'est pas valide et veut des instructions SELECT / etc.
vba excel-vba ms-access-2007 adodb excel

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 en tant que 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

Vous y étiez 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 "Ma requête"

Laissez juste Exec de côté.

Vous pouvez également ajouter des paramètres, c'est un peu obsolète 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 QueryName;"

Avant d'exécuter ce programme, vous devez vous assurer que la base de données Access a été enregistrée, c'est-à-dire. appuyez sur Ctrl + S (pas assez pour exécuter la requête dans Access).


0

J'ai pu exécuter une demande de mise à jour déjà enregistrée dans Access en utilisant :

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

Cela me donnait des erreurs jusqu'à ce que je remplace les espaces dans le nom de la requête par un trait 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 j'ai tout bien compris, je peux ajouter quelque chose d'utile. J'ai donné un nom à ce que l'OP décrit, qui est le processus d'utilisation de 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 de "fournisseur de propriété d'objet", même avec l'acronyme OPP dans mes notes, et pour le préfixe/suffixe du nom de l'objet.

L'idée est qu'un objet existant dans ACCDB (généralement une requête) fournit une propriété (généralement SQL) qui doit être utilisée 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 vraiment ADODB. J'espère que vous trouverez toujours ces idées utiles.

Je suis même allé jusqu'à proposer une méthode d'utilisation / d'insertion de paramètres remplaçables dans SQL qui provient de ces requêtes OPP. Ensuite, j'utilise VBA.Replace () pour effectuer le remplacement avant d'utiliser SQL dans VBA.

Le chemin DAO vers la requête SQL dans ACCDB 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 peut ne pas exister dans la base de données réelle. Pour la plupart, les seuls remplacements que j'ai effectués sont des noms de champ ou de table ou des expressions de clause WHERE et HAVING. Je les appelle donc des choses comme "(ReplaceMe00000001)" puis j'utilise la fonction Replace () pour faire le travail...

SqlText = VBA.Replace (sqlText, "(ReplaceMe00000001)", "SomeActualParameter") ...

puis utilisez sqlText dans VBA. Voici un exemple fonctionnel :

Fonction publique MySqlThing () Dim sqlText as String Dim myParamater as String Dim myExpression as String "Tout configurer. SqlText = getSqlTextFromQuery (" myQuery ") myParameter =" (ReplaceMe00000001) " myExpression =" SomeDate 31 / replacement " 2017 ... sqlText = VBA.Replace (sqlText, myParameter, myExpression) "Ensuite, utilisez le SQL. db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery (ByVal oppName As String) As String Dim app As Access.App Dlication Dim db As String 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 une requête dans Access MakeTable à partir d'Excel

J'ai un fichier Excel que je dois automatiser. Lorsqu'un utilisateur ouvre un rapport Excel, il sera invité à actualiser les données. S'ils disent oui, alors je dois lancer une 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 permet à l'utilisateur actuel de se connecter avec : Public Declare ...


Exécuter une 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 demande 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 la requête enregistrée par nom dans VBA

Comment exécuter une requête stockée dans MS Access 2007 en VBA ? Je ne veux pas copier et coller SQL dans VBA. Je suis plutôt juste en train d'exécuter le nom de la demande. Cela ne fonctionnera pas ... VBA ne trouve pas la requête ....


Comment exécuter une requête dans ms-access en code VBA ?

Comment puis-je exécuter une requête pour renvoyer des enregistrements dans la base de données ms-access à l'aide du code VBA ?


Exécuter une demande d'accès à partir d'Excel et lui transmettre des paramètres

Comment exécuter une requête dans MS Access DB à partir d'un code ou d'une macro Excel VBA. La requête MS-Access prend certains paramètres qui doivent être transmis à partir d'Excel. Merci


Gérer le classeur Excel à partir d'Access 2010 VBA

J'ai une situation très similaire au post suivant : Demande d'accès à excel 2010 pour générer un graphique via vba Dans mon cas, j'exporte un tableau, mais je veux faire beaucoup plus pour un fichier...


Exécuter une requête de bout en bout SQL Server à partir d'Access VBA

J'ai une requête intermédiaire de mise à jour enregistrée dans Access 2007. Lorsque je double-clique sur la requête intermédiaire, elle réussit. Comment puis-je faire exécuter cette demande à partir de VBA ? J'aimerais...


Importation d'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 pouvant atteindre 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, comme dans le cas de SQL (oui, je sais que SQL est différent de MDX - un problème que plusieurs fois ...

Hé, je viens d'apprendre quelque chose sur la façon de mettre mes instructions SQL dans VBA (ou au moins de les écrire), mais je ne sais pas comment obtenir les données renvoyées?

J'ai plusieurs formulaires (graphique de formulaire) basés sur des requêtes sur lesquelles j'exécute des paramètres assez réguliers, en changeant simplement la période (comme les 10 meilleures ventes mensuelles de quelque chose). Ensuite, j'ai des procédures qui passent automatiquement l'objet graphique dans une présentation PowerPoint. J'ai donc toutes ces requêtes pré-construites (par exemple 63) et un diagramme de formulaire à adapter (enfin ouais .... 63 ... je sais que c'est mauvais) et puis toutes ces choses sont configurées pour ouvrir / fermer " Un événement menant au suivant (c'est comme ma meilleure tentative d'être un hack .... ou un domino ; celui que vous préférez).

J'essayais donc de savoir comment utiliser les instructions SQL en VBA, donc au final je peux tout faire là-bas (je devrai peut-être enregistrer tous ces diagrammes de formulaire, mais je ne sais pas, car je manque évidemment de compréhension) .

Donc à part la question que j'ai posée en haut, qui peut donner des conseils ? Merci

6 réponses

10

C'est un peu dépassé, vous voudrez peut-être vous procurer un livre sur ce sujet. Mais voici une tonne d'accès à des ressources ainsi qu'un peu de tutoriels et d'exemples. Mais au fond...

Dim dbs As Database Dim rs As Recordset Dim strSQL As String Set dbs = CurrentDb strSQL = "votre requête ici Set rs = dbs.OpenRecordset (strSQL) If Not (rs.EOF And rs.BOF) Then rs.MoveFirst" obtenir des résultats en utilisant rs.Fields () Sinon "Utiliser les résultats

Par commentaire : Jetez un œil à la classe de publication. Il contient une collection appelée champs, qui sont les colonnes renvoyées par votre requête. Ne connaissant pas votre circuit, c'est difficile à dire, mais quelque chose comme...

Rs.MoveFirst Do While Not rs.EOF "faire quelque chose comme rs (" SomeFieldName ") rs.MoveNext Loop

Comme je l'ai dit, il est préférable de prendre un livre sur ce sujet, ils ont des tonnes d'exemples.

Utilisez un QueryDef paramétré et appelez-le depuis VBA.
La requête est plus facile à concevoir... facile à tester... et facilement accessible via VBA ou un formulaire.

Dim qd as querydef set qd = currentdb.querydefs! Myquerydef qd.parameters! Parm1 = val1

ou qd.execute

Dim rs comme jeu d'enregistrements rs = qd.openrecordset ()

Voici une fonction que vous pourriez envisager de refactoriser pour l'intégrer, et vous pourrez la réutiliser n'importe où dans votre code.

Donc constant ou construisez une chaîne pour votre instruction SQL, et insérez votre chaîne désinfectée, NON SQL INJECTÉE comme argument :)

StrSQL = "SELECT * FROM Customer WHERE ID =" & EnsureParamIsNotSQLInjection (customerID)

Ensuite, appelez la fonction / sub où vous devez obtenir les données / le jeu d'enregistrements / exécuter l'instruction. En créant plusieurs fonctions/sous d'accès aux données, où vous pouvez simplement exécuter une instruction UPDATE ou récupérer une seule valeur, ou récupérer des enregistrements complets.

Le point clé ici est d'avoir toutes ces fonctionnalités au même endroit et de les utiliser partout. Voici un exemple en VBScript.

Sub DoStuff (strSQL) Définir adoCon = Server.CreateObject ("ADODB.Connection") strConnString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" & Server.MapPath ("db \ Database.mdb") "strConnString = "PILOTE = (Pilote Microsoft Access (* .mdb)); DBQ = "& Server.MapPath (" db \ Database.mdb ") adoCon.Open strConnString Set rsMain = Server.CreateObject (" ADODB.Recordset ") rsMain.Open strSQL, adoCon Do While NOT rsMain.EOF customerName = rsMain (" CustomerName ")" exemple idiot RsMain.MoveNext Loop rsMain.Close Set adoCon = Nothing End Sub

Une autre façon de le faire, que personne ne semble avoir mentionnée, consiste à lier votre graphique à un QueryDef enregistré, puis à réécrire QueryDef au moment de l'exécution. Maintenant, je ne recommande pas de modifier les QueryDefs enregistrées pour la plupart des contextes, car cela provoque un gonflement frontal et n'est généralement même pas nécessaire (dans la plupart des contextes où vous utilisez les QueryDefs enregistrés peuvent être filtrés d'une manière ou d'une autre, dans le contexte dans lequel ils sont utilisés, par exemple, comme l'un des formulaires RecordSource, vous ne transmettez qu'un argument à DoCmd.OpenForm).

Les graphiques sont différents car les graphiques de pilotage SQL ne peuvent pas être modifiés lors de l'exécution.

Certains d'entre eux ont suggéré des options, mais l'ouverture d'un formulaire avec un graphique qui utilise une chaîne SQL avec des paramètres va faire apparaître les boîtes de dialogue d'options par défaut. Une façon d'éviter cela est d'utiliser un formulaire de dialogue pour collecter des critères, puis de définir des liens vers des contrôles dans la boîte de dialogue en tant que paramètres, etc. :

PARAMÈTRES !! Longue;

Si vous utilisez des références de formulaire, il est important que vous le fassiez, car à partir d'Access 2002, le Jet Expression Service ne les gère pas toujours correctement lorsque les contrôles sont Null. Les définir en tant que paramètres résout ce problème (qui n'était pas présent avant Access XP).

Une situation dans laquelle vous devez réécrire QueryDef pour un graphique est si vous souhaitez autoriser l'utilisateur à sélectionner N dans une instruction TOP N SQL. En d'autres termes, si vous souhaitez pouvoir sélectionner TOP 5 ou TOP 10 ou TOP 20, vous devrez modifier la QueryDef enregistrée, car N ne peut pas être paramétré.

Cette leçon se concentre sur Requêtes SQLà la base de données sur Accès VBA... Nous verrons comment les requêtes INSERT, UPDATE, DELETE sont effectuées sur la base de données dans VBA, et apprendrons également comment obtenir une valeur spécifique à partir d'une requête SELECT.

Ceux qui programment sur Accès VBA tout en travaillant avec une base de données de serveur SQL, ils 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 devons également être capables de le faire, donc aujourd'hui, nous allons le faire.

Nous avons déjà abordé le sujet de la réception de données d'un serveur SQL, où nous avons écrit le code pour obtenir ces données en VBA, par exemple, dans l'article sur Décharger des données dans un fichier texte à partir de MSSql 2008 ou aussi légèrement abordé dans le matériel Déchargement des données d'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 propose d'en parler un peu plus en détail.

Noter! Tous les exemples ci-dessous sont considérés à l'aide du projet Access 2003 ADP et de la base de données MSSql 2008. Si vous ne savez pas ce qu'est un projet ADP en général, nous en avons tenu compte dans l'article Comment créer et configurer un projet Access ADP

Données initiales pour exemples

Disons que nous avons un test_table qui contiendra les numéros et les noms des mois de l'année (les requêtes sont faites en utilisant Studio de gestion)

CRÉER UNE TABLE (PAS NULL, (50) NULL) ON GO

Comme je l'ai dit, nous utiliserons 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 signature "Cours" dont nous avons 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 VBA INSERT, UPDATE, DELETE

Afin de ne pas traîner longtemps, commençons tout de suite, disons que nous devons ajouter une ligne à notre table de test ( le code est commenté)/

Private Sub start_Click () "Déclarer une variable pour stocker la chaîne de requête Dim sql_query As String" Écrivez la requête dont nous avons besoin sql_query = "INSERT INTO test_table (id, name_mon) VALUES (" 6 "," June ")" " Execute it 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.

Pour supprimer une ligne, écrivez le code suivant.

Private Sub start_Click () "Déclarer une variable pour stocker 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 la ligne requise a été supprimée.

Pour mettre à jour les données, écrivez la requête de mise à jour dans la variable sql_query, j'espère que le sens est clair.

Requête SELECT sur la base VBA

Les choses sont un peu plus intéressantes ici qu'avec le reste des 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 les utiliser à d'autres fins, pour cela nous écrivons ce qui suit code

Private Sub start_Click () "Declare variables" Pour un ensemble d'enregistrements de la base de données Dim RS As ADODB.Recordset "Query string Dim sql_query As String" Chaîne pour afficher les données récapitulatives dans le message Dim str As String "Créer un nouvel objet pour les enregistrements set RS = New ADODB .Recordset "Query string sql_query =" SELECT id, name_mon FROM test_table "" Exécutez la requête à l'aide des paramètres de connexion du projet en cours RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Loop à travers les enregistrements While Not ( RS.EOF)" Remplissez la variable pour afficher le message str = str & RS.Fields ("id") & "-" & RS.Fields ("name_mon") & vbnewline " passez à l'enregistrement suivant RS.MoveNext Wend " Affiche le message msgbox str End Sub

Ici, nous utilisons déjà des boucles VBA Access pour parcourir toutes les valeurs de notre jeu d'enregistrements.

Mais, assez souvent, il est nécessaire d'obtenir non pas toutes les valeurs d'un ensemble d'enregistrements, mais un seul, par exemple, le nom du mois par son code. Et pour cela, utiliser une boucle coûte en quelque sorte cher, 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 () "Declare variables" Pour un ensemble d'enregistrements de la base de données Dim RS As ADODB.Recordset "Query string Dim sql_query As String" Chaîne pour afficher la valeur totale Dim str As String "Créer un nouvel objet pour l'ensemble d'enregistrements RS = Nouveau ADODB.Recordset "Query string sql_query =" SELECT name_mon FROM test_table WHERE id = 5 "" Nous exécutons la requête en utilisant les paramètres de connexion du projet en cours RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Obtenez notre valeur str = RS .Fields (0) msgbox str End Sub

Pour l'universalité, nous avons déjà abordé ici non pas le nom de la cellule, mais son indice, c'est-à-dire 0, et c'est la toute première valeur de Jeu d'enregistrements, à la fin nous avons obtenu la valeur "Mai".

Comme vous pouvez le voir, tout est assez simple. Si vous avez souvent besoin d'obtenir une valeur spécifique de la base ( comme dans le dernier exemple), alors je vous recommande de sortir tout le code dans une fonction distincte (Comment écrire une fonction dans VBA Access 2003) avec un paramètre d'entrée, par exemple, le code du mois ( si l'on considère notre exemple) et simplement, lorsqu'il est nécessaire de sortir cette valeur, appelez la fonction dont nous avons besoin avec le paramètre requis et c'est tout, cela réduira considérablement le code VBA et améliorera la perception de notre programme.

C'est tout pour aujourd'hui. Bonne chance!

Vous avez aimé l'article ? A partager entre amis :