Requête vers access Vs recalcul

Bonjour à tous,

Hier, Bouben m'a indiqué une solution pour importer des données issues d'une ou plusieurs bases access dans mon fichier excel à partir d'un ID de référence : https://forum.excel-pratique.com/post564002.html#p564002

Il s'agit d'une macro VBA (qui nécessite donc d'être lancée).

Voilà ma problématique :

  • mon fichier excel fonctionne en recalcul manuel
  • l'ID de référence est le fruit d'un calcul
  • la base de donnée à interroger est le fruit d'un calcul
  • le résultat final attendu lorsque je lance un recalcul dépend des données importées depuis access.

A l'heure actuelle, il me semble donc que pour obtenir mon résultat final, je dois :

1/ lancer un recalcul manuel pour calculer l'ID référence et calculer la base de données concernée

2/ lancer la macro VBA pour importer dans excel les valeurs correspondantes à l'ID référence calculé, dans la base de données adéquate

3/ lancer un second recalcul pour calculer mon résultat final

Chaque recalcul prend quelques secondes, donc j'aimerais bien éviter d'avoir à faire 2 recalculs successifs

Quelqu'un a-t-il une solution?

Merci

Nicole

Bonjour Nicole,

Pour répondre à la question, nous avons besoin de savoir en quoi consiste le recalcul.

Peux-tu envoyer ton fichier Excel ?

Bouben

Bonjour,

tout dépends aussi de ce que tu appelles "quelque secondes "

P.

bouben a écrit :

Bonjour Nicole,

Pour répondre à la question, nous avons besoin de savoir en quoi consiste le recalcul.

Peux-tu envoyer ton fichier Excel ?

Bouben

Bonjour Bouben,

Je ne peux pas envoyer le fichier, mais pour répondre à ta question, voici un exemple :

L'ID référence va dépendre de plusieurs facteurs (par exemple un ID client et une date), et la base de données à interroger sera le fruit d'un algorithme dont l'issue peut être "C:\DB_factures.accdb" ou "C:\DB_devis.accdb" par exemple. La réalité est un peu + complexe, mais je simplifie pour l'exemple.

Donc pour obtenir le résultat final sous mon fichier excel, il faut :

1. que l'utilisateur saisisse les infos clés (ID client, date, facture ou devis)

2. qu'il lance un calcul manuel pour obtenir l'ID référence et l'adresse de la DB à interroger

3. qu'il lance la macro VBA pour obtenir les données issues de la DB

4. qu'il lance un 2nd calcul manuel pour traiter ces données importées depuis access et calculer l'info finale recherchée (par exemple un calcul de points fidélités ou un avoir, etc...).

C'est ce qui m'embête avec le recours à une macro pour importer les données.


patrick1957 a écrit :

Bonjour,

tout dépends aussi de ce que tu appelles "quelque secondes "

P.

Bonjour Patrick,

chaque recalcul peut prendre 3 ou 4 secondes, mais de toutes façons, même si ça en prenait moitié moins, c'est le principe même qui est un problème, car vu qu'il s'agit d'une opération ultra ultra récurrente (plusieurs milliers de fois par jour), lancer 2 recalculs par opération semble impossible : trop contraignant pour l'utilisateur et trop lent.

re,

si tu ne peux envoyer le fichier.. une copie anonymisée alors et sans lien externe...

P.

patrick1957 a écrit :

re,

si tu ne peux envoyer le fichier.. une copie anonymisée alors et sans lien externe...

P.

désolée, c'est impossible, le fichier est trop gros (90MO) -> impossible à anonymiser.

La problématique est vraiment celle indiquée ci-dessus.

Je viens de tester, et en effet, avec un seul calcul, ça ne fonctionne pas : le problème indiqué dans mon post initial se pose bel et bien.

Est-il possible d'aller chercher les données dans excel grâce à une formule au lieu d'une macro VBA?

Y a-t-il une autre solution?

Formule ou VBA ça passe de toute façon par un recalcul...

Tu peux faire en sorte que la requête ACCESS se lance au moment du recalcul (à la manière d'une fonction personnalisée) et que le second recalcul soit la conséquence de cette requête.

A+

Le test ci-joint illustre le problème :

D'abord vous devez :

1. télécharger les fichiers excel et access ci-joints

2. renommer le fichier access en suprrimant ".txt" qui sert uniquement à pouvoir attacher le fichier ici

3. dans le fichier excel, cellule C2 : indiquez l'emplacement du fichier access

Ensuite, voici comment fonctionne l'exemple ci-joint (à utiliser en calcul manuel) :

  • C4 choisit alléatoirement une ID parmi celles listées dans G5:G11 à chaque calcul manuel. La zone H5:J11 est une copie des valeurs contenues dans la base access.
  • le bouton lance un import des valeur correspondant à l'ID puis un calcul via application.calculate pour calculer le résultat recherché (qui dans cet exemple est la somme des valeurs)

En faisant quelques essais, on voit bien le problème : l'ID ne correspond jamais aux 3 valeurs exportées, sauf dans le cas aléatoire ou 2 ID identiques se succèdent... et le résultat obtenu est donc erroné par rapport à l'ID en cours.

Cela illustre le problème indiqué dans mon 1er post.

J'espère trouver une solution, sinon je suis bloquée ((

11test2-accdb.zip (14.51 Ko)
galopin01 a écrit :

Formule ou VBA ça passe de toute façon par un recalcul...

Dans le cas des fonctions, lors du recalcul, excel se débrouille toujours pour suivre un arbre de dépendances, donc in fine, les calculs sont bien réalisés avec les bonne valeurs initiales.

Tu vois ce que je veux dire?

galopin01 a écrit :

Tu peux faire en sorte que la requête ACCESS se lance au moment du recalcul (à la manière d'une fonction personnalisée) et que le second recalcul soit la conséquence de cette requête.

A+

Comment puis-je faire cela?

Sachant que l'ID utilisé pour l'import est lui aussi la conséquence du recalcul.

En gros, il faudrait que je lance le recalcul manuel -> l'ID est calculé au même titre que des milliers d'autres calculs -> l'import depuis Access est réalisé lorsque l'ID a été calculé -> le résultat final est calculé à l'aide des valeurs 1, 2 et 3 importées -> fin du calcul manuel.

Ci-joint une proposition à tester.

Création d'une fonction personnalisée "Valeur", qui prend 3 paramètres :

  • chemin de la base de données
  • ID
  • numéro de la valeur recherchée (exemple : 1 => Valeur1, 2 => Valeur2, 3 => Valeur3)
=> en fonction du numéro, on récupère telle ou telle colonne, à adapter selon le cas réel

Inconvénient :

3 valeurs à récupérer = 3 formules => fait 3 accès différents à la base (3 requêtes) pour un même ID. Donc temps multiplié par 3.

(Une fonction ne peut renvoyer qu'un résultat)

A utiliser comme une fonction classique (SOMME, etc)

ex : =valeur(BDD; ID;1)

ou

=valeur($C$2; $C$4;1)

En cas d'erreur de la fonction (base inexistante, ID inexistant, etc)

=> la fonction renvoie une valeur "parlante" ex : #ERR [Base inexistante]

Bouben

bouben a écrit :

Ci-joint une proposition à tester.

Création d'une fonction personnalisée "Valeur", qui prend 3 paramètres :

  • chemin de la base de données
  • ID
  • numéro de la valeur recherchée (exemple : 1 => Valeur1, 2 => Valeur2, 3 => Valeur3)
=> en fonction du numéro, on récupère telle ou telle colonne, à adapter selon le cas réel

Inconvénient :

3 valeurs à récupérer = 3 formules => fait 3 accès différents à la base (3 requêtes) pour un même ID. Donc temps multiplié par 3.

(Une fonction ne peut renvoyer qu'un résultat)

A utiliser comme une fonction classique (SOMME, etc)

ex : =valeur(BDD; ID;1)

ou

=valeur($C$2; $C$4;1)

En cas d'erreur de la fonction (base inexistante, ID inexistant, etc)

=> la fonction renvoie une valeur "parlante" ex : #ERR [Base inexistante]

Bouben

1000 mercis Bouben !!!

Entre hier et aujourd'hui, tu m'as vraiment bien aidée !

Rechercher des sujets similaires à "requete access recalcul"