Tableau vba

Signaler
Messages postés
1
Date d'inscription
vendredi 4 novembre 2011
Statut
Membre
Dernière intervention
4 novembre 2011
-
Messages postés
14833
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
-
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

[code=vb]
/code

1 réponse

Messages postés
14833
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
157
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