Procédure Sub OK mais pas Fonction - VB/VBA/VBS - Programmation
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
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 !
Marsh Posté le 18-02-2010 à 09:47:05
Et ta fonction Interpolation retourne bien une valeur à la fin?
Genre:
Code :
|
?
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 ...)
Marsh Posté le 18-02-2010 à 09:53:54
bon, ceci ne sert à rien:
Code :
|
Et ça, ça sert à quoi?
Code :
|
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.
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 :
Marsh Posté le 18-02-2010 à 10:20:24
Il ne te reste plus qu'à identifier la cause de l'erreur.
Marsh Posté le 18-02-2010 à 10:38:40
Oui exactement......
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 ??
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).
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 ??
Marsh Posté le 18-02-2010 à 11:42:11
Quel est le message d'erreur exact? (et le numéro d'erreur)
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° ...
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
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
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