Diagram en Excel, VBA

Fermé
digit Messages postés 4 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 20 septembre 2006 - 22 août 2006 à 20:00
 sam254 - 30 nov. 2007 à 11:20
Salut a tous,

je dois ecrire un programme avec VBA applique a Excel. Je me suis heurtee au probleme suivant: J ai un diagramm trace avec Excel et je voudrais un code VBA qui me permettra pour chaque point des Abscisse que je choisirais d avoir la valeur des ordonnees correspondantes.

C'est assez urgent svp

Merci d'avance pour votre precieuse aide
A voir également:

5 réponses

Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
26 août 2006 à 23:49
Un petit exemple. Dans Feuil1 j'ai mis :
      A   B

 1    0  18
 2    3  22
 3    6  27
 4    9  33
 5   12  42
 6   15  35
 7   18  24
 8   21  18
 9   24  11
10   27   7
Et cette macro en VBA :
Sub Intrapol()

  Dim Plage         As Range  ' plage des étiquettes des abscisses
  Dim Rang          As Long   ' pour renvoyer le rang de la valeur cherchée
  Dim Absc_Cherchée As Double ' valeur d'abscisse à rechercher
  Dim Absc_Trouvée  As Double ' valeur d'abscisse trouvée
  Dim Delta         As Double ' écart entre l'abscisse cherchée et l'abscisse connue inférieure la plus proche
  Dim Ordo_Inf      As Double ' ordonnée connue immédiatement inférieure à celle cherchée
  Dim Ordo_Sup      As Double ' ordonnée connue immédiatement supérieure à celle cherchée
  Dim Ecart_Absc    As Double ' écart entre les 2 abscisses encadrant la valeur cherchée
  Dim Ecart_Ordo    As Double ' écart entre les 2 ordonnées encadrant la valeur cherchée
  Dim Résultat      As Double ' résultat de la requête
  
  '=================
  Absc_Cherchée = 7          ' valeur d'abscisse à fournir
  '=================
  
  Set Plage = Worksheets("Feuil1").Range("A1:A10")
  Rang = Application.WorksheetFunction.Match(Absc_Cherchée, Plage, 1)
  Absc_Trouvée = Plage.Cells(Rang).Value
  If Absc_Trouvée = Absc_Cherchée Then
    MsgBox "Résultat : " & Plage.Cells(Rang).Offset(0, 1).Value
  Else
    Ecart_Absc = Plage.Cells(Rang + 1).Value - Absc_Trouvée
    Ordo_Inf = Plage.Cells(Rang).Offset(0, 1).Value
    Ordo_Sup = Plage.Cells(Rang + 1).Offset(0, 1).Value
    Ecart_Ordo = Ordo_Sup - Ordo_Inf
    Delta = Absc_Cherchée - Absc_Trouvée
    Résultat = Ordo_Inf + (Ecart_Ordo * (Delta / Ecart_Absc))
    MsgBox "Résultat : " & Résultat
  End If
  
End Sub
Le graphique donne une petite courbe. Bon.
Si tu demandes une valeur d'abscisse qui figure dans les abscisses connues (p. ex. la valeur 9 en A4), on donne immédiatement le résultat de l'ordonnée : 33.
Si maintenant tu demandes l'abscisse 11, qui ne figure pas, la macro calcule une valeur intermédiaire, en faisant une interpolation linéaire. Résultat ici : 39. C'est mieux que rien ?

Si ça te va, fais les adaptations nécessaires...
2
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
23 août 2006 à 08:29
Bonjour digit,

Ton diagramme fourni par Excel est sans doute un graphique construit à partir d'un tableau de valeurs stocké dans une feuille de calcul (ou éventuellement en table). A partir des séries de points ainsi définis, Excel les place et les relie pour former une courbe. Ça ne constitue en rien une équation.

A ma connaissance, tu ne peux pas obtenir une valeur pour un point de la courbe ne figurant pas dans le tableau (un point entre 2 étiquettes de l'axe des abscisses). Tu peux tenter une interpolation linéaire avec un calcul simple. Dans le meilleur des cas, ça restera approximatif.
0
digit Messages postés 4 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 20 septembre 2006
26 août 2006 à 14:56
Je te remercie de ta reponse Armojax, c est exactement cela mon graphik. Je sais que cela ne forme pas du tt une equation ou une courbe continue. Et je ne cherche pas non plus des ordonnees pr des abscisses quee je n ai pas du tout.

Je voudrais tout simplement un code VBA pr pouvoir obtenir une ordonnee a partir d une abscisse ke j aurais choisi moi meme, qui biensur viendra de l une des cellules de la colonne ou se trouvent ttes les valeurs des abcisses.

Ou serait il plus facile si je travaillais avec le tableau d excel. Je veux dire si je cherchais pr une cellule precise ke j appelle abscisse, la valeur de l ordonnee correspondante, cest a dire la valeur de la colonne suivante se trouvant sur la meme ligne que l abscisse que j aurai choisi.
Si oui comment?

Merci d'avance
0
digit Messages postés 4 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 20 septembre 2006
29 août 2006 à 07:49
Encore merci pour ton code que je trouve superbe.

Malheureusement il y'a une erreur lorsque je l'execute. Le message d erreur que je recois est le suivant:

Erreur de durée de validité "9" : Indice à l'extérieur du secteur valable et c est a la ligne du programme: "Set Plage = Worksheets("Feuil1").Range("A1:A10"). J 'ai voulu l'adapter a mon programme, cela n'a pas marche.J ai eu cette erreur.

J ai alors ouvert une nouvelle feuille où j ai ecrit presque les memes valeurs que les tiennes et j'ai biensur modifié le nom du fichier ou il le fallait ( a la place de feuill1).

Aurais tu une idee du probleme??

Je ne suis pas du ttout une experete en VBa je suis en train d'apprendre en écrivant mon programme, mais j'ai malheureusement pas assez de temps. Donc si tu as des liens web ou des noms de livres qui pourrait m'etre d une grande aide a cet effet, alors n'hesite pas stp à me les proposer.

Merci d avance et bonne journee a toi!
0
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
29 août 2006 à 08:51
Je n'arrive pas à provoquer ton erreur. Voici des points à vérifier :
- le nom de la feuille de calcul qui contient tes données
- la plage de cellules de tes étiquettes d'abscisses
- le type de données : j'ai défini les variables As Double pour des valeurs numériques. Si tes étiquettes sont des dates, par exemple, il faut adapter.
- les étiquettes d'abscisses sont supposées être en ordre croissant. Si elles sont en ordre décroissant, il faut mettre le dernier paramètre de WorksheetFunction.Match à -1 au lieu de 1.
- je prends les valeurs d'ordonnées dans la colonne B (colonne +1). Si ce n'est pas le cas, il faut adapter la deuxième valeur des Offset(Ligne, Colonne).

Après ça, je ne vois pas...
0
digit Messages postés 4 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 20 septembre 2006
20 sept. 2006 à 00:14
Salut armojax,

J ai finalement trouvé un livre sur VBA appliqué a Microsoft Office, il m'a beaucoup aide et je dirais mm que j ai presque fini mon programme. J ai encore 2 erreurs que je ne reussi pas du tout à corriger. C'est pour cela que je t'écris une fois de plus.

La première: Erreur d'exécution9:
Index hors du secteur de validite. Ceci s'affiche a cause d'un tableau/Array que j utilise: ErgVol(j) = Valvol les valeurs de j je les modifient a chaque fois que j'ai une nouvelle valeur de Valvol. J ai initialise la valeur de j ai debut du programme.

La 2ème:
Erreur d'exécution 8: Debordement. Les valeurs de Valvol sont recherches les unes apres les autres ds une feuille de calcul d excel mais sans avoir fini je recois tjrs cette erreur.

Mon programme il est a remettre la semaine prochaine et la j avaoue que je commence a avoir peur.

Aide moi je t'en prie
Merci d avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
slt Armojax

excellent le programme

moi je voudrais également faire une recherche sur les ordonnées, et s'il ne trouve pas, qu'il me fasse également une moyenne des valeurs
comment faire ??
0