vba : pbm import access (formule)

soficaat

XLDnaute Nouveau
Bonjour à tous,

Voilà, j'ai un petit souci avec vba : je dispose d'une base de données Access, dans laquelle j'ai des tables et des requêtes sur ces tables. J'ai créé un programme dans vba qui exporte les requêtes Access que je veux dans différents onglets d'un fichier Excel, ce qui marche très bien.:D

Mon souci vient d'une des requêtes Access qui contient une médiane. Comme, à ma connaissance, la fonction médiane n'existe pas dans Access, je l'ai réécrite dans un module de ma base de données Access. Ca fonctionne bien dans Access.:)

Mais... Quand j'importe cette requête précisément dans Excel, avec mon programme vba qui fontionne pour les autres requêtes, j'ai le message d'erreur suivant qui s'affiche:
Erreur d'exécution '-2147217900 (80040e14)' :
Fonction 'fMediane' non définie dans l'expression :confused::confused:

Est-ce que vous pouvez m'aider? Je cherche, soit à calculer la médiane autrement qu'avec une fonction dans un module d'Access (même si je ne vois pas bien comment), soit à importer cette requête dans Excel en faisant une sorte de copie des valeurs (et pas des fonctions) présentes dans la requête access ?

Si besoin, voilà ma fonction vba qui me permet d'importer les tables :
Code:
Sub Import_tab_access(wk_encours As String, feuil_encours As String, nom_tab_access As String, premiereligne As Integer)
'wk_encours : classeur Excel en cours de modif
'feuil_encours : feuille Excel dans laquelle j'importe les données
'nom_tab_access : nom de la requête access que je copie dans Excel
'premiere_ligne : ligne de la feuille Excel où je colle la requête Access

Dim oRs As ADODB.Recordset
Dim oCnn As ADODB.Connection

    Set oCnn = New ADODB.Connection
    oCnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\toto\Bureau\P_test_en_cours.mdb;" 'User Id=admin;Password=;"
    oCnn.Open

    Set oRs = New ADODB.Recordset
    oRs.Open "SELECT * FROM " & nom_tab_access & ";", oCnn, adOpenKeyset, adLockReadOnly, adCmdText
    
    For i = 0 To oRs.Fields.Count - 1
        Workbooks(wk_encours).Sheets(feuil_encours).Cells(premiereligne, i + 2).Value = oRs.Fields(i).Name
    Next
    
     Workbooks(wk_encours).Sheets(feuil_encours).Cells(premiereligne + 1, 2).CopyFromRecordset oRs

    'Clean up ADO Objects
     oRs.Close
     Set oRs = Nothing
     oCnn.Close
     Set oCnn = Nothing
End Sub

Merci d'avance pour toute suggestion que vous pourrez faire pour m'aider à résoudre ce petit casse-tête... :) :confused: :)
 

Jam

XLDnaute Accro
Re : vba : pbm import access (formule)

Salut soficaat,

Peux tu nous apporter une petite précision: tu es dans Access et tu exportes dans Excel ou est-ce l'inverse (ce qui me semble être ce cas à la lecture de ton code) ?
Dans ton code je ne vois pas où tu fais appel à ta fonction (?) médiane. Comment une table peut-elle faire appelle à la fonction. Bref, à la lecture du code, je ne vois pas bien où peut avoir lieu l'erreur. Peux-tu nous l'indiquer ?

Une solution - complètement a priori : Lancer une requête stockée (la requête à l'intérieure d'Access) et récupérer le résultat dans Excel devrait être une bonne solution.

Bon courage,
 

soficaat

XLDnaute Nouveau
Re : vba : pbm import access (formule)

Bonjour Jam,
Merci de prendre du temps sur mon problème!

Effectivement, je suis dans vba Excel et je veux à partir de là rappatrier une table d'Access.

En fait je ne suis pas certaine d'utiliser le bon vocabulaire quand je dis "une table Access". J'utilise Access mais sans forcément bien faire la différence entre les mots "table" et "requête"...:p

Pour être plus claire, sous Access, j'ai une table qui contient la valeur d'une variable "dec" pour 100 individus. Je crée une requête R_statistiques_descriptives_DEC dans laquelle j'obtiens la moyenne, le min et le max de cette variable dec. Comme je ne peux pas obtenir la médiane aussi facilement, j'ai trouvé une fonction fMediane sur internet que j'ai copiée dans un module d'Access. La voici pour info :
Code:
Option Compare Database

Public Function fMediane(strTable As String, strField As String) As Variant

Dim oDBS As DAO.Database
Dim oRST As DAO.Recordset
Dim blnEven As Boolean
Dim vntMedian As Variant

  Set oDBS = CurrentDb()
  Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " ORDER BY " & strField)
  
  If oRST.EOF = False Then
     oRST.MoveLast
     'Is there an even number of records in the recordset?
     blnEven = (oRST.RecordCount Mod 2 = 0)
     'Rounds down if there is an even number of records...
     oRST.PercentPosition = 50
     vntMedian = oRST.Fields(strField)
          
     If blnEven Then
         oRST.MoveNext
         '...so take the average of the this and the next value up
         vntMedian = (vntMedian + oRST.Fields(strField)) / 2
     End If
  End If
  
  fMediane = vntMedian
  oRST.Close
  Set oRST = Nothing
  Set oDBS = Nothing

End Function

Dans ma requête, j'ai créé un champ ainsi : Médiane: fMediane("[table_initiale]";"[variable_dec]"). Quand je reste uniquement dans Access, j'ai bien la médiane qui s'affiche.

Ce n'est que lorsque j'essaie de copier cette table d'Access vers Excel au moyen d'une sub dans vba Excel que le message d'erreur s'affiche.
J'espère être plus explicite:)

Je pense que la solution que tu proposes est celle que j'essaie de faire : je veux effectivement lancer ma requête dans Access et seulement après l'exporter dans Excel. Mais je bloque....

Merci d'avance pour toute piste!
 

Jam

XLDnaute Accro
Re : vba : pbm import access (formule)

Re,

La solution qui me parait la plus simple (pas forcément la mieux, hein) serait d'avoir une requête dans Access que tu lances qui crée une table temporaire. Puis tu lances une seconde requête sur ce fichier temporaire pour récupérer les infos.
Comme cela tu n'auras, théoriquement, plus de problème.

L'erreur que tu rencontres provient très probablement du fait que le moteur appel la fonction mais qu'il ne sait pas comment ou où la trouver. Avec cette méthode, la première requête étant dans Access, le moteur devrait correctement interpréter l'appel à la fonction.

Bon courage.
 

soficaat

XLDnaute Nouveau
Re : vba : pbm import access (formule)

Merci beaucoup Jam! En fait ta solution n'a pas marché (si tant est que j'ai bien compris ce que tu proposais) mais le fait que tu m'aies proposé ça m'a fait "penser différemment", ce qui m'a fait trouver une autre solution :)

Pour info, voilà ce que j'ai pensé que tu me proposais : créer une requête access t_stat_descriptives_dec avec la moyenne, la médiane etc. tout pareil, puis créer une requête t_stat_descriptives_dec2 qui en fait ne fait que récupérer la requête précédente, et enfin importer t_stat_descriptives_dec2 dans Excel avec ma sub. J'avais toujours le même message d'erreur.

Une solution que j'ai trouvée (qui n'est à mon avis pas la plus simple, il doit y avoir quelque part une option qui dit à vba et Access de mieux se parler!:p ) est de ne pas calculer la médiane dans Access, mais à partir de vba Excel...
Dans ce cas, l'import de la table t_stat_descriptives_dec ne pose plus de souci et ensuite il fallait adapter la fonction fMediane pour qu'elle calcule la médiane d'une table dans Access depuis vba et qu'elle récupère ce résultat dans une cellule de ma feuille de calcul.

Merci beaucoup Jam, tes conseils m'ont été très utiles:D:D:D
A bientôt!
 

Discussions similaires

Réponses
2
Affichages
121

Statistiques des forums

Discussions
312 329
Messages
2 087 331
Membres
103 519
dernier inscrit
Thomas_grc11