Glisser les formules d'une ligne en faisant glisser les données de 4 lignes

1

Bonjour,

Le titre est un peu spécial, car mon problème l'est également.


J'ai tout d'abord un tableau de données, avec des clients (en gros). Dans ce tableau, 1 client vaut 4 lignes.

Dans mon tableau récapitulatif, 1 ligne vaut 1 client.

Le problème est que lorsque je veux glisser mes formules dans le tableau récapitulatif, je souhaiterais que la nouvelle ligne traite le client suivant, mais au lieu de ça, les formules glissent juste d'une ligne dans le tableau des données.


Exemple plus concret :

A1 récupère les données sur la plage de D1 à D4.

Lorsque je glisse A1 en A2, je souhaiterait que A2 récupère les données sur la plage de D5 à D8.

Lorsque je glisse A2 en A3, je souhaiterait que A3 récupère les données sur la plage de D9 à D12.

ETC...


La seule condition est de toucher le moins possible au tableau des données (ne pas beaucoup le modifier/trier manuellement etc).


Voilà le lien du document https://www.cjoint.com/c/LKClfASCDcH


Merci pour votre aide !

Acheread Posté le 28 novembre 2022, 12:08
par Acheread
Répondre
1

Bonjour Acheread,

ton fichier excel en retour : https://www.cjoint.com/c/LKCppverXS0

* à l'ouverture du fichier, tu es sur la 1ère feuille "Tableau récapitulatif".

* fais Ctrl e ➯ travail effectué.  :)

* ça aurait fait pareil si tu avais fait Ctrl e à partir de la 2ème feuille "Tableau de données".

* quand tu as besoin de réactualiser le tableau récapitulatif, refais Ctrl e ; mais c'est inutile
d'effacer avant les données de ce tableau : c'est fait automatiquement par la macro.

* ne cherche pas de formules : il n'y en n'a pas ; tout est fait par VBA.

* pour la 2ème feuille "Tableau de données" : aucune modification.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voici le code de Module1 :

Option Explicit: Option Base 1

Sub ETR() 'Etablir le Tableau Récapitulatif
  Application.ScreenUpdating = 0: Worksheets("Tableau de données").Select
  Dim m&, n&: m = Rows.Count: n = Cells(m, 1).End(3).Row: If n < 5 Then Exit Sub
  Dim T1, T2, k&: T1 = [A1].Resize(n, 9): k = n \ 4: ReDim T2(k, 8)
  Worksheets("Tableau récapitulatif").Select
  n = Cells(m, 1).End(3).Row: If n > 1 Then Range("A2:H" & n).Clear
  Dim s$, p As Byte, i&, j&
  For i = 1 To k
    n = (i - 1) * 4 + 1
    T2(i, 1) = T1(n, 1) 'NUMERO
    T2(i, 2) = T1(n, 5) & " " & T1(n, 6) 'NOM PRENOM
    s = T1(n, 8) 'ADRESSE
    T2(i, 3) = T1(n, 7) & IIf(s = "", "", " " & s) & " " & T1(n, 9)
    T2(i, 4) = T1(n, 2) 'CATEGORIE
    For j = n To n + 3
      s = T1(j, 3): s = Left$(s, 1) & Right$(s, 1)
      Select Case s
        Case "M1": p = 5 'MOIS 1
        Case "N1": p = 6 'Nb p1
        Case "M2": p = 7 'MOIS 2
        Case "N2": p = 8 'Nb p2
      End Select
      T2(i, p) = T1(j, 4)
    Next j
  Next i
  [A2].Resize(k, 8) = T2
  With [A2].Resize(k)
    .NumberFormat = "00000": .HorizontalAlignment = 4: .IndentLevel = 2
    With .Resize(, 8)
      .Interior.Color = 15921906 'gris clair
      For i = 7 To 11
        If i <> 8 Then .Borders(i).LineStyle = 1
      Next i
      .Borders(12).LineStyle = 3
    End With
  End With
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis.  :)

rhodo

rhodo Posté le 28 novembre 2022, 15:35
par rhodo
  • Ah oui, c'est très fort ! Merci beaucoup pour cette réponse détaillée ! Tout devrait être bon, j'ai pu faire plusieurs tests qui fonctionnent parfaitement. Ce fut un réel plaisir, après plusieurs jours de galère inutiles x) Acheread :D – Acheread 28 novembre 2022, 16:24
0

@Acheread

on s'est croisés ; j'ai vu ta réponse ; merci pour ton retour.  :)

attention : j'ai modifié le fichier de mon post précédent ➯ à re-télécharger !

j'ai fait 2 améliorations pour la 1ère feuille "Tableau récapitulatif" :

* amélioration pour l'adresse : avant, il y avait 2 espaces après le n°
quand il n'y avait pas de « bis » ; maintenant, il y a un seul espace
après le n°, avec ou sans « bis ».

* autre amélioration : fais Ctrl F2 pour un aperçu avant impression ;
avant, ça tenait en largeur sur 2 pages ; maintenant, ça tient en
largeur
sur une seule page ➯ c'est prêt à être imprimé.

rhodo

rhodo Posté le 28 novembre 2022, 16:32
par rhodo
  • La vache, il y a du niveau et du travail ! Il faudrait que je me penche dans cette histoire de macro et VBa, ça a l'air super utile :D Merci beaucoup <3 Achererad – Acheread 28 novembre 2022, 16:35
0

@Acheread

merci aussi pour ta 2ème réponse ; bonne chance
pour ton apprentissage du VBA !  :)

rhodo

rhodo Posté le 28 novembre 2022, 16:40
par rhodo
  • @rhodo
    Bonjour, je n'arrive pas à trouver la réponse alors je reviens vers toi : Pourrais-tu m'expliquer ce que je doit changer au VBA que tu m'as fait pour supprimer des infos nécessaire ? (genre je veux supprimer la colonne "NUMERO" et "CATEGORIE) Merci pour ta réponse ! Acheread – Acheread 7 décembre 2022, 16:35
0

Bonjour Acheread,

désolé pour le très gros retard ; c'est juste que je viens de voir ton commentaire du
7 décembre qui est ci-dessus ; remarque : dans la liste des sujets, le nombre de
réponses augmente de 1 pour chaque nouvelle réponse, mais note qu'il n'y a pas
de compteur pour les commentaires ; on ne peut donc pas se rendre compte qu'il
y a un nouveau commentaire ; c'est pourquoi tu aurais mieux fait d'ajouter un post
en tant que réponse plutôt qu'en commentaire.

cependant, après une longue période depuis ma dernière intervention sur ton sujet,
je ne regarde plus le nombre de réponses dans la liste des sujets ; c'est par hasard
que j'ai de nouveau regardé ce présent sujet et vu ton commentaire ; aussi, dans
un tel cas où une longue période s'est écoulée, ce sera mieux (pour une prochaine
fois)
, de créer un nouveau sujet pour relancer (en notant une référence à l'ancien
sujet, avec la date de cet ancien sujet)
.

----------------------------------------------------------------------------------------------------------------

voici le nouveau fichier : https://www.cjoint.com/c/LLoh2JdL4R0

* à l'ouverture du fichier, tu es sur la 1ère feuille "Tableau récapitulatif".

* il y a en moins ces 2 colonnes : "NUMERO" et "CATEGORIE"
➯ 6 colonnes en tout, de A à F.

* fais Ctrl e ➯ travail effectué ; fais Ctrl F2 ➯ aperçu avant impression ;
j'ai remis un zoom de 100 % et ça tient en largeur sur une seule page.

* ça aurait fait pareil si tu avais fait Ctrl e à partir de la 2ème feuille
"Tableau de données".

* quand tu as besoin de réactualiser le tableau récapitulatif, refais Ctrl e ;
mais c'est inutile d'effacer avant les données de ce tableau : c'est fait
automatiquement par la macro.

* pour la 2ème feuille "Tableau de données" : aucune modification ;
donc sur cette feuille, il y a toujours la colonne A des numéros et
la colonne B des catégories.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dans le précédent code VBA, il y avait : n = (i - 1) * 4 + 1

j'avais oublié de l'optimiser ; en effet, si on développe, ça fait :

n = 4 * i - 4 + 1 = 4 * i - 3

donc juste sous l'instruction For i = 1 To k il y a maintenant :

n = 4 * i - 3

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dans le précédent code VBA, j'avais fait ceci pour l'adresse :

s = T1(n, 8) 'ADRESSE
T2(i, 3) = T1(n, 7) & IIf(s = "", "", " " & s) & " " & T1(n, 9)

mais finalement, c'est mieux de le faire ainsi :

s = T1(n, 7): If T1(n, 8) <> "" Then s = s & " " & T1(n, 8)
T2(i, 2) = s & " " & T1(n, 9)

le résultat sera identique, avec un seul espace après le numéro,
et s'il y a par exemple "Bis", un seul espace après ce "Bis".

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voici le code VBA complet de Module1 (35 lignes) :

Option Explicit: Option Base 1

Sub ETR() 'Etablir le Tableau Récapitulatif
  Application.ScreenUpdating = 0: Worksheets("Tableau de données").Select
  Dim m&, n&: m = Rows.Count: n = Cells(m, 1).End(3).Row: If n < 5 Then Exit Sub
  Dim T1, T2, k&: T1 = [A1].Resize(n, 9): k = n \ 4: ReDim T2(k, 6)
  Worksheets("Tableau récapitulatif").Select
  n = Cells(m, 1).End(3).Row: If n > 1 Then Range("A2:F" & n).Clear
  Dim s$, p As Byte, i&, j&
  For i = 1 To k
    n = 4 * i - 3
    T2(i, 1) = T1(n, 5) & " " & T1(n, 6) 'NOM PRENOM
    s = T1(n, 7): If T1(n, 8) <> "" Then s = s & " " & T1(n, 8)
    T2(i, 2) = s & " " & T1(n, 9)
    For j = n To n + 3
      s = T1(j, 3): s = Left$(s, 1) & Right$(s, 1)
      Select Case s
        Case "M1": p = 3 'MOIS 1
        Case "N1": p = 4 'Nb p1
        Case "M2": p = 5 'MOIS 2
        Case "N2": p = 6 'Nb p2
      End Select
      T2(i, p) = T1(j, 4)
    Next j
  Next i
  [A2].Resize(k, 6) = T2
  With [A2].Resize(k, 6)
    .Interior.Color = 15921906 'gris clair
    For i = 7 To 11
      If i <> 8 Then .Borders(i).LineStyle = 1
    Next i
    .Borders(12).LineStyle = 3
  End With
End Sub

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

je te laisse comparer les 2 codes VBA pour voir toutes les différences ;
bonne lecture ! au cas où tu as besoin d'une autre modif, n'hésite pas
à me demander.  :)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dans le post qui suit, j'ai proposé une autre version,
qui comporte une nouvelle optimisation.

rhodo

rhodo Posté le 14 décembre 2022, 09:35
par rhodo
0

Bonsoir Acheread,

Lis d'abord mon post précédent de 09:35.

ce post est à propos du tableau de la feuille "Tableau de données" ; pour
le charger en mémoire, il y a cette instruction : T1 = [A1].Resize(n, 9)

ça charge le tableau en entier, et c'était nécessaire pour lire entre autres
le numéro et la catégorie (2 premières colonnes A et B) ; or maintenant que
tu veux un tableau résultat sans numéro ni catégorie, ce n'est plus la peine
de charger en mémoire toutes les données des 2 premières colonnes
A et B
: on peut charger le tableau de données à partir de la 3ème colonne
C
 ➯ gros gain de place en mémoire RAM ; d'où cette nouvelle instruction :
T1 = [C1].Resize(n, 7) ; ainsi, au lieu de charger en mémoire l'intégralité du
tableau, on le charge partiellement : 7 colonnes au lieu de 9 (mais bien sûr
toutes les lignes)
; le tableau de la 2ème feuille reste inchangé, avec ses
9 colonnes, et on a en mémoire uniquement les données nécessaires.

évidemment, suite à la nouvelle instruction T1 = [C1].Resize(n, 7) : dans toute
la suite du code VBA, il a fallu adapter en conséquence le numéro de colonne
du tableau T1() : -2 à chaque fois ; d'où la modif de ces quelques instructions :

T2(i, 1) = T1(n, 3) & " " & T1(n, 4) 'NOM PRENOM
s = T1(n, 5): If T1(n, 6) <> "" Then s = s & " " & T1(n, 6)
T2(i, 2) = s & " " & T1(n, 7)

plus bas : s = T1(j, 1): s = Left$(s, 1) & Right$(s, 1)
et aussi : T2(i, p) = T1(j, 2)

note bien qu'il n'y a aucun changement pour les indices du tableau T2().

nouveau fichier : https://www.cjoint.com/c/LLotxpMs0g0

même si on a une RAM de par exemple 8 Go (mémoire vive), c'est quand
même mieux d'éviter de gâcher inutilement de la place en RAM pour des
données qui ne vont pas servir.  ;)

(à part ça, y'a rien d'autre de changé ; utilisation et résultat identiques)

rhodo

rhodo Posté le 14 décembre 2022, 20:33
par rhodo

Si vous n'êtes pas inscrit sur le site, vous pouvez poster librement (en tant qu'invité).
Pour cela, indiquez un pseudonyme (nom d'utilisateur) et une adresse email :