Excel VBA : Gerer des données dans un tableau

  • Initiateur de la discussion Philpastaga
  • Date de début
P

Philpastaga

Guest
Bonjour à tout le forum,

"Quasi déséspéré, n'attendant plus grand chose de la vie souhaite se mettre dare dare à la programmation VBA pour faire des choses un peu plus développées sur Excel :=))))"

Avant de vous exposer mon problème, un grand bravo à ce site ! C'est toujours aussi impressionnant de voir un forum aussi fourni dans notre bonne vieille langue Française.


Mon problème :
Tableau

Dates Nbr_de_jour Taux Facteur
01/01/05 180 3,00% 0,99
01/04/05 270 3,45% 0,98
01/07/05 360 3,85% 0,97

Mon objectif serait de créer une fonction utilisant des données de ce tableau .
La Mafonction se sert d'une date saisie : exemple 25/03/05
Comment peut on écrire en VBA les instructions permettant de renvoyer les valeurs de la colonne "taux" par exemple, de la date juste avant et juste après de celle saisie dans la fonction (i.e : 25/03/05).
Le but est ensuite d'utiliser les valeurs "enregistrées" pour d'autres calculs ultérieurs que la MaFonction fera (en fait de l'interpolation pour être précis)

Merci d'avance aux ames volontaires de m'accorder un peu de temps. N'hésitez pas à me faire violence je finirais bien par comprendre qq chose à la programmation :=))))

Bonne soirée à tous
 
Y

yeahou

Guest
Bonjour Philpastaga, le Forum

pour qu'une fonction personnalisée prenne en compte plusieurs critères, il faut les passer en paramètres pour puvoir les utiliser. Comme un exemple est plus parlant:

function Fonc_Perso(val1 as integer ,val2 as integer, val3 as integer)as long
Fonc_Perso=(val1*3600)+(val2*60)+val3
end function

la fonction est précisée de type long car la valeur retournée peut excéder la valeur integer de 32767

mettons qu'en :
A1 tu as 2 qui représente des heures
A2 tu as 32 qui représente des minutes
A3 tu as 15 qui représente une secondes
si tu fais =fonc_perso(A1;A2;A3) en A4, A4 prendra la valeur du nombre de secondes total soit 9135

tu peux faire la même chose différemment sur les mêmes cellules en utilisant une plage de référence

function Fonc_Perso2(val1 as range)as long
Fonc_Perso2=(val1*3600)+(val1.offset(1,0)*60)+val1.offset(2,0)
end function
par contre cette fonction suppose que les valeurs minutes et secondes sont toujours positionnées de la même façon par rapport à heures.

tu peux également fire d'autres choses quasi impossibles avec les fonctions pré programmées d'excel:

function Fonc_Perso3(val1 as date)as long
if day(datevalue(val1))=25 and month(datevalue(val1))=12 then
msgbox "c'est noël!", vbinformation
end if
Fonc_Perso3=val1
end function

tu peux également utiliser des fonctions excel dans tes fonctions personnalisées pour faire des calculs complexes.

Voila, avec cela, tu devrais pouvoir commencer à utiliser des fonctions personnalisées.

Cordialement, A+
 
P

Philpastaga

Guest
Quelle rapidité !!!! ;=)

Merci beaucoup de ta réponse yehaou.
Je connaissais déja les qq bribes des fonctions citées.
Et effectivement bcq de choses peuvent se faire directement avec les fonctions classiques Excel. Le problème est que je voudrais standardiser un peu. Mes feuilles comportent des tonnes de calculs complexes que seules des fonctions VBA pourraient alleger et rendre un peu plus dynamiques.

Ma difficulté réside dans :

- définir une valeur d'entrée d'une fonction : Date0
- chercher cette valeur dans un tableau, ou du moins dans mon cas les deux valeurs Date-1 et Date1 qui encadrent cette valeur Date0
- renvoyer pour des calculs ultérieurs des données en rapport avec cette ou ces valeurs mais dans d'autres cellules (les valeurs, en ligne, de la colonne "Taux" dans mon exemple)

Je ne sais pas me balader dans un tableau en qq sortes.
Je commence péniblement à me faire à la rigueur des Dim et autres paramétrages mais après ...je patine.

J'ai mis en lien le petit fichier Excel si tu sais comment faire....

En tout cas encore merci de ta réponse et de ta célérité....


Bonne soirée
 

Pièces jointes

  • TestVBA.zip
    2.1 KB · Affichages: 64
Y

yeahou

Guest
Re bonjour Philpastaga, le Forum

voici ta fonction incluant un tableau vba pour tes taux. J'ai mis trois exemples d'utilisation différents.

amuse toi bien

A+
 

Pièces jointes

  • TestVBA_PhilPastaga.zip
    13.6 KB · Affichages: 111
P

Philpastaga

Guest
Un grand Bonjour à cet honorable forum

Un très grand merci yeahou, je suis en tain de travailler dessus et c'est très formateur.
La logique des définitions (telle valeur = telle autre, qd définir les arguments, passer d'un range à des values.....) est certes tjrs confuse pour moi mais je me rapproche du Saint Graal ;=) .

Encore merci de ta disponibilité ....
 
Y

yeahou

Guest
Re Bonjour Philpastaga, le Forum

Quelques explications complémentaires
Ta dernière question portant sur l'utilisation d'un tableau, alors j'ai incorporé un tableau vb. J'ai utilisé pour cela un variant, Tab_en_Cours.
Tab_en_Cours = Tab_Taux.Value, Tab_Taux étant un tableau de cellules.
J'aurai pu travailler de la même façon uniquement avec Tab_Taux mais il y a un avantage à travailler de cette façon. Le code est plus rapide avec un tableau vb qu'avec un tableau de cellule, hors la rapidité est importante pour une fonction. Pour les arguments, ils sont réduits au minimum et il est important de bien les spécifier pour les formules, celles ci pouvant être utilisées de nombreuses fois et augmentant d'autant l'espace mémoire necessaire si elles sont mal calibrées. J'ai séparé le calcul taux_journalier et taux prorata uniquement pour des facilités de lecture, on peut l'écrire en une seule ligne mais c'est moins lisible.
Taux_Prorata = ((DateValue(Date_Taux) - DateValue(Tab_en_Cours(Date_Anterieure, 1))) * (Tab_en_Cours(Date_Posterieure, 3) - Tab_en_Cours(Date_Anterieure, 3)) / (DateValue(Tab_en_Cours(Date_Posterieure, 1)) - DateValue(Tab_en_Cours(Date_Anterieure, 1)))) + Tab_en_Cours(Date_Anterieure, 3)
Je passe également toujours par des datevalue pour mes calculs de date même si cela surcharge un peu le code, cela me permet de récupérer toute date au même format d'ou qu'elle vienne et m'évite des bugs de formats.

Sur ce, A+
 

Statistiques des forums

Discussions
312 483
Messages
2 088 780
Membres
103 961
dernier inscrit
sarrent74