Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2011, 12h16   #1
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
Par défaut Fonction non définie dans l'expression

Bonjour tout le monde,

Voila j'ai un léger problème qui survient entre access 2007 et excel 2007.

J'explique :
Etape une. J'ai réalisé une requète SQL sous access. Un dizaine de champs dont un en particulier qui se présente comme suit : Offre Complète: offreComplete([TYPE_OFFRE];[RESEAU];[CLIENT]). En fait, offreComplete est une fonction VBA codée sous access qui permet, après observation des 3 champs entrés en arguments, de renvoyer une chaîne string. Quand j'exécute la requète sous access, elle fonctionne.

Etape deux. Je vais sous excel pour faire le traitement de cette table. Comme j'ai bien automatiser un poil les choses, je crée une connexion à cette requête (onglet données > connexions > ajouter, je sélectionne ma base de donnée et ma requète, une fois la connexion crée, je vais dans données > données externes > connexions existante et hop). Et là, erreur ! Fonction OffreComplete non définie dans l'expression.

Je récapépayte : la fonction VBA fonctionne, la requête access fonctionne, la mise à jour sous excel fonctionne si j'enlève le champ "offre complète", la mise à jour plante si je remet ce footu champ

Je précise avant de me faire lobotomiser, la solution de la FAQ microsoft (http://support.microsoft.com/kb/275110/fr) marche pas. C'est pas adapté à mon problème vu que la requête fonctionne sous access.

Merci de votre aide !
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h21   #2
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour BamBan,

Les données externes utilisent un lien ODBC vers ta base Access
Si Odbc comprend le SQL, il ne comprend pas le VBA, et comme tu pointes sur une requête, il essaye d'actualiser la requête en exécutant son SQL, qui lui fait référence à ta fonction VBA qu'il ne comprend pas...

Bref, les fonctions VBA fonctionnent bien dans Access mais ne peuvent pas être appelées depuis l'extérieur, désolé.

Donc soit tu fais une requête sans cette fonction, et tu refais ta fonction en Excel (dans la mesure où tu as les données nécessaires), soit tu remplis une table temporaire avec le résultat de ta requête (mais ça peut poser des problèmes de mise à jour) et tu fais le lien sur la table temporaire, c'est tout ce qui me vient à l'esprit
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 14h27   #3
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Peut être une piste si une fonction Access se comporte de la même façon qu'une fonction SQL Server

pour la connexion, j'utilise un ODBC, mais tu peux remplacer par une chaine de connexion Access

Ici la fonction est ufn_DatePaques et a comme paramètre l'année
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
Dim cnn As New ADODB.Connection
Dim rec As New ADODB.Recordset
 
cnn.Open "dsn=Mabase;uid=User;pwd=Pass"
 
rec.Open "select dbo.ufn_DatePaques(2011)", cnn, adOpenDynamic, adLockReadOnly
 
Range("A1").CopyFromRecordset rec
 
rec.Close
Set rec = Nothing
cnn.Close
Set cnn = Nothing
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 15/09/2011, 14h31   #4
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
Citation:
Envoyé par tototiti2008 Voir le message
Bref, les fonctions VBA fonctionnent bien dans Access mais ne peuvent pas être appelées depuis l'extérieur, désolé.
Je suis pas d'accord. Techniquement, je ne saurai pas t'expliquer pourquoi ce que tu vient de dire n'est pas applicable dans mon cas. Je précise : j'ai au moins 3 ou 4 requêtes qui utilisent exactement la même fonction VBA (et d'autres fonctions aussi). Et j'ai en parallèle des fichiers excel qui exploitent des requêtes qui comportent des champs remplis par des fonction VBA sous access. Des explications ?

Merci pour ta réponse en tout cas.
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h41   #5
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour jfontaine,
Re,

Citation:
j'ai au moins 3 ou 4 requêtes qui utilisent exactement la même fonction VBA (et d'autres fonctions aussi). Et j'ai en parallèle des fichiers excel qui exploitent des requête qui comportent des champs remplis par des fonction VBA sous access. Des explications ?
Non, mais je suis intéressé de savoir comment ça se fait que ça marche dans d'autres cas. J'étais vraiment persuadé que c'était impossible...
Aurais-tu un exemple de fonction VBA utilisée dans une requête Access appelable par les données externes ? Je ferais des tests de mon coté
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h47   #6
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
Ca m'a l'air bien compliqué ta solution jfontaine :/

Elles sont assez simple en réalité, les fonctions que j'utilise. Ce fonctions se servent uniquement de la valeur d'autres champs de la requête pour donner un résultat.

Un exemple de fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Public Function offreComplete(offre As Variant, reseau As Variant, client As Variant, offreComm As Variant) As Variant
 
    If IsNull(offre) Then
        offreComplete = Null
 
    Else
 
        Select Case offre
            Case Is = "SYNCHRO"
                If reseau = "V" Then
                    offreComplete = "PBX V"
                Else
                    offreComplete = "PBX D"
                End If
            Case Is = "NET"
                If client = "PIC" Then
                    offreComplete = "NET PIC"
                Else
                    offreComplete = offre
                End If
            Case Is = "SYNCH"
                If IsNull(offreComm) Then
                    offreComplete = offre
                Else
                    offreComplete = offre & " (" & offreComm & ")"
                End If
            Case Else
                offreComplete = offre
        End Select
 
    End If
 
End Function
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h55   #7
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Re,

@jfontaine : désolé, ton code n'a pas l'air de fonctionner avec une fonction VBA, doit être spécifique aux fonctions Transact SQL stockées sur SQL Server, je pense

@Bamban : Oui, ça c'est la fonction que tu n'arrives pas à appeler, moi aussi je peux te fournir celle que j'ai faite et que je n'arrives pas à appeler (très courte) :

Code :
1
2
3
Function toto(z As String) As String
    toto = Left(z, 1)
End Function
Je l'utilise dans une requête Access sans problème
Mais les données externes sur cette requête produisent la même erreur que chez toi
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 14h58   #8
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
Ah ...

Donc on retourne au point de départ alors

Ben je comprend vraiment pas pourquoi certains fichiers excel autoriseraient les fonctions VBA sur les requêtes externes et pas d'autres. J'essai de décortiquer mon fichier excel qui fonctionne pour trouver une option, un paramètre qui différerais de celui où ça ne marche pas. Une idée de où chercher ? :/
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h08   #9
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Re,

Si, vois sur quelle requête pointe les données externes qui fonctionnent, et édite la requête dans Access pour voir quelle fonction personnalisée est utilisée
Poste-nous le code VBA de la fonction en question le cas échéant
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h18   #10
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 398
Points : 14 398
Envoyer un message via Skype™ à Pierre Fauconnier
Salut

Citation:
Envoyé par Bamban Voir le message
...
Ben je comprend vraiment pas pourquoi certains fichiers excel autoriseraient les fonctions VBA sur les requêtes externes et pas d'autres. ...
Je suis très dubitatif sur ce que tu dis, car je confirme les dires de tototit2008, il n'est pas possible d'utiliser en externe une requête Access qui utilise une fonction perso développée dans la base.

Si tu as un cas qui fonctionne, ce serait sympa de nous mettre la fonction perso, le sql de la requête sql qui l'emploie et le sql de la requête Excel qui fait que ça tourne pour que l'on puisse tester, car j'ai de très gros doutes.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h18   #11
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
Erf, je viens de comprendre le problème.

Mon postulat était bien erroné. En réalité, les fichiers excel qui utilisent mes tables qui contiennent des champs calculés pas VBA ne sont liés à des requêtes des sélection mais des tables. Tables bien bêtes crées à partir de requêtes (de création de tables, donc) qui elles possèdent des champs calculés en VBA.

Gloups, je suis eu.

La question qui découle de ça c'est : c'est vraiment pas possible de lier une requête de sélection qui possède un champ calculé en vba ? Si j'intègre la fonction VBA à un module de mon fichier excel ?

Merci en tout cas pour la révélation de l'origine du problème.
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h41   #12
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour Pierre Fauconnier,
Re,

Ce que tu peux faire c'est mettre ta fonction VBA dans Excel, faire des données externes sur une requête qui contient tout sauf cette fonction VBA, faire une colonne calculée dans Excel qui se base sur la fonction VBA d'Excel (il y a même des options des données externes permettant de recopier automatiquement les colonnes calculées en fonction des lignes retournées par les données externes)
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/09/2011, 15h45   #13
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 398
Points : 14 398
Envoyer un message via Skype™ à Pierre Fauconnier
Citation:
Envoyé par Bamban Voir le message
...
La question qui découle de ça c'est : c'est vraiment pas possible de lier une requête de sélection qui possède un champ calculé en vba ? Si j'intègre la fonction VBA à un module de mon fichier excel ?...
Non, ce n'est vraiment pas possible, et c'est tout aussi impossible que Access utilise au sein d'une de ses requêtes une fonction perso développée dans Excel.

Tu dois extraire les données d'Access via une requête qui ne reprend que les champs non calculés, les placer dans la feuille Excel puis recomposer les champs calculés dans des nouvelles colonnes Excel avec ta fonction perso en Excel.

[Edit] Grillé par toto [/Edit]
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h10   #14
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
C'est bien ce dont j'avais peur... C'est quand même plus sympa quand tout sort d'access et qu'il n'y a besoin d'aucun calcul sur excel.

Bon, je sais donc à quoi m'en tenir !

Merci pour votre aide. Dans tous les cas je n'ai pas perdu mon temps j'ai découvert un forum bien réactif et très sympathique (et pro avec ça ).

A bientôt pour une nouvel prise de tête :jap:
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h30   #15
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Re,

L'autre solution est la table temporaire dont je te parlais au début :
tu ne mets pas ta fonction VBA dans Excel, mais dans Access tu crées une requête Création de table (par exemple) qui crée une table spécifique à laquelle Excel se connectera
Le tout est de "rafraichir" cette table temporaire au bon moment
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 17h00   #16
Invité de passage
 
Homme
stagiaire
Inscription : septembre 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : stagiaire
Secteur : Communication - Médias

Informations forums :
Inscription : septembre 2011
Messages : 26
Points : 3
Points : 3
Oui, en fait c'est la solution qu'avait utilisé mon prédécesseur. Je n'avais pas pensé au fait qu'il utilise en effet une table intermédiaire.
D'où le fait que j'étais persuadé que ça pouvais marcher à ma manière ! :p
Bamban est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h32.


 
 
 
 
Partenaires

Hébergement Web