Executarea interogărilor sql în vba. Rulați o interogare din Access prin Excel Query în VBA. interogare SELECT la o bază de date în VBA

28.03.2020 Sfat

Access a salvat o interogare care a fost dezvoltată folosind generatorul de interogări myQuery. Baza de date este conectată la sistem printr-o conexiune ODBC. Toate macrocomenzile sunt incluse.

Excel Has stabilește o conexiune ADODB pentru a se conecta la baza de date prin

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Deschide "MyDatabase.accdb" End With

De obicei, scrieți doar SQL-ul, care funcționează grozav, și apoi faceți ceva de genul

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

Dar vreau să accesez interogarea pe care am stocat-o în baza de date de acces. Deci, cum apelez la o interogare salvată în baza de date pe care tocmai am conectat-o.

Am incercat deja

  1. con.Execute("EXEC myQuery"), dar asta mi-a spus că myQuery nu a putut fi găsit.
  2. rs.Open „myQuery” dar este invalid și necesită instrucțiuni SELECT/etc din el

5 răspunsuri

Cred că te poți gândi la asta ca la o procedură stocată.

Dacă începem chiar înainte de Dim sqlQuery As String

Dim cmd ca nou ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

Apoi ridicați-vă munca cu setul de înregistrări după aceea.

Erai aproape acolo

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 „MyQuery”

Pleacă de la Exec.

Puteți adăuga și parametri, acest lucru este puțin depășit, dar ar trebui să vă ajute: Actualizați 2 câmpuri într-o bază de date Access cu date Excel și poate o macrocomandă

Am putut rula o interogare de actualizare care a fost deja salvată în Access folosind:

Connection.Execute „My_Update_Query_Already_Saved_In_Access”, adExecuteNoRecords, adCmdStoredProc

Acest lucru îmi dădea erori până când am înlocuit spațiile din numele interogării cu caractere de subliniere atât în ​​baza de date Access, cât și în instrucțiunea execute.

Este un fel de hack job, dar poți solicita o solicitare. Adică, înlocuiți linia SQL cu următoarele:

SqlQuery = "SELECT * FROM QueryName;"

Înainte de a începe, trebuie să vă asigurați că baza de date Access a fost salvată, de exemplu. apăsați Ctrl + S (nu este suficient ca interogarea să fie executată în Access).

A trecut mult timp de când a fost creat acest subiect. Dacă am înțeles bine, s-ar putea să adaug ceva util. Am dat un nume a ceea ce descrie OP: este un proces folosind SQL dintr-o interogare stocată în ACCDB pentru a rula în VBA prin DAO sau ADOBD. L-am numit „Object Property Provider”, chiar și cu acronimul OPP în notele mele și pentru prefixul/sufixul numelui obiectului.

Ideea este că un obiect existent în ACCDB (de obicei o interogare) expune o proprietate (de obicei SQL) care trebuie utilizată în VBA. Am adunat o funcție doar pentru a absorbi SQL-ul din interogările pentru aceasta; Vezi mai jos. Avertisment: Îmi pare rău, dar toate acestea sunt în DAO, nu folosesc prea mult ADODB. Sper că încă găsești ideile utile.

Am mers chiar atât de departe încât am dezvoltat o metodă de utilizare/inserare a parametrilor înlocuibili în SQL care provine din aceste interogări OPP. Apoi folosesc VBA.Replace() pentru a face înlocuirea înainte de a folosi SQL în VBA.

Calea obiectului DAO către interogarea SQL din ACCDB este următoarea:

MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

Folosesc parametri înlocuibili evaluând ceea ce trebuie înlocuit și alegând nume neobișnuit pentru un parametru care nu poate exista într-o bază de date reală. În cea mai mare parte, singurele înlocuiri pe care le-am făcut sunt nume de câmpuri sau tabele sau expresii de clauză WHERE și HAVING. Așa că le numesc lucruri precum „(ReplaceMe00000001)” și apoi folosesc funcția Replace() pentru a face treaba...

SqlText = VBA.Replace(sqlText, „(ReplaceMe00000001)”, „SomeActualParameter”)

Și apoi utilizați sqlText în VBA. Iată un exemplu de lucru:

Funcție publică MySqlThing() Dim sqlText ca șir Dim myParamater ca șir Dim myExpression ca șir "Setați totul. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression =/"Some120Dexpression =/"Some1202 înlocuiește . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Apoi utilizați SQL. db.Execute sqlText, dbFailOnError Funcție de terminare Funcție getSqlTextFromQuery(ByVal oppName As String) As String Dim App.DatabApp Dim Dam App.DatabApp. 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.

Accesul vă permite să creați în mod programatic șiruri de interogare SQL, precum și șiruri care servesc drept valori pentru proprietățile formularelor, rapoartelor etc., parametrilor funcției etc., care trebuie să respecte și sintaxa SQL. În același timp, trebuie să ne amintim că constantele incluse într-o astfel de linie trebuie să fie și formatate după reguli SQL și anume:

  • în numere, separatorul zecimal trebuie să fie un punct,
  • șirurile de caractere trebuie să fie cuprinse între ghilimele sau apostrofe (și ghilimele sau, respectiv, apostrofele sunt dublate în interiorul șirului),
  • Datele trebuie să fie incluse în semne hash și scrise în format american (ll/zz/aaaa) cu o bară oblică ca delimitator.

    Dacă acest lucru este încălcat, sunt posibile următoarele efecte:

  • un număr precum 10,5 cu virgulă în loc de punct va fi perceput ca o listă de două numere 10 și 5, ceea ce va duce la un fel de discrepanță în numărul de câmpuri,
  • un șir precum Vasya fără ghilimele și apostrofe va fi perceput ca numele unui câmp, dacă un astfel de câmp există, sau ca numele unui parametru care va fi solicitat imediat,
  • o dată precum 1/2/2010 sau 1-2-2010 fără semne hash va fi tratată ca o expresie aritmetică (cu împărțire și, respectiv, scădere);
  • o dată precum 1.2.2010 va fi interpretată ca un număr fracționar cu două zecimale și va avea ca rezultat o eroare,
  • o dată cu semne hash, dar nu în format american, va fi percepută ca dată, dar diferită (ziua și luna vor fi rearanjate).

    Mai jos în fiecare secțiune este un exemplu de șir SQL care ar fi produs atunci când îl generați programatic, urmat de codul VBA care îl creează. Mai jos este o recomandare foarte utilă.

    1. Folosirea numerelor

    SELECTAȚI * FROM Tabel WHERE (((Tabel .Cantitate)= 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) & "));"
    Notă:

  • VBA v1- pentru numere întregi. Pentru numerele fracționale, acesta este un caz special numai atunci când separatorul de sistem este un punct.
  • VBA v2- o varianta mai corecta, pentru ca în programarea clasică, numai șirurile pot fi concatenate cu șiruri, în timp ce VBA v1 folosește conversia implicită de tip, deși nu au existat plângeri cu privire la această metodă pentru numere întregi. (Exemplul este dat când delimitatorul de sistem este o virgulă.)
  • Uneori funcția CStr() este folosită și pentru conversie, dar nu este întotdeauna aplicabilă, deoarece returnează un număr ca șir, unde este scris prin delimitatorul de sistem, în timp ce SQL acceptă doar o punct ca delimitator.
  • NB! Când utilizați separatoare de sistem atipice, exemplele de mai sus pot să nu funcționeze; în aceste cazuri, trebuie să înlocuiți programatic separatorul de sistem cu un punct. Mai jos este o funcție care returnează delimitatorul de sistem.
    Funcția GetDecimalSeparator() As String GetDecimalSeparator = Format ( 0 #, "." ) Funcție de terminare Rețineți, de asemenea, că unele acțiuni standard de acces pot să nu funcționeze în acest caz.

    2. Folosind șiruri

    SELECT * FROM Table WHERE (((Table .Name)="Toate" ));
    VBA v1

    Dim q As String q = "Toate" strSQL = "SELECT * " _ & "FROM Table" _ & "WHERE (((Table.Quanty)=" "" & DoubleQuote(q) & "" "));"
    VBA v2

    Dim q As String q = "Toate" strSQL = "SELECT * " _ & "FROM Table" _ & „UNDE (((Table.Quanty)="" & DoubleApostrophe(q) & "" ));"
    Notă:

  • VBA v1: DoubleQuote() - funcție care se dublează citate.

    Exemplu:
    starea de prelevare:
    a"a"s SQL:
    WHERE field=" a""a"s„VBA:
    strUnde = " WHERE field=""" & "a""""a"s" & """ "

  • VBA v2:: DoubleApostrophe() - funcție care se dublează apostrofe.

    Exemplu:
    starea de prelevare:
    a"a"s SQL:
    WHERE field=" a"a""s„VBA:
    strUnde = " WHERE field="" & "a""a""s" & "" "

  • Funcțiile DoubleQuote și DoubleApostrophe menționate mai sus NU sunt funcții de acces încorporate, ci funcții definite de utilizator, a căror implementare este lăsată la latitudinea programatorului. În special, în versiunile Access 2000 și mai mari, puteți utiliza funcția Înlocuire încorporată în acest scop, iar în 97 și mai mici puteți utiliza această funcție:

    Funcția publică 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: Exit Function Do Until InStr( 1 , StrMain, StrFind) = 0 poz = InStr( 1 , StrMain, StrFind) StrMain = mijloc (StrMain, 1 ,poz- 1 ) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) Loop Replace97 = StrMain Exit Function err: Replace97 = StrMain End Function
    3. Utilizarea datelor

    SELECTAȚI * FROM Table WHERE (((Tabel .TimeOpen)=# 3 /31 /2003 11 :17 :19 #));
    VBA

    Dim q As Data q = Acum strSQL = „SELECT * ” _ & „FROM Table” _ & „WHERE (((Table.TimeOpen)=#” & Format (q, „mm\/dd\/yy hh\:mm \:ss" ) & "#));"
    Notă:

  • Microsoft JET SQL operează cu date în format american, de exemplu. exact în forma de mai sus Lună/Zi/An.
  • Nu omite caracterele # (include întreaga constantă dată și oră) și \ (previne înlocuirea / și : cu setările locale, ceea ce tinde să facă funcția Format și care împiedică operatiune adecvata comenzi SQL).
  • Este recomandat să citiți aici: despre modalități de stocare a datei/ora.
  • NB! Nu ar trebui să utilizați conversia datei în Integer (sau Long), deoarece în Access și în SQL Server, numere diferite corespund aceleiași date și atunci când sunt comparate, puteți obține un rezultat neașteptat.

    Componând un astfel de șir care conține o comandă SQL și trimițându-l pentru execuție, este posibil să primiți o eroare. În acest caz, imprimați acest șir în fereastra de depanare și priviți-l cu ochii. Poate că eroarea vă va atrage imediat atenția. Dacă nu funcționează, creați o nouă interogare în designerul de interogări, treceți la modul SQL, introduceți textul interogării acolo și rulați-l. Dacă există o eroare, aceasta va fi afișată mai clar.

  • Acces a salvat o interogare dezvoltată folosind un generator de interogări numit „myQuery”. Baza de date este conectată la sistem printr-o conexiune ODBC. Macro-urile sunt toate incluse.

    excela are o conexiune ADODB pentru a se conecta la baza de date prin

    Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Deschide "MyDatabase.accdb" End With

    De obicei, mergeți înainte și scrieți doar SQL-ul, ceea ce este complet bine, apoi faceți ceva de genul

    Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

    Dar vreau să accesez interogarea pe care am stocat-o în baza de date de acces. Deci, cum pot apela o interogare salvată în baza de date pe care tocmai am conectat-o.

    Am încercat deja

    1. con.Execute("EXEC myQuery") dar acela mi-a spus că nu a putut fi găsit myQuery.
    2. rs.Deschide „myQuery”, con dar acesta este invalid și vrea instrucțiuni SELECT /etc de la el
    vba excel-vba ms-access-2007 adodb excel

    5 răspunsuri


    6

    Cred că te poți gândi la asta ca la o procedură stocată.

    Dacă începem chiar înainte de Dim sqlQuery As String

    Dim cmd ca nou ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

    Apoi, luați-vă slujba setului de înregistrări după aceea.


    1

    Erai aproape acolo:

    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 „MyQuery”

    Lasă-l pe Exec deoparte.

    Puteți adăuga, de asemenea, parametri, acest lucru este puțin depășit, dar ar trebui să vă ajute:


    0

    Este un fel de hack, dar îl poți solicita. Adică, înlocuiți linia sql cu următoarele:

    SqlQuery = "SELECT * FROM QueryName;"

    Înainte de a rula acest program, trebuie să vă asigurați că baza de date Access a fost salvată, adică. apăsați Ctrl+S (nu este suficient ca interogarea să fie rulată în Access).


    0

    Am putut rula o interogare de actualizare care a fost deja salvată în Access folosind:

    Connection.Execute „My_Update_Query_Already_Saved_In_Access”, adExecuteNoRecords, adCmdStoredProc

    Acest lucru îmi dădea erori până când am înlocuit spațiile din numele interogării cu caractere de subliniere atât în ​​baza de date Access, cât și în instrucțiunea execute.


    0

    A trecut mult timp de când a fost creat acest thread. Dacă înțeleg totul corect, pot adăuga ceva util. Am dat un nume pentru ceea ce descrie OP, care este procesul de utilizare a SQL dintr-o interogare stocată în ACCDB pentru a fi rulată în VBA prin DAO sau ADOBD. I-am dat numele „object property provider”, chiar și cu acronimul OPP în notele mele și un prefix/sufix pentru numele obiectului.

    Ideea este că un obiect existent în ACCDB (de obicei o interogare) expune o proprietate (de obicei SQL) care trebuie utilizată în VBA. Am pus împreună o funcție doar pentru a absorbi SQL-ul din interogările pentru aceasta; vezi mai jos. Avertisment: Îmi pare rău, dar toate acestea sunt în DAO, nu folosesc prea mult ADODB. Sper că veți găsi în continuare aceste idei utile.

    Am mers chiar atât de departe încât am dezvoltat o metodă de utilizare/inserare a parametrilor înlocuibili în SQL care provine din aceste interogări OPP. Apoi folosesc VBA.Replace() pentru a face înlocuirea înainte de a folosi SQL în VBA.

    Calea obiectului DAO către interogarea SQL din ACCDB este următoarea:

    MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

    Folosesc parametri înlocuibili evaluând ceea ce trebuie înlocuit și alegând un nume neobișnuit pentru parametrul care poate să nu existe în baza de date reală. În cea mai mare parte, singurele înlocuiri pe care le-am făcut sunt numele câmpurilor sau ale tabelelor sau ale expresiilor de clauză WHERE și HAVING. Așa că le numesc lucruri precum „(ReplaceMe00000001)” și apoi folosesc funcția Replace() pentru a face treaba...

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

    și apoi utilizați sqlText în VBA. Iată un exemplu de lucru:

    Funcție publică MySqlThing() Dim sqlText ca șir Dim myParamater ca șir Dim myExpression ca șir "Setați totul. sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression =/"Some120Dexpression =/"Some1202 înlocuiește . sqlText = VBA.Replace(sqlText, myParameter, myExpression) "Apoi utilizați SQL. db.Execute sqlText, dbFailOnError Funcție de terminare Funcție getSqlTextFromQuery(ByVal oppName As String) As String Dim App.DatabApp Dim Dam App.DatabApp. 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.


    Rulați o interogare în Access MakeTable din Excel

    eu am fisier Excel pe care trebuie să le automatizez. Când un utilizator deschide un raport Excel, i se va solicita să reîmprospăteze datele. Dacă ei spun da, atunci trebuie să rulez interogarea...


    Executați funcția VBA prin interogare de vizualizare în MS Access 2013 din JS ActiveX ADO

    Cum se execută o macrocomandă VBA prin interogare de vizualizare în MS Access 2013 din JS ActiveX ADO? Funcția VBA destinat să primească utilizator curent, autentificat cu: Public Declare...


    Executați interogarea salvată care conține „funcție” în db de acces din excel

    Încerc să rulez o interogare stocată într-o bază de date de acces din excel vba. Interogarea funcționează bine dacă o deschid și o rulez în baza de date de acces, dar dă o eroare când o rulez dintr-un modul...


    MS Access - Executați interogarea salvată după nume în VBA

    Cum se execută o interogare salvată în MS Access 2007 în VBA? Nu vreau să copiez și să lipesc SQL în VBA. Aș prefera doar să execut numele cererii. Acest lucru nu va funcționa... VBA nu poate găsi interogarea...


    Cum se efectuează o solicitare în ms-access în codul VBA?

    Cum pot rula o interogare pentru a returna înregistrări într-o bază de date ms-access folosind codul VBA?


    Rulați o cerere de acces din excel și transmiteți parametrii

    Cum să rulați o interogare în MS access db din cod Excel VBA sau macro. Solicitarea MS-Access acceptă unii parametri care trebuie să fie transferați din Excel. Mulțumesc


    Gestionarea unui registru de lucru Excel din Access 2010 VBA

    Am o situație foarte asemănătoare cu următoarea postare: Solicitarea accesului la excel 2010 pentru a crea un grafic prin vba În cazul meu, export un tabel, dar vreau să fac mult mai mult fișierului...


    Executați interogarea SQL Server Pass-Through din Access VBA

    Am o interogare de trecere UPDATE salvată în Access 2007. Când fac dublu clic pe interogarea de trecere, aceasta se execută cu succes. Cum pot face ca această interogare să fie executată din VBA? Aş...


    Importul unui set uriaș de date în Access din Excel prin VBA

    Am un set imens de date pe care trebuie să îl import din Excel în Access (~800k rânduri). Cu toate acestea, pot ignora rândurile cu o anumită valoare de coloană care este de aproximativ 90%...


    Orice interogare MDX în Excel vba?

    Există o modalitate de a efectua o interogare MDX în Excel VBA? M-am gândit că acest lucru se poate face prin ADO, la fel ca și cu SQL (da, știu că SQL este diferit de MDX - o problemă care de multe ori...

    Această lecție este dedicată interogări SQL la baza de date pe Acces VBA. Ne vom uita la modul în care interogările INSERT, UPDATE, DELETE sunt făcute în baza de date în VBA și vom învăța, de asemenea, cum să obținem o anumită valoare dintr-o interogare SELECT.

    Cei care programează în Acces VBAși în timp ce lucrați cu baza date SQL serverele se confruntă foarte des cu o sarcină atât de simplă și necesară, precum trimiterea unei interogări SQL către o bază de date, fie că este vorba de INSERT, UPDATE sau o simplă interogare SQL SELECT. Și din moment ce suntem programatori începători, ar trebui să putem face acest lucru, așa că astăzi vom face exact asta.

    Am atins deja subiectul obținerii de date de la SQL Server, unde au scris cod în VBA pentru a obține aceste date, de exemplu, în articolul despre Încărcarea datelor într-un fișier text din MSSql 2008 sau l-au atins puțin în materialul Încărcarea datelor din Access într-un șablon Word și Excel, dar într-un fel sau altul am privit-o superficial și astăzi îmi propun să vorbim despre asta mai detaliat.

    Notă! Toate exemplele de mai jos sunt luate în considerare folosind proiectul Access 2003 ADP și baza de date MSSql 2008. Dacă nu știți ce este un proiect ADP, atunci am analizat acest lucru în materialul Cum să creați și să configurați un proiect Access ADP

    Date sursă pentru exemple

    Să presupunem că avem un tabel test_table, care va conține numerele și numele lunilor din an (interogări efectuate folosind Studio de management)

    CREATE TABLE .( NOT NULL, (50) NULL) ON GO

    După cum am spus deja, vom folosi un proiect ADP configurat să funcționeze cu MS SQL 2008, în care am creat un formular de testare și am adăugat un buton de pornire cu o semnătură "Alerga", de care va trebui să ne testăm codul, de exemplu. Vom scrie tot codul în handlerul de evenimente " Apăsați butonul».

    Interogări la baza de date INSERT, UPDATE, DELETE în VBA

    Pentru a nu întârzia prea mult, să începem imediat, să presupunem că trebuie să adăugăm un rând la tabelul nostru de testare ( cod comentat)/

    Private Sub start_Click() „Declară o variabilă pentru a stoca șirul de interogare Dim sql_query As String „Scrie interogarea de care avem nevoie în ea sql_query = „INSERT INTO test_table (id, name_mon) VALUES (“6”, „June”)” „Execute it DoCmd. RunSQL sql_query End Sub

    În acest caz, interogarea este executată utilizând parametrii actuali de conexiune la baza de date. Putem verifica dacă datele au fost adăugate sau nu.

    După cum puteți vedea, datele au fost introduse.

    Pentru a șterge o linie scriem următorul cod.

    Private Sub start_Click() „Declară o variabilă pentru a stoca șirul de interogare Dim sql_query As String „Scrie o interogare de ștergere în ea sql_query = „DELETE test_table WHERE id = 6” „Run it DoCmd.RunSQL sql_query End Sub

    Dacă verificăm, vom vedea că linia dorită a fost ștearsă.

    Pentru a actualiza datele, scrieți cererea de actualizare la variabila sql_query, sper că sensul este clar.

    interogare SELECT la o bază de date în VBA

    Aici lucrurile sunt puțin mai interesante decât cu alte constructe SQL.

    În primul rând, să presupunem că trebuie să obținem toate datele din tabel și, de exemplu, le vom procesa și le vom afișa într-un mesaj și, desigur, le puteți folosi în alte scopuri, pentru aceasta scriem următoarele cod

    Private Sub start_Click() „Declare variabile” Pentru un set de înregistrări din baza de date Dim RS As ADODB.Recordset „Query string Dim sql_query As String „Șir pentru afișarea datelor rezumative într-un mesaj Dim str As String „Create obiect nou pentru set de înregistrări RS = New ADODB.Recordset "Query line sql_query = "SELECT id, name_mon FROM test_table" "Rulează interogarea folosind setările curente de conexiune la proiect RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Buc prin înregistrări Not ( RS.EOF) „Completați variabila pentru a afișa mesajul str = str & RS.Fields(„id”) & „-” & RS.Fields(„name_mon”) & vbnewline „mutați la următoarea înregistrare RS.MoveNext Wend "Ieșiți mesajul msgbox str End Sub

    Aici folosim deja buclele de acces VBA pentru a itera toate valorile din setul nostru de înregistrări.

    Dar destul de des este necesar să se obțină nu toate valorile dintr-un set de înregistrări, ci doar una, de exemplu, numele lunii prin codul său. Și pentru a face acest lucru, este cam scump să folosim o buclă, așa că putem pur și simplu să scriem o interogare care va returna o singură valoare și să o accesăm, de exemplu, vom obține numele lunii folosind codul 5

    Private Sub start_Click() „Declare variabile” Pentru un set de înregistrări din baza de date Dim RS As ADODB.Recordset „Query string Dim sql_query As String „String pentru a afișa valoarea finală Dim str As String „Creați un nou obiect pentru setul de înregistrări RS = Nou ADODB.Recordset "Query line sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "Rulați interogarea folosind setările curente de conectare la proiect RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Obțineți valoarea noastră str = RS. Fields(0) msgbox str End Sub

    Pentru universalitate, aici ne-am adresat deja nu prin numele celulei, ci prin indexul acesteia, i.e. 0, iar aceasta este prima valoare în Set de înregistrări, pana la urma am obtinut valoarea "Mai".

    După cum puteți vedea, totul este destul de simplu. Dacă deseori trebuie să obțineți o anumită valoare din baza de date ( ca în ultimul exemplu), apoi recomand să scoateți tot codul într-o funcție separată (Cum se scrie o funcție în VBA Access 2003) cu un parametru de intrare, de exemplu, codul lunii ( dacă luăm în considerare exemplul nostru) și pur și simplu, acolo unde este necesar să afișăm această valoare, apelăm funcția de care avem nevoie cu parametrul necesar și gata, făcând acest lucru vom reduce semnificativ codul VBA și vom îmbunătăți percepția programului nostru.

    Asta e tot pentru azi. Noroc!