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
|
Option Explicit 'Oblige à déclarer les variables, réduit le risque d'erreur
Public Sub Test()
'Déclaration des variables
'On essaie d'utiliser des noms parlant pour s'y retrouver plus facilement
Dim montant As Double 'C'est un montant et pas une chaine de caractère
Dim devise As String
'Les variables de position et de mémoire
Dim devisePrecedente As String 'La dernière devise avant changement
Dim ligneActuelle As Integer 'La ligne en cours sur laquelle on va boucler
Dim ligneChangeDevise As Integer 'La première ligne du dernier changement de devise
'On déclare la feuille sur laquelle on travaille pour que ça ne plante pas si on lance
'la macro alors qu'on est sur une autre feuille
Dim ws As Worksheet
Set ws = Worksheets("Feuil1")
'Suppression des espaces blancs
ws.Range("A:A").Replace What:=" ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'Initialisation des variables
ligneActuelle = 1
'Décomposition de la première ligne, les variables montant et devise prennent la bonne valeur
DecomposeMontantDevise ws.Cells(ligneActuelle, 1).Value, montant, devise
ws.Cells(ligneActuelle, 2).Value = montant 'Remplissage du montant en colonne 2
ws.Cells(ligneActuelle, 3).Value = devise 'Remplissage de la devise en colonne 3
devisePrecedente = devise
ligneChangeDevise = 1 'On a notre première devise
ligneActuelle = ligneActuelle + 1 'passage à la ligne suivante
'Ensuite on continue tant qu'on n'a pas de cellule vide
Do While ws.Cells(ligneActuelle, 1).Value <> ""
'On récupère notre nouveau montant et nouvelle devise
DecomposeMontantDevise ws.Cells(ligneActuelle, 1).Value, montant, devise
ws.Cells(ligneActuelle, 2).Value = montant 'Remplissage du montant en colonne 2
ws.Cells(ligneActuelle, 3).Value = devise 'Remplissage de la devise en colonne 3
'Si il y a changement de devise
If devise <> devisePrecedente Then
'On insère les deux lignes blanches
ws.Rows(ligneActuelle).EntireRow.Insert
ws.Rows(ligneActuelle).EntireRow.Insert
'On insère la formule sur la première ligne blanche et la deuxième colonne
ws.Cells(ligneActuelle, 2).Formula = "=SUM(B" & ligneChangeDevise & ":B" & ligneActuelle - 1 & ")"
'On indique le changement de devise
ligneChangeDevise = ligneActuelle + 2 'on a ajouté deux lignes vide
devisePrecedente = devise
'On se place avant la nouvelle ligne
ligneActuelle = ligneActuelle + 2
End If
ligneActuelle = ligneActuelle + 1 'passage à la ligne suivante
Loop
'Dernière somme
ws.Cells(ligneActuelle, 2).Formula = "=SUM(B" & ligneChangeDevise & ":B" & ligneActuelle - 1 & ")"
'Ajout des décimales colonne B et autofit en largeur
ws.Range("B:B").NumberFormat = "#0.00"
ws.Columns("B:B").EntireColumn.AutoFit
End Sub
'C'est une tâche à part entière, il peut être intéressant d'en faire une procédure séparée
'montant et devise sont des paramètres par référence, ils vont donc être modifiés par cette procédure dans
'la procédure appelante
Private Sub DecomposeMontantDevise(ByVal texte As String, ByRef montant As Double, ByRef devise As String)
'Récupération du montant
montant = Val(Replace(Mid(texte, 4, Len(texte) - 3), ",", "."))
'Récupération de la devise
devise = Mid(texte, 1, 3)
End Sub |