Function et utilisation de variables range

Bonsoir,

je suis mis à l'épreuve sur un programme sous excel. Mon soucis c'est l'utilisation des variables range dans une fonction.

D'abord j'ai utilisé un fonction d' interpolation linéaire qui est la suivante :

Function interpoL(lookup_value, know_X, know_y)

Dim pointer As Integer

Dim X0, X1, Y0, Y1 As Double

pointer = Application.Match(lookup_value, know_X, 1)

X0 = know_X(pointer)

X1 = know_X(pointer + 1)

Y0 = know_y(pointer)

Y1 = know_y(pointer + 1)

interpoL = Y0 + ((lookup_value - X0) / (X1 - X0)) * (Y1 - Y0)

End Function

Impeccable je m'en sers dans ma feuille excel avec know_X ma plage de X et know_y ma plage de Y et ca marche

Le problème arrive maintenant. j'ai la fonction suivante qui ne marche pas :

Function calcul_FM(epaisseur_tube_mm As Double, nuance As String)

Dim epaisseur_tube_inch As Double

Dim kownx_epaisseur, knowny_nuance As Range

epaisseur_tube_inch = 0.039370079 * epaisseur_tube_mm

If epaisseur_tube_inch > 0.109 Or epaisseur_tube_inch < 0.02 Then calcul_FM = CVErr(xlErrNA): Exit Function

If nuance = "Titane" Then

knowny_nuance = Worksheets("HEI_DATA").Range("E24:M24").Value

ElseIf nuance = "Titane" Then

knowny_nuance = Worksheets("HEI_DATA").Range("E26:M26").Value

End If

kownx_epaisseur = Worksheets("HEI_DATA").Range("E15:M15").Value

calcul_FM = interpoL(epaisseur_tube_inch, kownx_epaisseur, knowny_nuance)

End Function

Cette fois-ci, je ne voulais pas utiliser knowny_nuance et kownx_epaisseur en argument de fonction car j'aurais eu autant de variables à déclarer comme arguments de fonction que de nuances (15 nuances environ). Je ne voulais pas faire une fonction avec 22 arguments.

Seulement les variables de type range déclarées dans la fonction calcul_FM ne semble pas être acceptées par la fonction interpoL appelée dans la fonction calcul_FM. Quand je l'utilise dans la feuille elle me retourne #valeur!Pourtant le programme compile

J'espère avoir été clair. Quelqu'un a une idée de la raison ? Pourquoi la function interpol ne marche pas dans la fonction calcul_FM

Merci pour votre aide

Bonsoir,

J'ai un peu de mal avec tes dénominations...

Voyons voir ce que je peux voir.

Dim kownx_epaisseur, knowny_nuance As Range

Seule la 2e variable est de type Range, la 1re de type Variant (non typée).

Il faut écrire :

Dim kownx_epaisseur As Range, knowny_nuance As Range

Ensuite :

knowny_nuance = Worksheets("HEI_DATA").Range("E24:M24").Value

Si ta variable est déclarée Range, elle acceptera une référence de plage mais pas un tableau de valeurs.

Soit déclaration Range :

Set knowny_nuance = Worksheets("HEI_DATA").Range("E24:M24")

et tu envoies la plage à ton autre fonction (il serait d'ailleurs préférable alors de déclarer tes arguments de type Range dans la 1re fonction...)

Soit tu laisses toutes ces variables non typées (=type Variant) et tu envoies des tableaux de valeurs (comme Match fonctionne sur les deux, le choix t'appartient).

Autre chose :

If nuance = "Titane" Then

ElseIf nuance = "Titane" Then

Il y a une erreur quelque part, le ElseIf n'a aucune chance ici !

Et :

Dim X0, X1, Y0, Y1 As Double

Même remarque que la première, seule Y1 est Double, les autres sont de type Variant.

Tu peux mettre :

Dim X0#, X1#, Y0#, Y1#

en utilisant le caractère de déclaration de type pour raccourcir.

Par contre je n'ai rien compris à ton histoire de couleurs mais tu pouvais envoyer un tableau, donc une seule donnée...

Cordialement.

Alors là chapeau bas Monsieur Ferrand. En fait je n'avais pas compris que lorsqu'on écrivait

Dim A, B,C as double

seule la dernière variable était de type double....Donc grosse correction de l'ensemble de mon code pour ce point déjà.

J'ai compris aussi que je ne devait pas mettre knowny_nuance = Worksheets("HEI_DATA").Range("E24:M24").Value car j'entrais une valeur de type tableau pas de type range. C'est ça ?

Enfin j'avais essayé de mettre set mais comme toutes mes variables n'étaient pas de type range j'ai cru que mon problème ne venait pas de là. Enfin dans ma fonction interpol, il faut rentrer des x classés en ordre croissant, or dans mon tableau où je faisais le test ils étaient en ordre décroissant. Après correction de toutes ces erreurs....ça marche! MERCI BEAUCOUP DONC!

Questions culturelles ?

Pourquoi doit-on mettre Set devant une variable qui reçoit un valeur de type range ?

J'imagine que Dim A# revient à écrire Dim A as double. Y-a-t-il d'autres astuces comme cela pour les autres variables ?

P.S : en fait mon programme calcule le coefficient d'échange thermique global dans un tube. La notion de nuance est en fait le matériau qui compose le tube, rien a voir avec la nuance d'une couleur

Il m'a l'air très réactif ce forum. J'aurais l'occasion d'y revenir vu l'ampleur de ma tâche...

Je ne sais pas comment on met le symbole résolu dans ce forum

Set est une instruction obligatoire pour affecter une référence d'objet à une variable objet. (C'est le langage qui est défini ainsi !)

Prenons une variable de type Variant, qui accepte donc tout type de donnée :

Tu écris : MyVar = .Range("A2:A100") , tu affectes un tableau de valeurs

Tu écris : Set MyVar = .Range("A2:A100") , tu affectes la référence de plage.

Oui toute variable doit être typée individuellement, sinon elle est de type Variant. Ça marche jusqu'à ce qu'une incompatibilité survienne puisque type Variant prend tout... Il est toutefois préférable de typer (justement aussi pour que ça n'accepte pas tout !), une variable typée est évaluée plus rapidement par VBA (logique car pour une Variant il doit définir le type de donnée...)

Les caractères de déclarations de type sont bien pratique pour écrire, mais sont en nombre limité. Tu peux aussi écrire :

Dim i% [= As Integer], n& [= As Long], t! [= As Single], x# [As Double], e@ [=As Currency], ch$ [=As String]

Je n'en connais pas d'autre.

Pour mettre en résolu, tu dois avoir une coche dans ton post sur laquelle cliquer.

Cordialement.

merci pou l'aide et les explications

Rechercher des sujets similaires à "function utilisation variables range"