2010-03-10 18 views
3

État de la question:Comment puis-je utiliser une requête Access qui utilise les fonctions définies par Access-VBA dans Word VBA?

Je ne pense plus il est pertinent que je fais référence Excel ou que la requête a des paramètres. Je pense que la question se résume à ceci: Comment puis-je utiliser une requête Access qui utilise des fonctions définies par Access-VBA dans Word VBA? Ce que je veux faire is impossible, comment puis-je faire fonctionner une version inline de la fonction Acos avec ma requête, comme shahkalpesh's answer?


J'ai une fonction dans Access VBA:

Public Function Acos(radians As Double) As Double 
    Acos = WorksheetFunction.Acos(radians) 
End Function 

WorksheetFunction est en provenance de référencement Excel (que je fais simplement parce qu'il définit la fonction ACOS). J'utilise cette fonction dans une requête qui a trois paramètres. Ensuite, je lance cette requête dans Word VBA comme suit:

Dim command As New ADODB.command 
With command 
    .ActiveConnection = connection 
    .CommandText = "MyQueryName" 
    .CommandType = adCmdStoredProc 
    .Parameters.Append .CreateParameter(_ 
     "Param1", adDouble, adParamInput, , param1Value) 
    .Parameters.Append .CreateParameter(_ 
     "Param2", adDouble, adParamInput, , param2Value) 
    .Parameters.Append .CreateParameter(_ 
     "Param3", adDouble, adParamInput, , param3Value) 
End With 

Dim records As New ADODB.Recordset 
records.Open command, , adOpenKeyset, adLockOptimistic 

Je reçois une erreur dans Word VBA que la fonction Acos n'est pas définie.

Des idées?

MISE À JOUR

En réponse au commentaire: Oui, la requête fonctionne parfaitement dans Access.

En outre, une note, tout cela est Office 2007.

MISE À JOUR 2

Nous allons d'accès à Word parce que le programme VBA est déjà dans Word mais doit faire des données croquants ce n'est pas vraiment pratique à faire en VBA.

La modification de la création d'un objet Application Excel n'a aucun effet hormis le ralentissement considérable de la requête.

MISE À JOUR 3

J'ai la référence à Excel dans Word et Access. (S'il y a une meilleure façon d'obtenir une fonction ACOS, je suis certainement ouvert à elle.)

+1

Êtes-vous capable d'exécuter la requête Access (qui utilise Acos) dans Access sans aucune erreur? – shahkalpesh

+0

Oui. Voir la question mise à jour. –

+0

Je me serais attendu Set xl = CreateObject ("Excel.Application") Acos = xl.WorksheetFunction.Acos (0.1) Notez également que si vous entrez dans la mauvaise valeur pour les radians, vous obtiendrez une erreur. – Fionnuala

Répondre

1

Au lieu d'utiliser Excel pour obtenir le résultat de ACos, essayez cette

où X = champ qui contient la valeur qui sera passé à Acos

SELECT X, IIF(X = 1, 0, Atn(-X/Sqr(-X * X + 1)) + 2 * Atn(1)) 
FROM myTable; 

Voici le page, je référées ACos formule.

Essayez & enregistrez la requête ci-dessus.
L'accès a d'autres fonctions telles que Atn et Sqr qui peut vous aider à obtenir ce qui est nécessaire pour ACos.Par conséquent, vous n'aurez pas besoin de demander à Excel de calculer les choses pour vous.

Remarque: Vous devrez gérer les erreurs pour les valeurs non prises en charge par ACos.
par exemple. =ACOS(1.25) vous donne #NUM! (pas un nombre)

De la même manière, si le paramètre à la requête ci-dessus est 1.25, il retournera une erreur.
Donc, soyez prudent et validez l'entrée pour vous assurer que la requête ne plante pas.

+0

Cela fonctionne pour remplacer la fonction Acos, mais il ne me permettra toujours pas d'exécuter la requête de VBA. J'essaierai de l'ajouter, mais le X sur lequel tourne Acos est une expression très compliquée, donc ça va être un énorme gâchis. –

+0

En fait, l'expression dans mon appel à Acos est si longue L'accès ne me laissera pas intégrer cette fonction ... –

+0

Y at-il un moyen, vous pouvez vider la valeur X dans le champ Y d'une table intermédiaire et utiliser le champ Y comme paramètre à cette expression? – shahkalpesh