2010-05-13 13 views
1

J'ai une table Access avec un champ de date/heure. Je voulais créer un champ Clé composite à partir du champ date/heure et de 3 autres champs de texte dans le même format que le champ Clé correspondant dans une autre base de données.La requête avec UDF fonctionne dans Access mais donne une fonction Undefined dans l'expression (Err 3085) dans Excel

J'ai donc concaténé les 3 champs de texte et écrit une fonction définie par l'utilisateur dans un module pour sortir le champ de date sous forme de chaîne au format "AAAAMMJJ". Je peux ensuite exécuter avec succès mes requêtes dans Access et tout fonctionne correctement.

Mais quand je mis en place un code DAO dans Excel et essayez d'exécuter la requête qui fonctionne très bien dans Access ...

db.Execute "qryMake_tblValsDailyAccount" 

... Excel me donne la « fonction non définie dans l'expression. (Erreur 3085) "erreur.

Pour moi, c'est un bogue dans Excel et/ou Access, car le client (Excel) ne devrait pas avoir besoin de savoir quoi que ce soit sur les calculs internes qui se déroulent normalement parfaitement dans le serveur (Access).

Excel doit envoyer le querydef (nom sans paramètres) au serveur, laisser le serveur faire son travail puis recevoir les réponses. Pourquoi a-t-il besoin de s'impliquer avec une fonction interne au serveur?

Est-ce que quelqu'un sait un moyen de contourner cela?

+0

Qu'est-ce qui vous fait penser que vous avez besoin d'un "champ de clé composite"? C'est-à-dire, à quoi voulez-vous que ces données dérivées servent? –

Répondre

1

Ok, je l'ai piraté un correctif pour en remplaçant la fonction VBA avec une requête qui joint à la table de données d'origine par son ValsDaily_ID clé primaire

SELECT tblValsDaily.ValsDaily_ID, 
Format(Year(tblValsDaily.BusinessDate))+ 
Format(Month(tblValsDaily.BusinessDate),"00")+ 
Format(Day(tblValsDaily.BusinessDate),"00") AS YYYYMMDD 
FROM tblValsDaily; 

mais c'est vraiment boiteux, et je reste Je ne sais pas pourquoi la version VBA ne fonctionne pas ...

3

L'accès utilise Jet, et la combinaison d'Access et de Jet comprend les fonctions VBA. DAO est une couche d'accès aux données générique qui ne comprend pas les fonctions VBA. Lorsque vous utilisez DAO, vous n'automatisez pas Access, en utilisant simplement ce pont pour accéder aux données.

Même si certaines versions d'Access utilisent DAO en interne pour communiquer avec Jet, la capacité à comprendre VBA est programmée dans Access, pas DAO. Je pense que votre solution de contournement est ce que vous pouvez faire de mieux.