Transposition avec macro ?

  • Initiateur de la discussion Initiateur de la discussion DJ FA
  • 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 !

DJ FA

XLDnaute Occasionnel
Bonjour voici un tableau ou je voudrais créer une macro qui me permettrais de choisir les élements "D" ainsi que cette ligne entière , à recopier sans la couleur de fond dans la feuille 2 , pouvez vous m'aider ? merci
 

Pièces jointes

Re : Transposition avec macro ?

Alors donc je voudrais qu'une macro puisse me sélectionner les lettres "D" qui se trouvent dans la colonne "C" et qu'elle copie toute la ligne qui contient cette lettre "D" et sans la couleur de fond et sur la feuille 2.
 

Pièces jointes

Re : Transposition avec macro ?

Bonjour DJ FA
Un essai dans le classeur joint.
Code:
[COLOR="DarkSlateGray"]Sub sélectionner_D_dans_colonne_C()
Dim oDat, sDat, i As Long, j As Long
   With Sheets("Feuil1")
      oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 3)).Value
   End With
   ReDim sDat(1 To 4, 1 To 1)
   For i = 1 To UBound(oDat, 1)
      If oDat(i, 3) = "D" Then
         For j = 1 To UBound(sDat, 1)
            sDat(j, UBound(sDat, 2)) = oDat(i, j)
         Next j
         ReDim Preserve sDat(1 To 4, 1 To 1 + UBound(sDat, 2))
      End If
   Next i
   sDat = Application.Transpose(sDat)
   With Sheets("Feuil2")
      .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 3)).ClearContents
      .Range(.Cells(1, 1), .Cells(-1 + UBound(sDat, 1), 4)).Value = sDat
      .Activate
   End With
End Sub[/COLOR]
ROGER2327
 

Pièces jointes

Re : Transposition avec macro ?

Re...
Dis moi, tu connais un site qui pourait m'expliquer comment tu as fais pour arriver à ce résultat ? Car en faisant du pas à pas, je n'y arrive pas.🙁
Il existe peut-être un site tel que vous le souhaitez, mais je ne le connais pas.
A propos de la procédure que je vous ai proposée, il faut dire qu'elle n'est pas la plus simple à comprendre, et il serait un peu long de la commenter complètement et clairement. Sa complication vient de ce que j'ai voulu écrire une procédure
  1. rapide à l'exécution ;
  2. souple à l'emploi.
Pour atteindre le premier objectif, je n'ai pas travaillé directement sur les cellules de la feuille de données. J'ai chargé les données dans le tableau oDat, je l'ai analysé pour trouver les lignes recherchées. J'ai placé les lignes recherchées dans le tableau sDat dont j'augmente la taille au fur et à mesure que je trouve une nouvelle ligne à copier (car on ne sait pas d'avance combien il y a de lignes à copier). Mais les lignes recherchées sont en réalité placées dans les colonnes du tableau sDat en raison d'un manque de souplesse propre à VisualBasic en ce qui concerne la gestion des tableaux.
Aussi, lorsque le traitement est fini, je transpose ce tableau, puis je le dépose dans la deuxième feuille.
Quant au deuxième objectif, j'ai cherché à le réaliser en ne mettant pas directement les valeurs de la plage A1.:.D17 dans le tableau oDat. J'ai écrit
Code:
[COLOR="DarkSlateGray"]   With Sheets("Feuil1")
      oDat = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 3)).Value
   End With[/COLOR]
qui permet de prendre un tableau de longueur variable. Si vos données étaient sur 50 lignes au lieu de 17, cette partie du code prendrait les 50 lignes, sans qu'il y ait besoin de modifier la procédure.
Toute ces considérations font que le code obtenu est difficile à décortiquer.
J'aurais pu écrire quelque chose de beaucoup plus simple. Par exemple :
Code:
[COLOR="DarkSlateGray"]Sub sélectionner_D_dans_colonne_C()
Dim i As Long, j As Long
   j = 0
   For i = 1 To 17
      If Sheets("Feuil1").Cells(i, 3).Value = "D" Then
         j = j + 1
         Sheets("Feuil2").Range(Sheets("Feuil2").Cells(j, 1), Sheets("Feuil2").Cells(j, 4)).Value = _
            Sheets("Feuil1").Range(Sheets("Feuil1").Cells(i, 1), Sheets("Feuil1").Cells(i, 4)).Value
      End If
   Next i
End Sub[/COLOR]
Étudiez ce code : vous devriez plus facilement voir ce qu'il fait.
Mais vous vous rendrez compte qu'il comporte deux gros défauts.
  1. Si vous voulez traiter 50 lignes au lieu de 17, il vous faudra modifier la ligne
    Code:
    [COLOR="DarkSlateGray"]   For i = 1 To 17[/COLOR]
    en écrivant
    Code:
    [COLOR="DarkSlateGray"]   For i = 1 To [COLOR="Red"]50[/COLOR][/COLOR]
  2. Si vous êtes amené à traiter quelques milliers de lignes, vous constaterez que ce code est infiniment plus lent que le code précédent. La vitesse est obtenue en traitant des tableaux au lieu de traiter directement des feuilles.
Je ne connais pas votre niveau en VisualBasic : vous me pardonnerez donc si je suis ou trop simpliste ou trop obscur. En tout cas, si le deuxième code proposé vous pose un problème, n'hésitez pas à questionner : j'essaierai de répondre.
ROGER2327
 
Re : Transposition avec macro ?

Je suis un débutant, j'ai commencé au début de cette semaine. Et je vous remercie pour vos réponses. Alors j'ai des questions :

Sub sélectionner_D_dans_colonne_C()
Dim i As Long, j As Long
j = 0
For i = 1 To 17
If Sheets("Feuil1").Cells(i, 3).Value = "D" Then
j = j + 1
Sheets("Feuil2").Range(Sheets("Feuil2").Cells (j, 1), Sheets("Feuil2").Cells(j, 4)).Value = _
Sheets("Feuil1").Range(Sheets("Feuil1").Cells(i, 1), Sheets("Feuil1").Cells (i, 4)).Value
End If
Next i
End Sub


Voilà j'ai donc mis en gras ce que je ne comprends pas. A quoi correspondent ces valeurs ?
 
Re : Transposition avec macro ?

Re...
On en est effectivement au B, A, BA. La science infuse étant un mythe, nous sommes tous passés par là...
A défaut d'être en mesure de vous conseillez un site ou un manuel de formation, je vous conseille d'utiliser l'aide fournie par Microsoft. En sélectionnant Cells dans le code et en appuyant sur la touche F1, vous trouvez des définitions et de exemples qui peuvent grandement vous faciliter la tâche. (C'est ainsi que j'ai appris une grande partie du peu que je connais...)
Vous verrez notamment que
_
Sheets("Feuil1").Cells(i, 3)

_

est une façon de désigner la cellule à intersection de la ligne i et de la colonne 3 de la feuille Feuil1. Comme i est commandé par
_
For i = 1 To 17

_

Sheets("Feuil1").Cells(i, 3) va désigner successivement les cellules C1, C2, C3, ...C17 de la feuille Feuil1 lors de l'exécution des boucles.
Pour écrire les valeurs de la ligne i de la feuille "Feuil1" dans la feuille Feuil2, on utilise
_
Sheets("Feuil2").Range(Sheets("Feuil2").Cells (j, 1), Sheets("Feuil2").Cells(j, 4)).Value = Sheets("Feuil1").Range(Sheets("Feuil1").Cells(i, 1), Sheets("Feuil1").Cells (i, 4)).Value

_

j désigne la ligne dans laquelle on écrit.
Au début on à mis j=0. Lorsqu'on trouve une première ligne à écrire dans la feuille Feuil2, on veut l'écrire dans la ligne 1. C'est pourquoi on écrit j = j + 1 qui signifie "remplacer la valeur actuelle de j par la valeur de j augmentée de 1". A partir de là, j vaut 1. A la prochaine exécution de la ligne de code
_
j = j + 1

_

j prendra la valeur 2, et ainsi de suite.
Voilà...
J'espère avoir su vous aider. Bon courage pour la suite...​
ROGER2327
 
Dernière édition:
Re : Transposition avec macro ?

J'avance mais là je bloque sur une première chose : je voudrais choisir d'autres valeurs en plus du "D" quelles lignes ajouter à ce code ? Et aussi comment faire en sorte que ces nouvelles lignes qui seront collées sur la feuille 2 n'effacent pas les lignes du dessus ?
 
Dernière édition:
Re : Transposition avec macro ?

Re...
Avec la deuxième solution proposée vous devriez trouver rapidement une solution car il suffit de recommencer avec une deuxième lettre ce qu'on a fait pour la première. Par exemple
Code:
[COLOR="DarkSlateGray"]Sub sélectionner_D_[COLOR="Red"]Y_[/COLOR]dans_colonne_C()
Dim i As Long, j As Long
   j = 0
[COLOR="SeaGreen"]' Boucle pour trouver "D"[/COLOR]
   For i = 1 To 17
      If Sheets("Feuil1").Cells(i, 3).Value = "D" Then
         j = j + 1
         Sheets("Feuil2").Range(Sheets("Feuil2").Cells(j, 1), Sheets("Feuil2").Cells(j, 4)).Value = _
            Sheets("Feuil1").Range(Sheets("Feuil1").Cells(i, 1), Sheets("Feuil1").Cells(i, 4)).Value
      End If
   Next i
[COLOR="SeaGreen"]' Boucle pour trouver "[COLOR="Red"]Y[/COLOR]"[/COLOR]
   For i = 1 To 17
      If Sheets("Feuil1").Cells(i, 3).Value = "[COLOR="Red"]Y[/COLOR]" Then
         j = j + 1
         Sheets("Feuil2").Range(Sheets("Feuil2").Cells(j, 1), Sheets("Feuil2").Cells(j, 4)).Value = _
            Sheets("Feuil1").Range(Sheets("Feuil1").Cells(i, 1), Sheets("Feuil1").Cells(i, 4)).Value
      End If
   Next i
End Sub[/COLOR]
trouve les lignes contenant "D", puis "Y" dans la colonne C.
On peut ensuite améliorer la chose pour raccourcir le code :
Code:
[COLOR="DarkSlateGray"]Sub sélectionner_des_lettres_dans_colonne_C()
Dim i As Long, j As Long, n As Long, oList
   oList = Array("D", "Y") [COLOR="SeaGreen"]' Liste des lettres à sélectionner.[/COLOR]
   j = 0
   For n = 0 To UBound(oList)
      For i = 1 To 17
         If Sheets("Feuil1").Cells(i, 3).Value = oList(n) Then
            j = j + 1
            Sheets("Feuil2").Range(Sheets("Feuil2").Cells(j, 1), Sheets("Feuil2").Cells(j, 4)).Value = _
               Sheets("Feuil1").Range(Sheets("Feuil1").Cells(i, 1), Sheets("Feuil1").Cells(i, 4)).Value
         End If
      Next i
   Next n
End Sub[/COLOR]
En cas de besoin, l'aide de VB vous dira tout (ou presque) sur Array et Ubound.
Avec cette dernière version, vous pouvez sélectionner plus de lettres en modifiant la ligne oList = Array("D", "Y").
En mettant
Code:
[COLOR="DarkSlateGray"]   oList = Array("D", "Y", "G")[/COLOR]
vous trouverez les lignes contenant "D", "Y" puis "G" dans la colonne C.
A vous de jouer, maintenant...​
Bon courage !
ROGER2327
#1811
 
Re : Transposition avec macro ?

Alors j'y suis arrivé, mais ma demande est loin d'être finie.😱

A la place de "D" je souhaite récupéré une valeur du type "A0 - BONJOUR MONSIEUR" j'ai essayé mais il ne veut pas me le prendre. 😡
 
Re : Transposition avec macro ?

Re...
N'avez-vous pas vu ceci ?
Re...
(...) Avec cette dernière version, vous pouvez sélectionner plus de lettres en modifiant la ligne oList = Array("D", "Y").
En mettant
Code:
[COLOR="DarkSlateGray"]   oList = Array("D", "Y", "G")[/COLOR]
vous trouverez les lignes contenant "D", "Y" puis "G" dans la colonne C. (...)​
Donc, si vous ajoutez "A0 - BONJOUR MONSIEUR" dans cette liste, vous aurez votre résultat.
Je viens de vérifier : ça marche !​
ROGER2327
#1815
 
- 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

  • Question Question
Réponses
32
Affichages
781
Réponses
5
Affichages
281
  • Question Question
Microsoft 365 Fonction si
Réponses
7
Affichages
223
Retour