Problème de formule non calculée avec Macro VBA [Résolu/Fermé]

Signaler
Messages postés
4
Date d'inscription
jeudi 7 février 2013
Statut
Membre
Dernière intervention
8 septembre 2014
-
renan.michel
Messages postés
4
Date d'inscription
jeudi 7 février 2013
Statut
Membre
Dernière intervention
8 septembre 2014
-
Bonsoir à tous,

Je travaille actuellement sur l'utilisation d'une base de données pour simplifier le travail de quelques personnes, pour cela j'ai créé une macro en VBA, dans celle-ci j'utilise une fonction de Base de données (DMIN), malheureusement une fois mise dans ma macro, une fois que je l'exécute le calcul ne se fait pas. J'ai pas mal cherché depuis hier à résoudre ça mais je n'ai pas trouvé de réponse dans les différents forums, je me permets donc de vous demander de l'aide là dessus. Pour cela j'ai simplifié mon cas à la partie qui me pose problème. J'utilise le code suivant:

Public Sub MacroTest()

Dim Last_Line_Cat As Integer

'Code pour obtenir la dernière ligne remplie de mon tableau
Sheets("Feuil1").Activate
Range("C3000").End(xlUp).Select
Last_Line_Cat = ActiveCell.Row

Cells(1, 13).Formula = "=DMIN(Cells(1,1):Cells(Last_Line_Cat,5), Cells(1,5), Cells(1,14):Cells(2,16))"

End Sub

Et comme vous pouvez le voir sur la photo jointe, il y a un problème avec la formule qui apparait dans la cellule M1.
Pour précision j'ai bien vérifié que le format n'étai pas texte mais standard pour cette cellule.

Merci d'avance à tous ceux qui prendront le temps de m'aider.
Bonne soirée

6 réponses

Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
slt,

Je vois pas la photo (mais ça fait rien).

Je pense que le probleme vient de ta façon d'écrire la formule dans ta macro. il ne faut pas oublier que tant que tu est dans les guillemets, vba ne cherche pas à comprendre ce qu'il y a il se contente d'écrire. Dès lors "cells(bla,bla)" n'a plus aucun sens.

heureusement vba a un outil pour concatener les string : &

De plus je suppose que tu veux les addresse (genre "A1") de tes cells et avec ce que tu as écris VBA ne va pas comprendre nom plus donc il faut lui présciser que tu veux mettre une adresse.

donc tu peux remplacer ta formule par :
'je sais c'est un peu lourd mais si tu veux continuer à voir la formule dans fx t'as pas le choix 
Cells(1, 13).Formula = "=DMIN(" & Cells(1,1).adress & ":" & Cells(Last_Line_Cat,5).adress & "," & Cells(1,5).adress & "," & Cells(1,14).adress & ":" & Cells(2,16).adress & ")" 
 

PS : pour gagner du temps les select et les activate sont à banir, ça ralentit beaucoup ton code et il vaut mieux prendre tout de suite les bon reflexes :

'Je laisse le activate sinon tu va devoir rajouter une variable worksheet sur toutes tes range
Sheets("Feuil1").Activate
Last_Line_Cat = Range("C3000").End(xlUp).Row
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 78440 internautes nous ont dit merci ce mois-ci

Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
juste pour savoir un lien quelconque avec un élève des Mines ?

Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
C'est Pierrick :-) du coup je pense que tu peux me tutoyer sans te poser trop de soucis....

J'ai regarder un peu sur le net la redaction de Dmin : http://office.microsoft.com/en-gb/excel-help/dmin-HP005209062.aspx et je pense qu'on a pas écrit tout à fait les bons trucs.

Il attendpour field un nom de colonne et nous on lui donne une adresse. dit moi si ça marche mieux avec ça :

Cells(1, 13).Formula = "=DMIN(" & Cells(1,1).adress & ":" & Cells(Last_Line_Cat,5).adress & "," & Cells(1,5).text & "," & Cells(1,14).adress & ":" & Cells(2,16).adress & ")"


PS : fais gaffe avec les TCD, c'est très lourd pour VBA de les detruire et de les reconstruire (l'applet de mon stage met genre 2 grosses minute à s'ouvrir à chaque fois avec 8000 ligne donc je sais pas combien t'en a mais fais gaffe c'est vite ingérable et passablement chiant)

plutôt le le TCD je te conseil le listObject, c'est plus facile que le TCD et diablement éfficace : http://www.excelabo.net/excel/tableaux_vba

cordialement,
N'oubliez pas de marquez votre post comme résolu !
Messages postés
4
Date d'inscription
jeudi 7 février 2013
Statut
Membre
Dernière intervention
8 septembre 2014

Merci beaucoup pour la réponse,

Oui en effet je suis un élève des Mines, ce choix de pseudonyme n'était pas très judicieux, mais je n'aurai jamais pensé tomber sur quelqu'un qui me connaisse. A qui ai-je à faire?
Pour en revenir au code avec vos lignes je suis maintenant confronté à une erreur d'execution 438, "propriété ou méthode non gérée par cette objet".
Mais suite à votre conseil, j'ai mieux saisi le problème de l'adresse de la cellule.
J'ai donc trouvé une première solution temporaire qui consiste à utiliser le code suivant avec un tableau plus grand que celui dont j'ai vraiment besoin:

Cells(1, 13).Formula = "=DMIN(A1:E10000, E1, N1:P2)"

Je n'ai ainsi plus le problème de l'adresse relative à une variable et tout se passe bien, jusqu'à ce que mon tableau devienne trop grand, de plus je dois surement augmenter le temsp de calcul.
Et pour résoudre définitivement le problème, tout en apportant une solution beaucoup plus efficace et élégante, je vais m'orienter vers la création par VBA d'un tableau croisé dynamique qui sera supprimé à la fin de chaque utilisation, il semble que ce soit quelque chose d'assez rapide à créer. Mais je dois encore approfondir le sujet.

Bon weekend
Messages postés
138
Date d'inscription
jeudi 17 juillet 2014
Statut
Membre
Dernière intervention
25 février 2019
7
PS : ton erreur survient à quelle ligne ?

Messages postés
4
Date d'inscription
jeudi 7 février 2013
Statut
Membre
Dernière intervention
8 septembre 2014

Mon problème se situe à cette ligne de code, et avec ton nouveau code ça ne fonctionne pas non plus, j'ai toujours une erreur 438, et comme j'ai pas trop de temps, je vais plutôt utiliser des adresses absolues en allant jusqu'à la ligne 20000 (par ce que mon tableau doit grandir avec le temps). Mais merci pour l'aide, et si j'ai le temps je vais lire un peu tout ça sur les ListObject pour voir s'il est possible de faire quelque chose de plus efficace ensuite. Et pouir les tableaux dynamiques je verrai ce que ça donne aussi, j'essayerai de comparer.
En tout cas merci pour m'avoir remis dans la boucle de mails, c'est vrai que j'étais étonné de ne plus avoir de vos nouvelles.
La bise