Réservations SNCF: additionner cellules si même train

Bonjour à tous,

Je réserve des billets de trains en nombre et cherche à additionner les montants de chaque réservations pour chaque trajets.

Voici une version light de mon tableau:

microsoft excel forum

Je cherche à ce qu'en L5 se trouve le cumul des "coûts total billets", en l’occurrence K3+K4+K5. Idem pour le cumul de K6+K7 en L7.

Comme j'ai beaucoup de trajets différents dans mon tableau, l'idée est de comparer les caractéristiques des trains. Lorsqu'un train à les mêmes que celui de la ligne précédente, il faut additionner les coût des 2 billets. Lorsqu'un train à les mêmes que les 2 des lignes précédentes, il faut additionner les coûts des 3 billets. Et ainsi de suite...

Ne m'y connaissant pas en script VBA, j'ai commencé par cherché avec les fonctions SI et SOMME.

Je n'ai pas réussi à utiliser la fonction SI pour comparer 2 plages de cellules complètes (par exemple A5:E5 et A4:E4).

J'ai donc décomposé la chose en comparant les cellules de 2 lignes une à une:

=SI(A5=A4;SI(B5=B4;SI(C5=C4;SI(D5=D4;SI(E5=E4;SOMME(K4;K5);K5)))))

Cela fonctionne... mais seulement pour les trajets où je n'ai que 2 réservations. Or, je peux en avoir jusqu'à 5.

Du coup, j'ai essayé de multiplier la chose par le nombre de lignes (j'ai été obligé au passage d'enregistrer mon fichier en XLSM car le nombre de SI devenait trop élevé pour être gêré en XLSX).

Pour cumuler 3 réservations différentes, cela m'a donné ceci:

=SI(A5=A3;SI(B5=B3;SI(C5=C3;SI(D5=D3;SI(E5=E3;SOMME(K3;K4;K5);SI(A5=A4;SI(B5=B4;SI(C5=C4;SI(D5=D4;SI(E5=E4;SOMME(K4;K5);K5))))))))))

Jusqu'ici, tout va bien !

Mais lorsque j'essaye d'en ajouter une 4ème qui diffère, j'obtiens pour résultat "FAUX" au lieu du calcul du cumul simple des 3 premières lignes. Voici ma formule:

=SI(A5=A2;SI(B5=B2;SI(C5=C2;SI(D5=D2;SI(E5=E2;SOMME(K2;K3;K4;K5);SI(A5=A3;SI(B5=B3;SI(C5=C3;SI(D5=D3;SI(E5=E3;SOMME(K3;K4;K5);SI(A5=A4;SI(B5=B4;SI(C5=C4;SI(D5=D4;SI(E5=E4;SOMME(K4;K5);K5)))))))))))))))

Auriez-vous une idée pour la rectifier ou pour arriver autrement à mes fins ?

Merci d'avance pour vos réponses.

36forum.xlsm (36.94 Ko)

Bonjour

Je ne suis pas sur d'avoir bien compris ta demande mais j'ai essayé avec un tableau croisé dynamique et cela semble répondre a ta question

Bonjour,

Sub Cumule()
'--- macro Claude pour Spip5 le 03/01/2012 ---
Dim Lg&, i&, x&
    Application.ScreenUpdating = False
    Lg = Range("A65536").End(xlUp).Row
    Range("L3:L" & Lg).ClearContents
    '--- tri colonnes date et N° train ---
    Range("a3:L" & Lg).Sort _
        Key1:=Range("a3"), Order1:=xlAscending, _
        Key2:=Range("e3"), Order2:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:= _
    False, Orientation:=xlTopToBottom
    '--- totalise coût N° train ---
    For i = 3 To Lg
        If Cells(i + 1, "e") = Cells(i, "e") Then
            x = i
            Do While Cells(x + 1, "e") = Cells(i, "e")
                x = x + 1
            Loop
            Cells(x, "L") = "=sum(k" & i & ":k" & x & ")"
            i = x
        End If
    Next i
End Sub

Amicalement

Claude

Re,

Merci mille fois à Claude pour son script parfait... ou presque

En effet, lorsque je me retrouve à avoir à une semaine d'intervalle le même train, le calcul se fausse:

2

Pour le tri par date qu'il propose puis par n° de train, lorsque le même train est répété à une semaine d'intervalle, il manque un résultat.

Une idée pour perfectionner la chose ?

Merci d'avance pour vos réponses.

17forum2.xlsm (12.15 Ko)

re,

Remplace le code par celui-ci

Sub Cumule()
'--- macro Claude pour Spip5 le 03/01/2012 ---
Dim Lg&, i&, x&
    Application.ScreenUpdating = False
    Lg = Range("A65536").End(xlUp).Row
    Range("L3:L" & Lg).ClearContents
    '--- tri colonnes date et N° train ---
    Range("a3:L" & Lg).Sort _
        Key1:=Range("a3"), Order1:=xlAscending, _
        Key2:=Range("e3"), Order2:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:= _
    False, Orientation:=xlTopToBottom
    '--- totalise coût N° train ---
    For i = 3 To Lg
            x = i
        If Cells(i + 1, "e") = Cells(i, "e") Then
            Do While Cells(x + 1, "e") = Cells(i, "e") And Cells(x + 1, "a") = Cells(i, "a")
                x = x + 1
            Loop
            Cells(x, "L") = "=sum(k" & i & ":k" & x & ")"
            i = x
        End If
    Next i
End Sub

Claude

Ô Claude tout plein de "mercis" et gloire à toi !

Enfin j'ai un premier outil pour travailler correctement.

A moi de faire de la saisi, désormais avec joie !

re,

Pour le même prix, on ajoute les bordures à la bonne place

à la prochaine

Claude

dubois a écrit :

Pour le même prix, on ajoute les bordures à la bonne place

Rooo, cômme c'est bô ! Re-merci Claude.

Depuis la semaine dernière à l'usage pour mon plus grand bonheur, la macro me semble toutefois perfectible.

Tout d'abord, j'ai ajouté des champs dans mon tableau depuis et ai modifié les colonnes auxquelles le script faisait référence. Le bon fichier est ci-joint.

Ensuite, il y a deux choses que je souhaiterai améliorer (cf. capture):

  • Les bordures automatiques, c'est une excellent idée. Ce serait encore mieux si la bordure inférieure tracée ne concernait pas que la case du total, mais toute la ligne sur laquelle apparait le coût total.
  • Lorsqu'il n'y a qu'une seule réservation pour un trajet donné, le champ du coût total (colonne T) reste vierge (exemple: ligne 13). Une idée pour le compléter automatiquement ?

Merci d'avance pour vos réponses.

3

Bonjour,

Envoie le fichier avec les colonnes ajoutées

çà sera + facile pour adapter la macro.

Amicalement

Claude

dubois a écrit :

Envoie le fichier avec les colonnes ajoutées

çà sera + facile pour adapter la macro.

Bonjour Claude,

Tu as raison, voici le tableau complet.

Par contre la macro reste dans le précédent fichier joint (j'ignore comme faire pour la lier directement au nouveau tableau).

++

Bonjour,

Attention, tu avais des lignes masquées !

Sub Cumule()
'--- macro Claude pour Spip5 le 03/01/2012 --- modifiée le 18/01/2012
Dim Lg&, i&, x&
    Application.ScreenUpdating = False
    Lg = Range("A65536").End(xlUp).Row
    Range("T3:T" & Lg).ClearContents
    '--- efface bordures ---
    With Range(Cells(3, "a"), Cells(Lg, "T"))
        .Borders(xlEdgeBottom).LineStyle = xlNone           'bas
        .Borders(xlInsideHorizontal).LineStyle = xlNone     'milieu
    End With
    '--- tri colonnes date et N° train ---
    Range("a3:T" & Lg).Sort _
        Key1:=Range("a3"), Order1:=xlAscending, _
        Key2:=Range("f3"), Order2:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:= _
    False, Orientation:=xlTopToBottom

    '--- totalise coût N° train ---
    For i = 3 To Lg
            x = i
        If Cells(i + 1, "f") = Cells(i, "f") Then
            Do While Cells(x + 1, "f") = Cells(i, "f") And Cells(x + 1, "a") = Cells(i, "a")
                x = x + 1
            Loop
            Cells(x, "T") = "=sum(p" & i & ":p" & x & ")"
            i = x
        Else
            Cells(x, "T") = Cells(x, "p")
        End If
            Range(Cells(x, "a"), Cells(x, "T")).Borders(xlEdgeBottom).Weight = xlMedium 'bordure bas
    Next i
End Sub

Bonne journée

Claude

Claude est grand, Claude est bô, Claude est fort !

Vive le roi Claudius et longue vie à lui !

Ta nouvelle macto est parfaite, belle, sexy, désirable et diablement sensuelle ! Serais-tu du même calibre ?

Et désolé pour les lignes masquées que j'avais oublié de remettre en place.

Bonjour à tous,

Suite (et j'espère fin) du fignolage de mon tableau.

A l'usage, je me rends compte qu'il y a quelques améliorations à y apporter, car sinon lorsque je communique avec mes collègues et la SNCF ils sont complètement perdus:

  • déplacement des colonnes "voitures" (de O en H) et "classe" (de N en I).
  • création de colonnes "nombre d'adultes" et "coût adultes" (en J et K).

Du coup, la macro est à adapter.

Voici ce que m'avait envoyé Claude:

Option Explicit

Sub Cumule()
'--- macro Claude pour Spip5 le 03/01/2012 --- modifiée le 18/01/2012
Dim Lg&, i&, x&
    Application.ScreenUpdating = False
    Lg = Range("A65536").End(xlUp).Row
    Range("T3:T" & Lg).ClearContents
    '--- efface bordures ---
    With Range(Cells(3, "a"), Cells(Lg, "T"))
        .Borders(xlEdgeBottom).LineStyle = xlNone           'bas
        .Borders(xlInsideHorizontal).LineStyle = xlNone     'milieu
    End With
    '--- tri colonnes date et N° train ---
    Range("a3:T" & Lg).Sort _
        Key1:=Range("a3"), Order1:=xlAscending, _
        Key2:=Range("f3"), Order2:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:= _
    False, Orientation:=xlTopToBottom

    '--- totalise coût N° train ---
    For i = 3 To Lg
            x = i
        If Cells(i + 1, "f") = Cells(i, "f") Then
            Do While Cells(x + 1, "f") = Cells(i, "f") And Cells(x + 1, "a") = Cells(i, "a")
                x = x + 1
            Loop
            Cells(x, "T") = "=sum(p" & i & ":p" & x & ")"
            i = x
        Else
            Cells(x, "T") = Cells(x, "p")
        End If
            Range(Cells(x, "a"), Cells(x, "T")).Borders(xlEdgeBottom).Weight = xlMedium 'bordure bas
    Next i
End Sub

J'ai essayé de l'adapter, voici ce que cela a donné:

Option Explicit

Sub Cumule()
'--- macro Claude pour Spip5 le 03/01/2012 --- modifiée le 18/01/2012
Dim Lg&, i&, x&
    Application.ScreenUpdating = False
    Lg = Range("A65536").End(xlUp).Row
    Range("V3:V" & Lg).ClearContents
    '--- efface bordures ---
    With Range(Cells(3, "a"), Cells(Lg, "V"))
        .Borders(xlEdgeBottom).LineStyle = xlNone           'bas
        .Borders(xlInsideHorizontal).LineStyle = xlNone     'milieu
    End With
    '--- tri colonnes date et N° train ---
    Range("a3:V" & Lg).Sort _
        Key1:=Range("a3"), Order1:=xlAscending, _
        Key2:=Range("f3"), Order2:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, MatchCase:= _
    False, Orientation:=xlTopToBottom

    '--- totalise coût N° train ---
    For k = 3 To Lg
            x = k
        If Cells(k + 1, "f") = Cells(k, "f") Then
            Do While Cells(x + 1, "f") = Cells(k, "f") And Cells(x + 1, "a") = Cells(k, "a")
                x = x + 1
            Loop
            Cells(x, "V") = "=sum(r" & k & ":r" & x & ")"
            k = x
        Else
            Cells(x, "V") = Cells(x, "r")
        End If
            Range(Cells(x, "a"), Cells(x, "V")).Borders(xlEdgeBottom).Weight = xlMedium 'bordure bas
    Next k
End Sub

Evidemment, ça n'a pas marché.

Une idée pour m'aider ?

Merci d'avance à ceux qui répondront.

Bonjour,

- déplacement des colonnes "voitures" (de O en H) et "classe" (de N en I).

- création de colonnes "nombre d'adultes" et "coût adultes" (en J et K).

Tu as renvoyer l'ancien fichier, envoie celui modifié,

on adaptera la macro

Claude

dubois a écrit :

Tu as renvoyer l'ancien fichier, envoie celui modifié,

on adaptera la macro

Bonjour Claude,

Voici !

22reservations.zip (28.60 Ko)

re,

tu t'es bien débrouillé, sauf que

tu as changer la boucle i en k

For k = 3 To Lg

il suffit de mettre en accord la déclaration de la variable

Sub Cumule()
'--- macro Claude pour Spip5 le 03/01/2012 --- modifiée le 28/02/2012
Dim Lg&, k&, x&

Claude

dubois a écrit :

tu t'es bien débrouillé, sauf que

tu as changer la boucle i en k

Arg, je croyais que cette ligne faisait référence à la colonne i, je n'avais pas vu que c'était une boucle.

Effectivement, maintenant ça marche nickel.

Je te suis décidément plus que redevable Claude, c'est quand tu veux via MP pour que je te paye un verre !

Rechercher des sujets similaires à "reservations sncf additionner meme train"