Fonction personnalisée problème avec Cells

Bonjour,

Je suis nouveau. Je connais assez bien Excel et je me suis fait des fonctions personnalisées que je peux réutiliser dans tous mes fichiers Excel (Addins) - pratiques dans mon travail.

Contexte : je voudrai créer une fonction personnalisée - donc réutilisable dans tous mes fichiers Excel - qui me permette de trier une PLAGE Source colonnée (ex: A1:A118000) sans les cellules vides ou à espace et mettre le résultat dans une autre PLAGE Destination colonnée (ex:B1:Bnnnn) et ce, en choisissant en Paramètre-1 => la PLAGE Source et Paramètre -2 => l'adresse de la première cellule de la PLAGE Destination.

Supposons que j'appelle cette fonction personnalisée TRIPLAGE, cela donnerait la formule suivante par exemple : "=TRIPLAGE(A1:A118000;K40)" que je place en cellule B1. Ainsi, le résultat commencerait à s'afficher en cellule K40. Si on saisit TRIPLAGE(B123:B45678;), donc en omettant le Paramètre-2, par défaut le résultat s'affichera juste après la cellule contenant la formule.

Mon problème est celui-ci : si on fait la commande Cells(LIG, COL).value = Tabx (i, j), j'ai systématiquement une erreur 1004. Ce que je crois comprendre, c'est que cette commande est possible si elle est dans une procédure liée à un fichier Excel. J'ai essayé. Il doit me manquer des connaissances. Il me semblait intuitivement que l'on pouvait en VBA valoriser une cellule facilement.

Cordialement.

Bonjour,

je débroussaille pour les petits camarades...

tu devrais mettre un fichier identique à ton fichier réel sans données sensibles

P.

Bonsoir,

Dans une procédure Function VBA, tu peux effectivement accomplir pas mal d'actions même si elles n'ont rien à voir avec le résultat que renverra la fonction, et tu peux d'ailleurs l'utiliser sans en recueillir le résultat renvoyé, à l'instar d'une procédure Sub.

Mais quand tu construis une fonction personnalisée destinée à être utilisée dans une feuille de calcul comme toute autre fonction d'Excel, c'est Excel qui reprend la main, et qui est pour le moins très réticent à te laisser produire des résultats ailleurs que là où tu mets la fonction...

J'ai donc quelques doutes sur ton projet, il faudra que tu contournes autrement.

Cordialement.

bonjour Ferrand,

Pour reformuler...

Dans cette situation, il faut qualifier la feuille Cible :

ActiveSheet.Cells(...) 'sans doute)

sinon si elle est instanciée :

Set WsS = Worksheets("blabla")
WsS.Cells(...)

A+

Bonjour à tous,

Merci de vos réponses.

A patrick1957 : en effet, je n'ai pas amené mon code du travail avec son fichier Excel (effectivement données sensibles. Toutefois, je le crois inutile car il s'agit plus d'une question sur la capacité technique du tandem Excel/VBA que de résoudre mon application Fonction personnalisée.

De surcroît, quelques lignes de code suffisent à reproduire le cas - même sur une PLAGE Source de 5 lignes.

D'ailleurs, je partage le scepticisme de MFerrand.

A Mferrand : Comme indiqué ci-dessus, je partage cette opinion.

A galopin01 : déjà essayé. Visiblement, ne fonctionne pas.

D'après mes lectures, il m'a semblé voir que Microsoft ne permettait pas volontairement ces possibilités.

Bon week-end à tous.

Bonjour,

Ben... si tu n'a besoin que d'une plage source de 5 lignes YAPA de problème. Au lieu de nous mettre ton Code du travail, tu nous mets juste un petit classeur avec 5 lignes et le code de ta fonction perso. Et on te dira quoi.

Maintenant si tu a tant de certitudes que tu n'as pas besoin de nous faire tester, inutile de venir sur ce forum...

A+

Bonjour,

Oui, une fonction ne retourne qu'une valeur (ou une matrice) et ne peut pas modifier son environnement (donc d'autres cellules).

Il faut donc que tu fasses une fonction personnalisée matricielle placée et validée sur la totalité de la plage résultat qui doit être de même longueur que la plage source puisque susceptible de n'avoir aucune suppression.

Un exemple où je n'ai fait qu'un simple tri, je te laisse repousser les vides à la fin, je pense que tu sais faire.

Par contre si tu penses l'utiliser sur d'autres classeurs que là où elle est définie on a souvent des surprises avec excel.

Les fonctions personnalisées on tendances à utiliser d'autres feuilles pour les données que celle qui était prévue, et d'être intégrée à un Calculate où elles ne devraient pas être. Le plus souvent on ne le voit pas car la feuille de la fonction n'est pas active, mais si son résultat est utilisé ailleurs il devient n'importe quoi.

Je te conseille fortement de contrôler l'origine lors de l'appel et de voir s'il correspond bien à la réalité.

Bon, un peu dur à expliquer mais si tu rencontres ce type de problème ces fonctions pourront te servir :

'Nom classeur :

Application.ThisCell.Parent.Parent.Name

'Nom feuille :

Application.ThisCell.Parent.Name

'Adresse cellule d'appel :

Application.ThisCell.Address

eric

JORKY a écrit :

Bonjour à tous,

Merci de vos réponses.

A patrick1957 : en effet, je n'ai pas amené mon code du travail avec son fichier Excel (effectivement données sensibles.

De surcroît, quelques lignes de code suffisent à reproduire le cas - même sur une PLAGE Source de 5 lignes.

as volontairement ces possibilités.

Bon week-end à tous.

Le fichier du travail n'est pas une bonne excuse, il suffit de l'anonymiser et sur base de la même structure; on voit souvent ici de très bonnes réponses sur des exemples qui en fait n'ont rien a voir une fois une partie du vrai fichier publié !

Et si quelques ligne suffisent , raison de + pour les envoyer non ?

Mais, les autres (que je salue) , bien plus costauds que moi en VBA, t'ont donné leur avis

P.

Bonjour à tous,

Je partage l'avis d'Eric il me semble sur le diagnostic, en estimant que le risque de recalcul erroné est minime dans ce cas... Cependant, dans la mesure où l'opération me paraît relever d'un filtrage avancé avec copie sur un autre emplacement, je pense qu'une Sub serait mieux adaptée...

Et elle pourrait être déclenchée par une évènementielle sur changement en B1, cellule dans laquelle pourrait être portée une addresse d'emplacement... Méthode somme toute apparentée au fait de saisir une formule à un endroit pour provoquer une action ailleurs...

Cordialement.

Bonjour Eriiic,

Je te remercie pour la réponse. Je saurai faire bon usage de ton code.

Je comprends que la chose n'est pas aisée.

Bon week-end.

Bonjour,

Estimant avoir la réponse à mon problème exposé en titre, faut-il procéder à une clôture de son sujet ? (suis débutant). Si oui, comment ?

Bon dimanche.

Bonjour,

Oui, c'est bien de clôturer, en cochant la case résolu sur un de vos post.

sur celui ayant résolu le pb tant qu'à faire

Rechercher des sujets similaires à "fonction personnalisee probleme"