Macro: deplacer tableau excel

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

P

pael

Guest
Bonjour,

J'ai des centaines de tableaux de largeur fixe 4 colonnes mais de longeur variable jusaqu'a 10 lignes.
Ces tableaux sont affichés l'un après l'autre dans le sens horizontal.
je voudrais essayer de faire une macro qui puisse les afficher l'un en dessous de l'autre (sens verticale).

Quelqu'un a t-il une piste?

Merci d'avance !!!
 
Dernière modification par un modérateur:
Re : Macro: deplacer tableau excel

Bonjour pael, bienvenue sur XLD,

A priori en VBA ce n'est pas très compliqué, il faut faire une boucle pour passer en revue tous les tableaux, les copier et les coller au bon endroit.

Merci de joindre un fichier simplifié (au format 2003 .xls de préférence, <48 Ko et/ou zippé), avec seulement quelques tableaux, et une feuille montrant bien le résultat à obtenir.

A+
 
Re : Macro: deplacer tableau excel

Re,

La macro dans un Module (Alt+F11) :

Code:
Sub Résultat()
Dim col As Integer, lig As Long, h As Byte
Application.ScreenUpdating = False
With Sheets("Résultat")
  .Range("A:D").Clear
  lig = 2
  For col = 1 To 5 * Application.CountA(Range("2:2")) / 3 - 4 Step 5
    h = Cells(20, col + 1).End(xlUp).Row - 1
    Cells(2, col).Resize(h, 4).Copy .Cells(lig, 1)
    lig = lig + h + 1
  Next
  .Activate
End With
End Sub

Je restitue dans la feuille "Résultat" mais on peut tout aussi bien restituer dans la feuille d'origine, Edit : à condition de remplacer :

Code:
.Range("A:D").Clear

par :

Code:
.Range("A9:D65536").Clear

A+
 

Pièces jointes

Dernière édition:
question supplémentaire

Merci ca fonctionne parfaitement,

Mais j'ai une ème question pour améliorer la macro :

En fait dans ma liste de tableau j'ai en fait une serie de 4 tableaux :
Q1: Arles/huveaune/tarascon/vieux port Q2 :Arles/huveaune/tarascon/vieux port

Ma question:
est-il possible lorsque je fais ce déplacement d'horizontal à la verticale d'inverser l'ordre des tableaux?

C'est dire que je voudrais :
Arles
Tarascon
Vieux port
Huveaune

Je vais essayé en changeant la lecture du tableau !!!
Merci...d'avance
 
Re : Macro: deplacer tableau excel

J'essaye :

je fais une boucle pour lire ma 1er serie :
J'ai 4 tableaux de 4 colonnes + les espaces :
For col = 1 To 20
à l'intérieur de cette boucle :
J'essaye de copier : 1-5 en 1er, 11-15 en second, 6-10 en 3eme et 16-20 en dernier.

Ca bug un peu chez moi
 
Re : Macro: deplacer tableau excel

Re,

Ci-joint la macro modifiée (en rouge) et le fichier.

Pour que tous les tableaux soient copiés, il faut que le nombre de tableaux soit un multiple de 4 (ce n'est pas le cas du fichier, il y en a 6).

Code:
Sub Résultat()
Dim col As Integer, lig As Long, h As Byte
Application.ScreenUpdating = False
With Sheets("Résultat")
  .Range("A:D").Clear
  lig = 2
  For col = 1 To 5 * Application.CountA(Range("2:2")) / 3 - 4 Step 5
    h = Cells(20, col + 1).End(xlUp).Row - 1
    Cells(2, col).Resize(h, 4).Copy .Cells(lig, 1)
    lig = lig + h + 1
    [COLOR="Red"]If col Mod 20 = 1 Then
      col = col + 5
    ElseIf col Mod 20 = 6 Then
      col = col + 10
    ElseIf col Mod 20 = 16 Then
      col = col - 15
    End If[/COLOR]
  Next
  .Activate
End With
End Sub

A+
 

Pièces jointes

Juste pour comprendre

re,

Juste pour comprendre:

tu fais varier la variable "col" --> For col = 1 To 5

Mais une fois que tu rentres dans le modulo :
If col Mod 20 = 1 Then
col = col + 5

La variable "col" est déjà égal à 6 au 1er tour? non?
 
Re : Macro: deplacer tableau excel

Re,

Hum pael... col est égal à 1 au 1er tour, 6 au 2ème, 11 au 3ème...

Mais voici une autre version, à mon avis plus simple et plus souple.

Dans tablo, on indique l'ordre de lecture des tableaux (ligne en rouge).

J'ai rajouté 2 tableaux pour avoir un multiple de 4.

Code:
Sub Résultat()
Dim tablo(), i As Integer, j As Byte, col As Integer, lig As Long, h As Byte
Application.ScreenUpdating = False
[COLOR="Red"]tablo = Array(1, 11, 16, 6) '1ères colonnes des 4 premiers tableaux dans l'ordre de lecture[/COLOR]
With Sheets("Résultat")
  .Range("A:D").Clear
  lig = 2
  For i = 0 To 20 * Application.CountA(Range("2:2")) / 12 - 20 Step 20 '12 = nombre de valeurs en ligne 2 des 4 tableaux
    For j = 0 To 3
      col = i + tablo(j)
      h = Cells(20, col + 1).End(xlUp).Row - 1
      Cells(2, col).Resize(h, 4).Copy .Cells(lig, 1)
      lig = lig + h + 1
    Next
  Next
  .Activate
End With
End Sub

A+
 

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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

P
  • Question Question
Réponses
1
Affichages
572
N
Réponses
4
Affichages
2 K
na_ia
N
Réponses
2
Affichages
632
N
Réponses
8
Affichages
2 K
nounou1902
N
Réponses
8
Affichages
1 K
S
Réponses
2
Affichages
2 K
sj4555
S
Retour