Procédure Sub OK mais pas Fonction

Procédure Sub OK mais pas Fonction - VB/VBA/VBS - Programmation

Marsh Posté le 17-02-2010 à 18:17:54    

Bonjour à tous,
 
J'ai un petit problème qui ne m'était jusqu'à présent jamais arrivé :
 
J'ai créé une fonction VBA, qui marche parfaitement lorsque je crée la procédure SUB et que j'appelle avec Call :
 
Sub Bouton2_Clic()
Call Interpolation("G5", "B5:R5", "B6:R6" )
End Sub
 
J'ai bien regardé avec l'outil "Variables Locales" (F8), ma fonction Interpolation fonctionne parfaitement et le résultat de la fonction est correcte.
 
Mais si je me mets maintenant dans une case Excel de la même feuille que mon bouton2, et que je tape : Interpolation("G5", "B5:R5", "B6:R6" ) j'ai l'erreur #VALEUR...
 
Je comprends pas pourquoi ça marche dans un cas et pas dans l'autre  :pt1cable:  
 
 
D'ailleurs j'en profite pour une 2ème question, comment peut -on passer une cellule excel en paramètre?
Ma fonction contient pour le moment des string, mais à terme, j'aimerai avoir une fonction en tapant dans une cellule excel :
 
Interpolation(sélectionner les cellules excel qui m'intéressent)
 
Merci beaucoup de votre aide !


Message édité par pepito_mi_corazon le 17-02-2010 à 18:29:09
Reply

Marsh Posté le 17-02-2010 à 18:17:54   

Reply

Marsh Posté le 18-02-2010 à 08:23:19    

Salut, rebatir ta fonction interpolation en
Interpolation(A as Range, B as Rrange, C as Range )
Sans plus de détail difficle de faire mieux pour le reste de cette fonction


Message édité par kiki29 le 18-02-2010 à 08:23:31
Reply

Marsh Posté le 18-02-2010 à 09:46:35    

Oki je viens de changer ma fonction pour des Range, et même problème je la  fais marcher avec un SUB, mais pas en appelant la fonction depuis une case EXCEL o_O : Voici mon code :
 
Public Function Interpolation_new(t As Range, dates As Range, taux As Range) As Double
 
Dim tab_dates, tab_taux As Variant
 
tab_dates = dates 'tableau INPUT des dates
tab_taux = taux ' INPUT des données à interpoler
 
 
For i = 1 To UBound(tab_dates, 2) 'Feuil2
Worksheets("Feuil2" ).Cells(1, i) = dates(1, i)
Worksheets("Feuil2" ).Cells(2, i) = taux(1, i)
Worksheets("Feuil2" ).Cells(3, i) = i
Next i
Worksheets("Feuil2" ).Cells(4, 1) = t
Worksheets("Feuil2" ).Activate
 
 
 
Dim x As Double
x = Application.WorksheetFunction.Match(t, dates, 0) ' Ordonnée de la date considérée
On Error GoTo 0
 
 
 
If x < 4 Then
Interpolation_new = Cubique(x, Cells(3, 1), Cells(3, 2), Cells(3, 3), Cells(3, 4), Cells(2, 1), Cells(2, 2), Cells(2, 3), Cells(2, 4)) 'Interpolation des 4 premières valeurs
 
ElseIf x > Cells(3, UBound(tab_dates, 2) - 4) Then
Interpolation_new = Cubique(x, Cells(3, UBound(tab_dates, 2) - 3), Cells(3, UBound(tab_dates, 2) - 2), Cells(3, UBound(tab_dates, 2) - 1), Cells(3, UBound(tab_dates, 2)), Cells(2, UBound(tab_taux, 2) - 3), Cells(2, UBound(tab_taux, 2) - 2), Cells(2, UBound(tab_taux, 2) - 1), Cells(2, UBound(tab_taux, 2))) 'Interpolation des 4 dernières valeurs
 
Else 'Interpolation du reste
 
 
 
 
            If (Cells(2, x) = 0) Then
 
            Dim tableau(1, 3) As Double 'tableau des noeuds aux alentours
            Dim j As Double
             
 
 
            j = x
            While (Cells(2, j) = 0)
            DoEvents
            j = j - 1
            Wend
            tableau(0, 1) = Cells(3, j)
            tableau(1, 1) = Cells(2, j)
 
 
 
 
 
 
            j = x
            While (Cells(2, j) = 0)
            DoEvents
            j = j + 1
            Wend
            tableau(0, 2) = Cells(3, j)
            tableau(1, 2) = Cells(2, j)
 
 
 
 
 
 
            j = tableau(0, 1) - 1
            While (Cells(2, j) = 0)
            DoEvents
            j = j - 1
            Wend
            tableau(0, 0) = Cells(3, j)
            tableau(1, 0) = Cells(2, j)
 
 
 
 
            j = tableau(0, 2) + 1
            While (Cells(2, j) = 0)
            DoEvents
            j = j + 1
            Wend
            tableau(0, 3) = Cells(3, j)
            tableau(1, 3) = Cells(2, j)
 
            Interpolation_new = Cubique(x, tableau(0, 0), tableau(0, 1), tableau(0, 2), tableau(0, 3), tableau(1, 0), tableau(1, 1), tableau(1, 2), tableau(1, 3))
 
 
            Else:
            Interpolation_new = Cells(2, x)
            End If
 
 
 
End If
 
 
 
 
 
Worksheets("Feuil1" ).Cells(25, 1) = Interpolation_new 'Test qui affiche le résultat de la fonction avec une procédure SUB
 
 
End Function
 
 
 
Depuis une case excel, j'ai tapé : =Interpolation_new(B1;A1:Q1;A2:Q2) ==> #VALEUR
 
Et ma procédure SUB et la suivante :
 
Sub Bouton2_Clic()
Worksheets("Feuil1" ).Activate
Call Interpolation_new(Range("A1" ), Range("A1:Q1" ), Range("A2:Q2" ))
End Sub
 
==> marche impec
 
 
Pourtant avec la fonction Typename j'ai bien vérifié que les cellules Excel étaient reconnues par VBA comme des Ranges :/
 
Voila ou j'en suis, merci de votre aide !

Reply

Marsh Posté le 18-02-2010 à 09:47:05    

Et ta fonction Interpolation retourne bien une valeur à la fin?
 
Genre:
 

Code :
  1. Interpolation = valeur


 
?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 18-02-2010 à 09:48:39    

Oui oui, et ma fonction cubique marche très bien ...

Reply

Marsh Posté le 18-02-2010 à 09:51:10    

Est-ce qu'il y a un moyen d'afficher les étapes de calcul pour une fonction ? ( genre comme F8 pour un SUB ...)

Reply

Marsh Posté le 18-02-2010 à 09:53:54    

bon, ceci ne sert à rien:
 

Code :
  1. On Error GoTo 0


 
Et ça, ça sert à quoi?
 

Code :
  1. Else:


Les : indiquent un label, et vu qu'il n'est référencé nulle part, il ne sert à rien.
 
Mets un breakpoint dans ta fonction et teste pour voir que Interpolation_new a bien une valeur à la fin et ne plante pas.
 
Si tu ne veux pas exécuter ligne par ligne, il y a Debug.Print qui pourra t'aider.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 18-02-2010 à 10:11:45    

Oki j'ai enlevé les 2 parties inutiles (apparemment le On Error stabiliserait la fonction Match...)
 
J'ai identifié l'endroit du problème (merci pour le coup du pointbreak, je ne connaissais pas...) :
 
ça vient de la ligne : Worksheets("Feuil2" ).Cells(1, i) = tab_dates(1, i), après qu'il ait été surligné en jaune, l'éxecution ligne par ligne plante, et si je mets un pointbreak juste après je n'y accède même pas.
 
POurtant mon tableau tab_dates est bien rempli : cf screen :
 
 
http://img192.imageshack.us/img192/3664/screenvbainterp.jpg


Message édité par pepito_mi_corazon le 18-02-2010 à 10:12:56
Reply

Marsh Posté le 18-02-2010 à 10:20:24    

Il ne te reste plus qu'à identifier la cause de l'erreur.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 18-02-2010 à 10:38:40    

Oui exactement...... :D
 
Je vais craquer, il me plante même avec une boucle ultra simple :
 
For i = 0 To 5
Worksheets("Feuil2" ).Cells(7, i + 1) = 2 + i
Worksheets("Feuil2" ).Cells(8, i + 1) = i
Next i
 
Il serait donc impossible de remplir des feuilles excel depuis VBA ??

Reply

Marsh Posté le 18-02-2010 à 10:38:40   

Reply

Marsh Posté le 18-02-2010 à 10:40:39    

Tout dépend si la sheet existe, et si les cellules elles-mêmes sont accessibles. Le message d'erreur devrait te donner un indice (et un lien vers l'aide pour les possibles diagnostics).


Message édité par drasche le 18-02-2010 à 10:40:53

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 18-02-2010 à 11:41:29    

L'aide d'excel me raconte des généralités sur le #VALEUR...
 
La sheet existe bien, mais qu'entends tu par cellule accessible ??

Reply

Marsh Posté le 18-02-2010 à 11:42:11    

Quel est le message d'erreur exact? (et le numéro d'erreur)


Message édité par drasche le 18-02-2010 à 11:42:33

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 18-02-2010 à 11:44:45    

C'est pas vraiment une erreur, mon exécution ligne par ligne s'arrête, et toute la partie Variable locales s'efface, mais aucun message avec Erreur n° ...

Reply

Marsh Posté le 18-02-2010 à 12:09:24    

OK j'ai résolu le problème, je ne passe pas par un tableau dans une Sheet et tout marche bien ! Merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed