1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| Option Explicit
Sub test()
Dim SERIE As String, version As String, TERM As String, nom As String
Dim val As Variant 'Double 'On fera directement l'arrondi
Dim MaCell As Range, FindCell As Range, SortCell As Range
Dim NomRes
Dim FeuilRes As Worksheet
Dim OffsetTerm As Integer
'On boucle sur les 3 feuilles
For Each NomRes In Array("a", "f", "b")
'On pointe la feuille
Set FeuilRes = ThisWorkbook.Sheets("res_" & NomRes)
'On vide les données éventuelle contenues dans le tableau
'on verifie la présence de ces valeurs
If FeuilRes.Range("A2").value <> "" Then
'On a au moins une ligne
FeuilRes.Range("A2", FeuilRes.Cells(Rows.count, "A").End(xlUp).Offset(0, 6)).ClearContents
'Pour plus d'info sur cette ligne, voir plus bas dans le code
End If
'On pointe la cellule qui contient les données
Set MaCell = ThisWorkbook.Sheets("feuil1").Range("A2")
While MaCell.value <> ""
'Ici on regarde si la cellule correspond au nom que l'on recherche
If MaCell.value = NomRes Then
SERIE = MaCell.Offset(0, 1).value
version = MaCell.Offset(0, 2).value
TERM = MaCell.Offset(0, 3).value
'On calcul directement la valeur arrondi
val = Int(CSng(MaCell.Offset(0, 4).value) * 10000)
'On n'affiche pas de valeur 0
If CInt(val) = 0 Then val = ""
'Avant d'inscrire des donnée, il faut chercher si la seri existe déjà
'Pour cela on fait une recherche dans la colonne B
Set FindCell = FeuilRes.Columns("B").Find(SERIE, , xlValues)
'On regarde si on a trouver quelque chose
If FindCell Is Nothing Then
'La serie n'existe pas
'On crée la ligne
'On cherche la derniere cellule vierge de la colonne A et on la pointe avec notre variable Range
Set FindCell = FeuilRes.Cells(Rows.count, "A").End(xlUp).Offset(1)
'On renseigne les infos nom et serie
FindCell.value = NomRes
'On pointe la colonne suivante (Serie)
Set FindCell = FindCell.Offset(0, 1)
FindCell.value = SERIE
End If
'A partir d'ici, soit la ligne etait existante, soit on vient de créer une nouvelle ligne.
'Dans les 2 cas notre variable FindCell pointe bien la ligne contenant le nom et la serie recherchés
'On rajoute les données
'On regarde dans quelle colonne les données seront placées
Select Case TERM
Case "3Y"
OffsetTerm = 2
Case "5Y"
OffsetTerm = 3
Case "7Y"
OffsetTerm = 4
Case Else
OffsetTerm = 5
End Select
'Ici il faudra verifier la version
If FindCell.Offset(0, 1).value > version Then
'La version existante dans le tableau est superieur, on n'inscrit rien
ElseIf FindCell.Offset(0, 1).value < version Then
'version inferieur, on met a jour la version et on suprime les données existantes appartenant à une version plus ancienne
FindCell.Offset(0, 1).value = version
FindCell.Offset(0, 2).Resize(1, 4).value = ""
FindCell.Offset(0, OffsetTerm).value = val
Else
'Si le numero de version est le meme, on rajoute juste les données
FindCell.Offset(0, OffsetTerm).value = val
End If
'
End If
'On pointe la ligne suivante
Set MaCell = MaCell.Offset(1, 0)
Wend
'Le tri doit s'effectuer ici
'Le tri sur la colonne version est à mon avis inutile puisque l'on ne garde que le numero de version le plus haut pour un numero de serie donné
'On verifie que l'on a bien des données dans le tableau
If FeuilRes.Range("A2").value <> "" Then
'On pointe la zone qui sera à trier
Set SortCell = FeuilRes.Range("A1", FeuilRes.Cells(Rows.count, "A").End(xlUp).Offset(0, 6))
'J'ai vu que tu avais utilisé cette écriture mais si besoin en voila son explication
'Ici on va chercher le tableau qui commence à la cellule A1
'On part de la derniere cellule de la colonne A (rows.count representant le nombre de ligne de notre feuille)
'On remonte jusqu'a la derniere cellule non vide, c'est le role de End(xlup)
'Puis on se décale de 6 colonnes pour pointer la colonne G
'On utilise la colonne A pour déterminer le nombre de ligne de notre tableau car cette colonne est toujours renseigné
FeuilRes.Sort.SortFields.Clear
'ici on veux faire le tri uniquement sur la colonne B
'On va donc pointer sur une seul colonne par rapport à notre tableau
FeuilRes.Sort.SortFields.Add Key:=SortCell.Resize(, 1).Offset(0, 1) _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
'Resize modifie le pointage sur une seule colonne (il prend la 1er du tableau global (donc colonne A pour nous),
'on se décale donc d'une colonne pour pointer la colonne B
With FeuilRes.Sort
.SetRange SortCell
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
'On passe à la feuille suivante
Next
' Order by descending
' Call tri
MsgBox (" Fin de l'execution ")
End Sub |
Partager