katypati
Messages postés1Date d'inscriptionvendredi 4 novembre 2011StatutMembreDernière intervention 4 novembre 2011
-
4 nov. 2011 à 00:41
NHenry
Messages postés15092Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 9 décembre 2023
-
5 nov. 2011 à 00:24
bonjour
je suis débutante en VBA et j'ai un petit problème de code.
mon objectif est de créer à partir des informations de la "feuil1", 3 onglets qui contiennent chacun une partie des informations de la "feuil1" mais présenté autrement.
je m'explique:
dans la feuil1 j'ai un tableau qui comprends plusieurs champs mais je m'intéresse seulement à 5 champs qui sont:
- name (on a plusieurs name différents)
- seri
- version
- term
- et percentB
à partir de ce tableau je dois extraire 3 tables pour 3 "names" différents ( a, b et f par exemple). Pour chaque table je ne conserve pour chaque "seri" que les lignes avec la "version" la plus récente. De plus, j'aimerai que les lignes avec la même "seri" et la même "version" soit concatenées pour ne donner qu'une seule ligne contenant les valeurs des autres champs (les champs 3Y, 5Y, 7Y et 10Y).
Mon code est ci-dessous. Le problème est que j'obtiens plusieurs lignes. à chaque qu'une cellule est renseigné mon pointeur se déplace a la ligne suivante. Du coup j'ai plus de lignes qu'il ne m'en faut.
Option Explicit
Sub test()
Dim SERIE, version, TERM, nom As String
Dim val As Double
Sheets("res_a").Select
Range("A1").Select
Sheets("feuil1").Select
Range("a1").Select
While ActiveCell.value <> ""
If ActiveCell.value = "a" Then
nom = ActiveCell.value
SERIE = ActiveCell.Offset(0, 1).value
version = ActiveCell.Offset(0, 2).value
TERM = ActiveCell.Offset(0, 3).value
val = ActiveCell.Offset(0, 4).value
Sheets("res_a").Select
ActiveCell.Offset(1, 0).Select
ActiveCell.value = nom
ActiveCell.Offset(0, 1).value = SERIE
ActiveCell.Offset(0, 2).value = version
If TERM = "3Y" Then
ActiveCell.Offset(0, 3) = val * 10000
ElseIf TERM = "5Y" Then
ActiveCell.Offset(0, 4) = val * 10000
ElseIf TERM = "7Y" Then
ActiveCell.Offset(0, 5) = val * 10000
Else
ActiveCell.Offset(0, 6) = val * 10000
End If
End If
Sheets("feuil1").Select
ActiveCell.Offset(1, 0).Select
Wend
' Order by descending
' Call tri
MsgBox (" Fin de l'execution ")
End Sub
Name Series Version Term percentB
b 7 1 3Y
b 7 1 10Y 1.64%
a 7 1 7Y 1.30%
a 7 1 10Y 1.63%
c 7 1 5Y 0.64%
c 7 1 10Y 1.40%
f 7 1 10Y 4.43%
f 7 2 5Y 4.99%
f 7 2 10Y 4.43%
b 11 1 3Y 0.66%
b 11 1 5Y 1.14%
b 11 1 7Y 1.47%
b 11 1 10Y 1.68%
f 11 1 3Y 5.14%
f 11 1 5Y 4.09%
f 11 1 7Y 4.32%
f 11 1 10Y 4.36%
a 11 1 3Y 0.81%
a 11 1 5Y 1.11%
a 11 1 7Y 1.36%
a 11 1 10Y 1.53%
a 7 2 3Y
a 7 2 5Y 0.96%
a 7 2 7Y 1.30%
a 7 2 10Y 1.63%
c 7 2 5Y 0.64%
c 7 2 10Y 1.40%
b 7 2 3Y
b 7 2 10Y 1.64%
f 11 2 3Y 5.14%
f 11 2 5Y 4.09%
f 11 2 7Y 4.32%
f 11 2 10Y 4.36%
f 7 3 5Y 4.99%
f 7 3 10Y 4.43%
f 7 4 5Y 4.99%
f 7 4 10Y 4.43%
f 7 5 5Y 4.99%
f 7 5 10Y 4.43%
b 15 1 3Y 1.66%
b 15 1 5Y 1.97%
b 15 1 7Y 2.11%
b 15 1 10Y 2.20%
a 15 1 3Y 1.03%
a 15 1 5Y 1.31%
a 15 1 7Y 1.45%
a 15 1 10Y 1.55%
f 15 1 3Y 3.66%
f 15 1 5Y 4.60%
f 15 1 7Y 4.92%
f 15 1 10Y 5.02%
resultat souhaité
onglet: res_a
name seri Version 3Y 5Y 7Y 10Y
a 15 1 103 31 145 155
a 11 1 81 111 136 153
a 7 2 96 130 163
resulta obtenue:
name seri Version 3Y 5Y 7Y 10Y
a 7 1 130
a 7 1 163
a 11 1 81
a 11 1 111.2375201
a 11 1 136.0920773
a 11 1 152.9323278
a 7 2 0
a 7 2 96.26005998
a 7 2 130.3477709
a 7 2 162.8249332
a 15 1 103.2113366
a 15 1 130.5606504
a 15 1 144.9299307
a 15 1 154.5115675
NHenry
Messages postés15092Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 9 décembre 2023158 5 nov. 2011 à 00:24
Bonjour,
Pour le code, utilises la coloration syntaxique, car ton code est illisible.
Sinon, à la place des .Select et ActiveCell & co, préfère utiliser directement les cellules :
Range("A1").Value 'Valeur de la cellule A1 de la feuille active
Pareil pour Offset
Range("...").Offset(y,x). ...
Sinon, si tu dois utiliser des nombres, tu peux aussi utiliser Cells :
Cells(1,1) 'A1
Cells(2,1) 'B1
En somme, refais un peu ton code, et éclaircis ton problème, car ton message est trop touffu, pour cela, tu peux t'aider du point 1 de ma signature.
---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list ---
Mon site