Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

transposer un tableau

B

br1dil

Guest
Salut tout le monde,

je souhaiterais faire une macro pour transposer un tableau en ligne en colonne :

ex :
A | B | C | D
1 | couleur | date | presentation | tarif
2 | ........ |........|.. ..... .| ;;;
3 | ........ |........|.. ..... .| ;;;;
4 | ........ |........|.. ..... .| ;;;;

sous la forme

----------------
1 | couleur(1)
----------------
2 | date(1)
----------------
3 | presentation(1)
----------------
4 | tarif(1)
----------------
5 | couleur(2)
----------------
6 | date(2)
----------------
7 | presentation(2)
----------------
8 | tarif(2)
----------------


la particularité de cette macro c'est que tout doit se mettre dans la même colonne.

J'ai réussi à transposer autant de lignes que nécessaire mais je n'arrive pas à les coller les uns en dessous des autres.

merci d'avance....

la br1dil(le)
 
H

Hervé

Guest
Bonjour

Pas sur d'avoir tout compris regarde en pièce jointe.

Code:
Public Sub vev2()
Dim i As Integer, j As Integer, derligne As Integer
derligne = Range('a65536').End(xlUp).Row
For j = 1 To 4
    For i = 2 To Range('a65536').End(xlUp).Row
        Range('f' & derligne) = Cells(i, j)
        If IsDate(Cells(i, j)) Then Range('f' & derligne) = CDate(Cells(i, j))
        derligne = derligne + 1
    Next i
Next j
End Sub

Salut
Hervé [file name=Classeur3.zip size=8359]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Classeur3.zip[/file]
 

Pièces jointes

  • Classeur3.zip
    13.6 KB · Affichages: 102
  • Classeur3.zip
    13.6 KB · Affichages: 98
  • Classeur3.zip
    13.6 KB · Affichages: 102
B

br1dil

Guest
En fait,

c'est presque ça mais pas tout à fait.

l'ordre doit rester le même qu'en ligne c'est à dire :

couleur date presentation tarif
vert 14/01/2005 A 10
bleu 15/01/2005 B 20
jaune 16/01/2005 C 30
rouge 17/01/2005 D 40

avec ce tableau on doit obtenir :

couleur
date
presentation
tarif
vert
14/01/2005
A
10
bleu
15/01/2005
B
20

j'ai presque réussi avec votre formule mais il ne me prend que les 4 premières lignes...

merci en tous cas.

La B1dil(le)
 
H

Hervé

Guest
re

c'est marrant j'etais parti sur cette idée et au dernier moment j'ai changé :



Code:
Public Sub vev2()
Dim i As Integer, j As Integer, derligne As Integer
derligne = Range('a65536').End(xlUp).Row
For i = 2 To Range('a65536').End(xlUp).Row
    For j = 1 To 4
        Range('f' & derligne) = Cells(i, j)
        If IsDate(Cells(i, j)) Then Range('f' & derligne) = CDate(Cells(i, j))
        derligne = derligne + 1
    Next j
Next i
End Sub

Salut
Hervé
 
B

br1dil

Guest
Salut Hervé,

merci pour ton aide, toutefois j'aurais une dernière chose à te demander. Comment faire pour que le résultat apparaisse dans un nouveau fichier excel ?

merci d'avance ...
 

Hervé

XLDnaute Barbatruc
bonsoir brindille

Cette macro va créer une feuille (Résultats) faire le traitement dedans, puis se transformer en classeur, et enfin te proposer de sauvegarder. (Pour le café, faudra atteindre, lol)

Attention je n'ai pas mis de gestionnaire d'erreur pour le cas ou une feuille Résultats existerai déjà dans ton classeur (donc si une feuille porte déjà ce nom, bug), si il te le faut dis le moi...

Code:
Public Sub vev2()
Dim i As Integer, j As Integer, n As Integer
Dim nomfeuille As String
'on stock le nom de la feuille active
nomfeuille = ActiveSheet.Name
'on crée la feuille résultat
Sheets.Add.Name = 'Résultats'
'on retourne à la feuille des données
Sheets(nomfeuille).Select
'on fait le traitement
n = 1
For i = 2 To Range('a65536').End(xlUp).Row
    For j = 1 To 4
    With Sheets('Résultats')
        .Range('A' & n) = Cells(i, j)
        If IsDate(Cells(i, j)) Then .Range('a' & n) = CDate(Cells(i, j))
        n = n + 1
    End With
    Next j
Next i
'on déplace la feuille résultats vers un nouveau classeur
Sheets('Résultats').Move
'on ouvre la boite d'enregistrement
Application.GetSaveAsFilename
End Sub

En espérant que ceci te conviendra, sinon tu connais la maison...

Salut
Hervé
 
B

br1dil

Guest
Merci beaucoup, tout fonctionne très bien, par contre j'essaye de comprendre la formule, à quoi correspond le IsDate & CDate ?
Et si je veux transposer, toujours 4colonnes, en lignes à partir de la colonne 'N' où est-ce que je dois modifier ta formule ?

En tout cas bravo et merci pour ton aide.
 

Hervé

XLDnaute Barbatruc
Bonjour

1)
If IsDate(Cells(i, j)) Then Range('f' & derligne) = CDate(Cells(i, j))=
si la cellule source (cells(i,j) est une date (isdate) alors la cellule cible(Range('f' & derligne) ) doit recevoir la cellule source sous forme de date (Cdate).

Ce code t'évite d'avoir la date sous format standard 38406 (pour aujourd'hui) mais bien au format 23/02/05.

2)
Cette macro fonctionne par boucle avec cells :

cells(i,j)=cells(ligne, colonne)

donc, dans ton cas les colonnes sont la variable j,

dans la boucle for j=1 to 4 = pour la colonne 1 jusqu'a la colonne 4

ainsi pour partir de la colonne N et pour 4 colonnes tu utilises : for j=14 to 17

Voila, j'espère que tu auras compris mes explications, je ne suis pas très pédago.

Salut
Hervé
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…