Macro Excel:difficulté parcours d'un tableau
benours
Messages postés
930
Statut
Membre
-
benours Messages postés 930 Statut Membre -
benours Messages postés 930 Statut Membre -
Bonjour,
Je cherche à réaliser une macro sous Excel 2003 pour pouvoir organiser les données récupérer dans un fichier TXT. Dans ce fichier, les données sont organisées par ligne, regroupées quatre par quatre que je souhaiterais ranger sur une ligne et quatre colonnes.
En terme d'algo (si je puis dire), il s'agit de (position initiale en A1):
descendre en A2 et couper la cellule, monter en B1 et la coller,
descendre en A3 et couper la cellule, monter en C1 et la coller,
descendre en A4 et couper la cellule, monter en D1 et la coller,
supprimer les lignes 2/3/4,
se placer en A2 (A1+1),
descendre en A3 (A2+1) et couper la cellule, monter en B2 (B1+1) et la coller,
...
J'ai donc tenté de réaliser cette macro en m'arrêtant à "se placer en A2" en pensant qu'elle reproduirait les 4 actions précédentes "translatées" d'une ligne vers le bas. En réalité, la macro repart à chaque fois de A1 et supprime donc toutes les données à part celles de la première ligne.
J'ai jeté un oeil au VBA (modifier la macro) mais je n'y connais rien. J'ai quelques notions d'algo et de programmation mais je n'ai aucune maitrise de ce langage.
Existe-t-il un moyen de réaliser ma macro sans passer par l'édition en VBA?
Si la réponse est non, pourriez-vous m'orienter sur la manière de programmer ça?
On pourrait commencer par écrire "Hello" ligne par ligne... ça suffirait pour me permettre de faire le reste.
Merci d'avance!
Je cherche à réaliser une macro sous Excel 2003 pour pouvoir organiser les données récupérer dans un fichier TXT. Dans ce fichier, les données sont organisées par ligne, regroupées quatre par quatre que je souhaiterais ranger sur une ligne et quatre colonnes.
En terme d'algo (si je puis dire), il s'agit de (position initiale en A1):
descendre en A2 et couper la cellule, monter en B1 et la coller,
descendre en A3 et couper la cellule, monter en C1 et la coller,
descendre en A4 et couper la cellule, monter en D1 et la coller,
supprimer les lignes 2/3/4,
se placer en A2 (A1+1),
descendre en A3 (A2+1) et couper la cellule, monter en B2 (B1+1) et la coller,
...
J'ai donc tenté de réaliser cette macro en m'arrêtant à "se placer en A2" en pensant qu'elle reproduirait les 4 actions précédentes "translatées" d'une ligne vers le bas. En réalité, la macro repart à chaque fois de A1 et supprime donc toutes les données à part celles de la première ligne.
J'ai jeté un oeil au VBA (modifier la macro) mais je n'y connais rien. J'ai quelques notions d'algo et de programmation mais je n'ai aucune maitrise de ce langage.
Existe-t-il un moyen de réaliser ma macro sans passer par l'édition en VBA?
Si la réponse est non, pourriez-vous m'orienter sur la manière de programmer ça?
On pourrait commencer par écrire "Hello" ligne par ligne... ça suffirait pour me permettre de faire le reste.
Merci d'avance!
A voir également:
- Macro Excel:difficulté parcours d'un tableau
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
4 réponses
Bonjour,
Pas à pas :
1- ouvrez votre classeur Excel
2- Sur la feuille concernée, tapez ALT+F11 --> une fenêtre Visual Basic s'ouvre
3- Insertion/Modules
4- copiez collez ce code :
5- fermez la fenêtre visual Basic
6- pour lancer la macro : ALT + F8, choisir "rangement" et Exécuter...
J'ai annoté le code pour une meilleure compréhension, n'hésitez pas à poser vos questions.
Il doit y avoir plus simple, en tout cas plus rapide. C'est assez long, j'ai testé avec 10 000 lignes...
Dis...
Pas à pas :
1- ouvrez votre classeur Excel
2- Sur la feuille concernée, tapez ALT+F11 --> une fenêtre Visual Basic s'ouvre
3- Insertion/Modules
4- copiez collez ce code :
Sub rangement()
'déclaration des variables, i pour la boucle et derlig fin de boucle
Dim i, derlig As Integer
'derlig = nombre de lignes de la colonne A divisé par 4
derlig = CInt(Range("A65536").End(xlUp).Row / 4)
'initialise la boucle
For i = 1 To derlig
'la syntaxe Cells(ligne, colonne) est facilement accessible
Cells(i, 2).Value = Cells(i + 1, 1).Value
Cells(i, 3).Value = Cells(i + 2, 1).Value
Cells(i, 4).Value = Cells(i + 3, 1).Value
'ici on supprime les lignes entières...
Range(Cells(i + 1, 1), Cells(i + 3, 1)).EntireRow.Delete
Next
End Sub
5- fermez la fenêtre visual Basic
6- pour lancer la macro : ALT + F8, choisir "rangement" et Exécuter...
J'ai annoté le code pour une meilleure compréhension, n'hésitez pas à poser vos questions.
Il doit y avoir plus simple, en tout cas plus rapide. C'est assez long, j'ai testé avec 10 000 lignes...
Dis...
un moyen sans utiliser le vba .... à la main peut-être :-(
un petit code pour débuter en vba....
un bon exemple concret aidera davantage.
à partir de la feuille du classeur
Alt F11 ( editeur VBA)
click sur
insertion /module
dans la feuille créée copie et colle le code ci-dessous.
puis avec la touche F8 exécute le en pas à pas
tu verras ce qui se passe.
A+
un petit code pour débuter en vba....
un bon exemple concret aidera davantage.
à partir de la feuille du classeur
Alt F11 ( editeur VBA)
click sur
insertion /module
dans la feuille créée copie et colle le code ci-dessous.
puis avec la touche F8 exécute le en pas à pas
tu verras ce qui se passe.
A+
Sub transposition()
Dim NbLig as long
Dim I as integer
Sheets("feuil1").Select ' à adapter
NbLig = Range("a1").CurrentRegion.Rows.Count
For I = 0 To nblig Step 4
Range("A1").Offset(I + 1, 0).Resize(3, 1).Select
Selection.Copy
Range("A1").Offset(I, 1).Resize(1, 3).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Next
' on efface la ligne entière en controlant
'les vides de la colonne B
For I = 1 To NbLig
If IsEmpty(Cells(I, 2)) Then
Rows(I).Delete
I = I - 1
End If
Next I
End Sub
Salut Pijaku,
on s'est croisé je crois..
ta remarque sur la longueur ( nombre de ligne est judicieuse)
on peut accélérer mon code comme ça
Sub transposition()
Dim NbLig As Long
Dim I As Long
Sheets("feuil1").Select ' à adapter
NbLig = Range("a1").CurrentRegion.Rows.Count
Application.ScreenUpdating = False
For I = 0 To NbLig Step 4
Range("A1").Offset(I + 1, 0).Resize(3, 1).Select
Selection.Copy
Range("A1").Offset(I, 1).Resize(1, 3).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Next
' on efface la ligne entière en controlant
'les vides de la colonne B
Range("A1").Select
For I = 1 To NbLig
If IsEmpty(Cells(I, 2)) And Not IsEmpty(Cells(I, 1)) Then
Rows(I).Delete
I = I - 1
End If
Next I
Application.ScreenUpdating = True
Range("A1").Select
End Sub
on s'est croisé je crois..
ta remarque sur la longueur ( nombre de ligne est judicieuse)
on peut accélérer mon code comme ça
Sub transposition()
Dim NbLig As Long
Dim I As Long
Sheets("feuil1").Select ' à adapter
NbLig = Range("a1").CurrentRegion.Rows.Count
Application.ScreenUpdating = False
For I = 0 To NbLig Step 4
Range("A1").Offset(I + 1, 0).Resize(3, 1).Select
Selection.Copy
Range("A1").Offset(I, 1).Resize(1, 3).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Next
' on efface la ligne entière en controlant
'les vides de la colonne B
Range("A1").Select
For I = 1 To NbLig
If IsEmpty(Cells(I, 2)) And Not IsEmpty(Cells(I, 1)) Then
Rows(I).Delete
I = I - 1
End If
Next I
Application.ScreenUpdating = True
Range("A1").Select
End Sub
Version "rapide" si 25000 lignes :
Cordialement,
-- Tout problème à sa solution. S'il n'y a pas de solution, ou est le problème? --
Sub repartition_par_tablo()
Dim tablo() As String
Dim I, j, k, derlig As Integer
derlig = Range("A65536").End(xlUp).Row
ReDim tablo(derlig)
For I = 1 To UBound(tablo)
tablo(I) = Cells(I, 1).Value
Next
k = 1
derlig = CInt(derlig / 4)
For I = 1 To derlig
For j = 1 To 4
Cells(I, j).Value = tablo(k)
k = k + 1
Next j
Next I
I = Range("B65536").End(xlUp).Row
j = Range("A65536").End(xlUp).Row
Range(Cells(I, 1), Cells(j, 1)).EntireRow.Delete
End Sub--
Cordialement,
-- Tout problème à sa solution. S'il n'y a pas de solution, ou est le problème? --
Super! Merci beaucoup.
J'ai d'autres sujets qui sont venus s'intercaler avant celui-ci mais je ne manquerai pas de revenir vous faire part de mes commentaires dès que j'aurais trouvé le temps de mettre ce code en oeuvre.
Ce qui est sur, c'est qu'il m'était impossible d'improviser! Merci encore.
Bonne journée.
J'ai d'autres sujets qui sont venus s'intercaler avant celui-ci mais je ne manquerai pas de revenir vous faire part de mes commentaires dès que j'aurais trouvé le temps de mettre ce code en oeuvre.
Ce qui est sur, c'est qu'il m'était impossible d'improviser! Merci encore.
Bonne journée.