XL 2019 Transformer des lignes de codes pour pratiquer Tablo à 4 colonnes et 40 lignes

  • Initiateur de la discussion Initiateur de la discussion Webperegrino
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Webperegrino

XLDnaute Impliqué
Supporter XLD
Rien d'urgent et ... dans la continuité de la discussion 'https://excel-downloads.com/threads...pave-de-cellules-contenant-des-vblf.20087184/'

Bonsoir Le Forum,
J’en appelle aux spécialistes des Tableaux à 4 dimensions d(40,4), comme l’a fait Job75 dans le vba ci-joint dans le fichier (que je remercie encore car c'est une formulation redoutable par sa rapidité).
Je cherche justement par ce procédé à améliorer mes lignes de codes dans le module 1 et dans la Feuille FICHPOSINDIV.

Mon problème :
La macro fonctionne déjà bien comme cela : elle extrait des données en cellules jaunes la Feuille PANORAMIQUE.
Ces cellules peuvent éventuellement être au nombre de 10 x 82 = 820 si toutes jaunes et contenant donc des données à analyser.
Le placement final de la macro s’affiche sous conditions en une fiche individualisée, après le choix en [B4] de FICHPOSTINDIV du prénom à rechercher dans PANORAMIQUE.

Au milieu du Module 1, j’ai un « For...Next » qui pourrait être traité avec tablo(40,4))...(tableau à 40 lignes et 4 colonnes) à la façon de lignes rédigées par Job75 plus bas dans la macro...
La durée serait que la macro serait certainement réduite ... mais je ne sais pas faire avec 4 variables ; je m'y perds même en essayant de comprendre les astuces de Monsieur Boisgontier sur son site que lui et sa famille ont bien voulu nous laisser disponible.
Donc si vous pouviez m’aider dans les lignes suivantes, ce serait grandiose pour moi.
Merci
Webperegrino

VB:
For lg = 28 To 37
   For col = 7 To 88
      If PAN.Cells(lg, col) <> "" Then '------- une case occupée de PAN
            lgd = Ri.Range("C" & Rows.Count).End(3).Row + 1
            If lgd < 9 Then lgd = 9
            If PAN.Cells(lg, col) Like "*" & Ri.[B4] & "*" Then 'traitement de cases contenant le caissier Ri.[B4]
            Ri.[I13] = 1
            Ri.Cells(lgd, 2) = PAN.Cells(lg, 5) '----- le jour
            If lgd = 9 Then nbP = nbP + 1 'NOMBRE DE JOURS EN POSTE
            If lgd > 9 And Ri.Cells(lgd, 2) <> Ri.Cells(lgd - 1, 2) Then nbP = nbP + 1
            Ri.Cells(lgd, 3) = PAN.Cells(165, col)
            Ri.Cells(lgd, 3).Interior.Color = PAN.Cells(165, col).Interior.Color 'mise en coloration
            Ri.Cells(lgd, 3).Font.ColorIndex = PAN.Cells(165, col).Font.ColorIndex
            Ri.Cells(lgd, 3).Font.Bold = True 'False
            Ri.Cells(lgd, 4) = PAN.Cells(lg, col)
            Ri.Cells(lgd, 5) = PAN.Cells(166, col)
            Ri.Cells(lgd, 36) = PAN.Cells(5, col)
      End If
      End If
   Next col
Next lg
 

Pièces jointes

@Webperegrino, concernant #30
* j'essaie que mes macros fonctionnent toujours indépendant de la feuille active. Le bouton pour cette macro se trouve dans la feuille "BDD", donc, [Q9].ClearContents >>>>> sh.Range("Q9").ClearContents, [Q9] est une notation "oldschool", on a plusieurs opinions là-dessus, mais moi, je préfère d'utiliser Range("Q9") ou Cells(9,"Q"). Normallement [...] force une sorte de "évaluation" et dans des cas rares, cela ne fait pas ce qu'on souhaite qu'elle fait. A la limite, même sh.[Q9].ClearContents n'est pas faux, mais c'est un point discutable. Le plus important, c'est le préfix "sh" et plus tôt dans la macro, j'avais ajouté ceci Set sh = Sheets("BDD") , donc ce préfix "sh." dit qu'on traite la cellule Q9 de la feuille "BDD", même si la feuille active n'est pas "BDD".

* le nombre de lignes à montrer dans BDD n'a aucune relation avec le nombre de lignes de la plage G28:CJ37 de "Panoramique", donc on est prudent et on éxagère,on montre toutes les lignes sh.UsedRange.EntireRow.Hidden = False . De nouveau, avec le préfix "sh."

VB:
 If sh.Range("O2").Value = "Nom et Début" Then .Sort .Range("A1"), xlAscending, , .Range("G1"), xlAscending, .Range("I1"), xlAscending, Header:=xlYes
               If sh.Range("O2").Value = "Lieu et Début" Then
                    .Sort .Range("A1"), xlAscending, , .Range("E1"), xlAscending, .Range("I1"), xlAscending, Header:=xlYes
               End If                        'déplacé
*ici dessus, le dernier "End if" était quelque lignes plus tard, donc c'était seulement pour "Lieu et début" que certaines lignes seront cachées

* on a la construction géniale "With ... End With"
comme-ça, on crée un object ou n'importe ... et on utilise un point pour référer au dernier With-précédent. Cela rend la macro plus lisible et éfficace. J'espère que quelqu'un autre sait mieux l'expliquer que moi, mais si on gère cela bien, c'est génial.
Dans votre boucle For lg = 2 To UBound(Arr, 2), Ubound(arr,2) est la 2eme dimension de Arr, donc le nombre de colonnes de la plage G28:CJ37 de "Panoramique", donc faux, vous voulez utiliser le nombre de lignes du tableau. Le "with précédent" est le "With .range" et comme celui commence avec un point,son "With précédent" est "With Range("tabel1").ListObject" , donc on peut les joindre et cela est "With Range("tabel1").ListObject.Range" donc cela réfère au tableau avec entête "tabel1" de la feuille "BDD". On a de la chance, dans un module normal, on ne doit pas préciser la feuille, VBA le sait. Si vous déplacez le TS vers une autre feuille, vous ne devez pas modifer VBA. Amusant ! Bon, Vous voulez boucler toutes les lignes dece tableau, le nombre de lignes est facile,il faut les compter et on atteint ceci et il faut comprendre cela comme For lg = 2 To Range("tabel1").ListObject.Range.Rows.Count , j'éspère que vous me comprenez ??? Sinon, demandez-le ...
Code:
 With Range("tabel1").ListObject
         '...
          With .Range
            '...
            'cacher les doublons
               For lg = 2 To .Rows.Count               'nombre de lignes dans le TS,     UBound(Arr, 2)
                    If .Cells(lg + 1, 1) = .Cells(lg, 1) And .Cells(lg + 1, 9) = .Cells(lg, 9) Then
                         .Cells(lg + 1, 1).EntireRow.Hidden = True
                    End If
Dans ce If ..End if, vous voulez cacher une ligne dépendant de certaines conditions, mais là, vous voulez rester dans le TS avec tous les "With-précédents", donc j'utilise là .Cells(lg + 1, 1) donc dans le tableau (avec entête) la cellule de la ligne lg+1 et colonne 1, puis avec entirerow, je prends la ligne complète et puis Hidden.true on cache la ligne

J'éspère que ce n'est pas trop en une fois ...
 

Pièces jointes

Dernière édition:
re,
leTS de BDD est une sorte de poubelle organisé, donc il contient trop de lignes, mais c'est à vous de le trier et filtrer pour récupérer vos données nécessaires. Maintenant, j'ai ajouté des lignes supplémentaires avec "zz" comme nom et tous les noms dans "autres noms". Comme-ça, vous avez une ligne "zz" par cellule non-vide de la plage G28:CJ37 de "Panoramique", et x lignes, 1 par personne comme ligne "personalisée".
Je suppose quand vous ne voulez pas des doublons, alors vous filtrez la colonne "nom" pour le nom "zz" et vous n'aurez qu'une ligne par cellule non-vide de cette palge.
Puis vous avez ces 2 nouveaux boutons pour trier (& filtrer), mais vous pouvez créer encore des autres ...
Le but final, c'est de trier&filtrer jusqu'au moment où vous avez tous vos données voulus et puis avec la macro paramétrée "ValeursFiltrés", vous les copiez dans une matrice et puis quelque part dans le fichier.
 

Pièces jointes

Le Forum,
Bsalv bonsoir,
... Ce n'est pas trop en une fois, je vais bien étudier cela.
#35 et #36 : c'est parfait ! Bien reçu pour vos explications. Cela va me rendre service dorénavant.
Merci encore beaucoup pour votre aide à progresser.
Entre temps, j'ai réussi à créer du vba similaire au vôtre pour :
- Trier
- cacher des lignes "presque doublons à la lecture"
- classer dans BDD exactement comme vous le suggérez en #25, et #26 surtout.
Je suis content d'avoir réussi comme vous.
J'ai même placé un bouton pour replacer les retours à la ligne en colonne Concat (E) de BDD après l'action de 'DEPIVOTER" : c'est génial.
Je prends note de vos conseils sur la notation [B4] (et Sh), je ne savais pas que c'était hasardeux d'utiliser cette notation : jusqu'ici je constatais que mes macros fonctionnaient bien ; alors j'y allais en pleine confiance. Je serai prudent.
Merci
Webperegrino
 
supér !
Et maintenant encore s'habituer à utiliser "With ... End With" et je ne sais pas si vous utilisez un outil pour intender vos macros pour une meilleur lisibilité ?

"je ne savais pas que c'était hasardeux d'utiliser cette notation" >>>> normallement ce n'est pas hazardeux, mais les [...], c'est une sorte de "evaluate" mais c'était quoi le but, voulez-vous la cellule ou le contenu de la cellule. En ajoutant ".value" ou ".value2" (souvant mieux pour les datesou montants), il n'y aura aucun doute.
donc votre ligne
If .Cells(lg + 1, 1) = .Cells(lg, 1) And .Cells(lg + 1, 9) = .Cells(lg, 9) Then
serait chez moi
If .Cells(lg + 1, 1).value = .Cells(lg, 1).value And .Cells(lg + 1, 9).value = .Cells(lg, 9).value Then
 
Très bien Bsalv,
Je ne peux 'marquer" en vert La solution # ici car toutes répondent à mes questions.
La dernière solution vient d'être appliquée dans mon gros fichier et tout fonctionne à merveille.
BDD avec ses trois boutons va beaucoup me servir.
Mes [] et mes manques de .Value, je le faisais pour améliorer (et simplifier) mes écritures dans les lignes VB, et ne connaissais pas l'impact.
Donc sur les Dates et Montants j'appliquerai donc aussi les .Value
Grand merci Bsalv (et évidemment tous ceux qui sont intervenus ici, je n'oublie pas les suggestions) , j'ai beaucoup appris ici.
Belle fin de week-end,
Webperegrino
 
Vous m'avez mal compris.
Quand on lit la valeur d'une cellule, avec ".value2", c'est plus vite qu'avec ".value" mais négligable pour une ou quelque cellules.

La différence est surtout là quand on utilise des formats "monétaires" ou "dates" et là,on peut avoir des conséquences inattendues !!!
voir PJ, 5 fois la même valeur mais un autre format,

conclusion avec ".value"
- avec des valeurs monétaires, on a des arrondis inattendus, (normallement on a déjà arrondi cela à des valeurs à 2 chiffres, mais s'on l'avait fait ... ?)
- avec des valeurs "dates", .value2 donne une valeur "long" ou "double" au lieu d'une valeur "date" et souvent cela est plus facile à manipuler en VBA.

Donc ici aussi, il y a une petite nuance entre les 2 et s'on la connait, on peut en profiter. (et le gain en temps mentionné ici dessus est parce qu'avec Value2, Excel ne doit pas faire ces effets secondaires inattendus contreproductifs, comme ces arrondis ou ces traductions en valeur "date")
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour