[VBA] Selection d'un range de valeurs dans un Variant

Bonjour,

je rencontre un problème inédit pour moi.

J'ai une plage de données rectangulaire dans excel contenant des chiffres, des dates, etc.

J'ai créé une fonction censée utiliser cette matrice de données comme input mais si par exemple je procède comme ça:

Sub MaSub

MaMatrice = Sheet1.range("A1:K12")

MonResult = MaFonction(MaMatrice)

End sub

Function MaFonction(matrice as variant)

....

End function

... ça ne fonctionne pas car en plaçant un espion sur matrice ou MaMatrice on s'aperçoit qu'au lieu de retrouver bêtement une matrice dans VBA on a qqch du genre Variant/Object/Range comprenant TOUTES les caractéristiques du range initialement sélectionné (de la couleur des cellules à la police utilisée en passant par la taille des colones).

C'est la 1ère fois que j'ai ce problème.

Est ce que cela est du au fait que ma plage de données comprend des cellules au format date et d'autres en double ? Ca me parait bizarre comme explication, j'ai déjà (de mémoire) travaillé avec des matrices de ce genre sans problème.

Ce soucis est d'autant plus contraignant pour moi que ma fonction ne doit pas avoir un usage uniquement VBA au final mais doit pouvoir être utilisée directement dans EXCEL en sélectionant un range comme input.

Merci d'avance pour vos lumières !

EDIT :

Il s'avère en fait qu'en codant exactement comme je l'ai fait dans mon exemple au dessus ça fonctionne. Le problème vient quand je rentre le range sous forme "sheet1.range("A1:K12")" directement comme input dans la fonction. ce qui fait que j'ai toujours le problème quand je veux utiliser cette fonction sans passer par une SUB mais directement en tant que fonction excel.

Bonjour,

non-sens

Ta fonction "Ma fonction" est déclarée comme "Variant" avec un résultat de type "variant", et "MaMatrice" est définie comme "Range"

C'est la 1ère fois que j'ai ce problème.

Bonjour,

Essaye comme ça :

Sub MaSub

dim MaMatrice as Range

Set MaMatrice = Sheet1.range("A1:K12")

MonResult = MaFonction(MaMatrice)

End sub

Function MaFonction(matrice as Range)

....

End function

Bonjour à vous,

@Jean-Eric

En fait codé exactement comme dans mon exemple, ca fonctionne parfaitement, voir mon EDIT. Du coup je ne comprend pas ton point.

@Raja

Ca ne fonctionne pas comme ça car la variable "matrice" au lieu d'etre Variant/Object/Range passe à Range/Range et n'est toujours pas exploitable en tant que matrice de valeurs.

En revanche comme ceci :

Function MaFonction(matrice as range)

matrice_N2 = CVar(matrice)

...
End Function

Ca marche très bien.

Une autre alternative aurait été de me promener dans "matrice.Value2" mais ça complexifiait la fonction et la rendait difficilement incrustable dans une utilisation à l'intérieur d'un code ce coup ci et plus sur une feuille excel. Or j'ai besoin des deux fonctionalités !

Merci de m'avoir mis sur la voie

EDIT :

Ce que je trouve très bizarre quand même c'est qu'en définissant "matrice" comme Variant ca devienne un Variant/Objet/Range et pas simplement un Variant/Variant comprenant les données. D'autant plus étrange à mes yeux que je ne définis pas MaMatrice et que donc de base c'est un Variant.

Ca veut dire que dans une SUB ou j'attribue les valeurs d'un range à une variable de type MaMatrice (variant) j'obtiens bien une matrice de valeurs exploitables (Variant/Variant ou Variant/Double, Variant/Date, etc.) mais quand j'utilise directement ce meme range en input d'une FUNCTION tout en le définissant comme Variant dans la paranthèse j'obtiens un Variant/Object/Range complètement triso.

EDIT 2 :

Na mais ma résolution ne fonctionne que si je veux utiliser des données sur une feuille comme input, je ne peux plus utiliser ma fonction avec une matrice complètement construite dans VBA sans devoir la reverser d'abord sur une feuille excel, ce qui est stupide.

J'ai des fonctions perso d'inversion de matrice ou de multiplication de matrices qui peuvent prendre des Range comme input et qui marche très bien sans que je doive passer par des constructions bancales sur le format des variables...

Si qqn a une autre idée sur le sujet je suis preneur !

Merci

EDIT 3 :

Et ensuite j'arrete le monologue

Je vais en fait faire ça :

Function MaFonction(matrice as Variant)

matrice_N2 = CVar(matrice)

...
End Function
 

J'ai essayé et ça marche.

SI l'input est un range excel, "matrice" sera une saleté de Variant/Object/Range et "matrice_N2" un bon Variant/Variant des familles. Si l'input est déjà une matrice créée dans VBA et bien "matrice" et "matrice_N2" seront exactement les mêmes, ça sert à rien mais ça résout le pbl.

Je tag le sujet comme résolu mais si qqn a une explication et une meilleure solution qu'il n'hésite pas à m'abreuver de sa connaissance, merci !

Bonjour

Pour ma culture personnelle

peux tu donner un exemple qui ne retourne pas la bonne valeur (en indiquant bien sur quelle valeur tu dois avoir) ?

Avec tout ce bla bla je m'y perds

Ce n'est pas primordial (je pense que je pourrais dormir sans ça )

Bonsoir,

Malheureusement je ne peux pas mettre le fichier original à disposition pour des raisons pro.

Et malheureusement je suis incapable de reproduire l'erreur sur un autre fichier...

En théorie le code ci dessous ne doit pas fonctionner dans mon fichier initial car je rentre le range directement dans l'appel de la fonction Recup_data au lieu de d'abord nommer une varaible intermédiaire qui comprendrait ce range.

Je pense de plus en plus qu'il y a un conflit dans mes 200.000 reférences / addins excel/vba embarqués dans tous les excel qui s'ouvrent là où je travaille. Un redémarrage s'impose.

Sub variable_mongolo()[attachment=0]Matrice.docm[/attachment][attachment=0]Matrice.docm[/attachment]

a = Recup_data(Sheet9.Range("A3:I25"))

Sheet9.Range("L4") = a

End Sub

Function Recup_data(mat As Variant)

Recup_data = mat(2, 3)

End Function

J'ai mis ci joint deux screenshots de mes espions VBA sur la matrice en question, un quand ça ne fonctionne pas et un quand tout va bien.

21matrice.docm (35.44 Ko)

Bonjour

Je ne vais pas t'embêter plus longtemps

Je dois avoir mes lunettes très sales, je ne vois pas ce qui différencie les 2 copies d'écran

Merci

Au temps pour moi

un copier/coller malheureux

normalement ce coup ci c'est bon

27matrice2.docm (74.22 Ko)

Bonjour,

à la limite je dirais plutôt que c'est bien une chance de recevoir un range sur =MaFonction(A1:B2) et non pas juste les valeurs. Ca permet quand même plus de choses.

Ta solution avec CVar me parait bien, je ne vois pas ce que tu lui reproches.

Si ça s'y prête tu peux mettre matrice = CVar(matrice) pour ne pas à avoir à reprendre le code derrière et ne pas doubler l'encombrement mémoire.

eric

Bonjour,

Je comprends ton point sur l'intérêt de travailler sur le range mais dans mon cas c'est juste gênant et inutile puisque sans le changer avec Cvar() ça rend le cas ou mon input est une plage de cellules et le cas où il s'agit une matrice définie au préalable dans vba incompatibles. Et seules les valeurs m'intéressent.

Merci pour la petite astuce pour la mémoire sinon, je n'y avait pas pensé dans le feu de l'action.

Rechercher des sujets similaires à "vba selection range valeurs variant"