2 macros excel [Résolu]

Signaler
Messages postés
3
Date d'inscription
dimanche 18 novembre 2007
Statut
Membre
Dernière intervention
24 août 2008
-
cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour tout le monde,

je suis nouveau ici, et comme je débute en vba, je me pose quelques questions. En effet, pour améliorer mon quotidien de stage, j'aimerais améliorer 2-3 fichiers excel.

 Par exemple, dans le premier, on récupère d'une autre appli des séries
de données pour calculer des taux de rendements (cad qu'il fait
(xt/xt-1)-1 avec xt-1 la valeur à la date t-1). Le problème, c'est
qu'il arrive parfois que des données manquent (pour un jour donné), et
donc ce qui empêche de calculer un taux de rendement et on obtient un
joli "N/A" dans la case.

Dans ce cas, on rajoute (à la main) un "-1" à toutes les formules qui
posent problème, pour lui dire d'aller chercher la valeur du jour
d'avant (et donc, aussi la valeur en t-2). Le problème c'est qu'il faut
faire ça pour chaque cas qui pose problème. Et pire, la fois d'après,
il faut enlever les "-1" pour voir s'il trouve des valeurs.

Bref, c'est la merdouille.

Donc, ce que j'aimerais faire, c'est créer une formule, voire une
macro, pour lui dire d'aller chercher la valeur de la date en question,
et si le résultat du calcul donne "N/A", de prendre la date j-1; si ça
donne encore rien, prendre j-2, puis j-3.

J'avais pensé à faire une macro VBA à base d'une boucle For i=0, 3...

mais vu comment le fichier est foutu, je me demande si ça ne serait pas
plus facile de faire une formule que j'étirerai dans toutes les
cellules concernées.
 

En gros, à chaque fois qu'on lance la macro (en ayant précisé un
champ de dates), Excel va chercher dans Bloomberg des valeurs qu'il
stocke ensuite dans une worksheet; dans la worksheet principal, on lui
demande de calculer des taux de rendements journaliers, hebdomadaires,
mensuels, annuels...

Donc, si par exemple, dans bloomberg il n'y a pas le prix le
17/11/2007, il ressort "N/A history" ce qui empêche de calculer les
rendements hebdomadaire entre le 17 et le 10 par exemple. Donc, je mets
un "-1" quelquepart dans la formule, pour qu'il calcule entre le 16 et le 9 par
exemple.

Comme il y a déjà les formules dans chaque case, je me dis
qu'il faudrait juste rajouter un truc du genre IF (Value= "N/A History";...) avec la même formule que déjà inscrite avec un -1 en plus.  Mais ça doit donner une référence circulaire non?
Une analogie qui se rapprocherait de ce que je voudrais faire je pense, serait une formule disant de faire le ratio des cellules A1 et B1 (par exemple), et si le résultat est #DIV/0!, faire A1/(B1+0.01). (je sais pas si c'est plus clair comme ça en fait...)


Des idées?

2. Pour le 2ème problème, je voulais faire une macro qui enlève les
doublons; en gros, je veux qu'elle regarde une liste de noms (par
colonne) et d'enlever tous les doublons, mais, en vérifiant quand même
la case qui est à droite qui contient des chiffres. Si le nom et le
numéro correspondent, j'aimerais qu'il efface les doublons,
triplets...(efface toute la ligne)

J'ai fait un ptit bout de code:


<!-- BEGIN TEMPLATE: bbcode_code -->




Code :



<!--[if !IE]><-->

<!---->
<!--[endif]-->
<!--[if IE]>
<![endif]-->
 
Code :
 
1. Dim Number_Columns AsDouble
2. Dim concat_i, concat_j AsVariant
3. Sub Remove_doublons()
4. Number_Columns = Range(Selection, Selection.End(xlDown)).Count
5.
6. For i = 1To Number_Columns
7. For j = i + 1To Number_Columns
8.
9. concat_i = Cells(i, 1).Value & Cells(i, 2).Value
10. concat_j = Cells(j, 1).Value & Cells(j, 2).Value
11.
12. If concat_i = concat_j Then Rows(j).Delete
13.
14. Next j
15. Next i
16. EndSub
 
 





<!-- END TEMPLATE: bbcode_code -->
ça marche, mais comme je calcule en
fait pleins de fois les mêmes chose (je concatène chaque ligne i fois
en fait...) , je me dis qu'il y a peut être plus efficient.


Merci

3 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
16
Salut et bienvenue à bord,

1- Ta formule pourrait être modifiée s'il n'y a pas trop de possibilités (2-3, disons). Autrement, tu risques de dépasser la capacité de longueur d'une formule. Il faudrait alors passer par une Fonction Personnalisée ou une macro.
ex:
=SI(ESTERREUR(Maformule); MaFormule-1; MaFormule)
ou
=SI(ESTERREUR(Maformule); SI(ESTERREUR(Maformule1); MaFormule-2; MaFormule-1; MaFormule)

2- Ce serait plus rapide si tu uilisais une simple boucle.
Aussi, pour effacer des lignes, il est toujours préférable de commencer par la fin
Disons que tu as des noms en A et des nombres en B, voici une méthode qui devrait fonctionner.

Fin = Cells(Rows.Count, "A").End(xlUp).Row
For i = Fin to 2 Step - 1
    If Range("A" & i) = Range("A" & i -1) And _
        Range("B" & i) = Range("B" & i -1) Then
       
        Rows(i - 1).Delete
    End if
Next

MPi²
Messages postés
3
Date d'inscription
dimanche 18 novembre 2007
Statut
Membre
Dernière intervention
24 août 2008

Hello,

merci de ta réponse. Pour le premier point, tu m'as donné une bonne idée, je regarderai ça demain. Mais je pense que ça va être juste étant donné que la formule est déjà grande, vu que je crois que c'est une recherchev qui est faite dans Bloomberg. Donc si je dois recopier la formule 3 fois dans la même case, c'est pas gagné!

Pour le 2ème problème, je comprends pas trop ton code. J'ai essayé et ça marche pas...j'imagine qu'il doit manquer quelquechose.
C'est quoi "2 Step -1"? Je comprends pas ce que ça vient faire là. D'autre part, je dois me montrer, mais j'ai l'impression que tu ne compares les lignes que 2 à 2, cad ligne i et i-1 non?
Alors que moi j'ai besoin de comparer toute les lignes.
Désolé pour ces remarques/questions de newbie, mais j'ai encore du mal
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
16
Fin = la dernière ligne de la colonne A
Donc, la boucle part de la dernière ligne (Fin) et remonte (Step -1) vers la deuxième ligne (2)
Ce que j'ai omis de dire, c'est qu'il faudrait trier ta grille auparavant pour que les données à vérifier soient les unes à la suite des autres.
C'est la façon la plus simple, à mon avis, d'enlever les doublons.

MPi²