Macro transposition
Bonjour,
je suis complètement nulle en vba... je tente d'apprendre mais j'ai du mal...
j'ai un fichier excel qui se présente ainsi:
entreprise
région
adresse 1
adresse 2
tel 1
tel 2
ce process se reproduit pour X entreprises sur environ 5000 lignes
et je souhaiterai que pour 1 entreprise tout soit aligné comme suit:
entreprise région adresse 1 adresse 2 tel 1 tel 2 mail
sauriez vous comment faire?
Vous remerciant par avance.
Bonjour,
A essayer :
Sub Tranposer()
Dim T(), n%, i%, ii%, it%
With ActiveSheet
n = .Cells(.Rows.Count, 1).End(xlUp).Row
If n Mod 7 = 0 Then
ReDim T(n \ 7, 6)
For i = 1 To n Step 7
it = it + 1
For ii = 0 To 6
T(it, ii) = .Cells(i + ii, 1)
Next ii
Next i
Else
MsgBox "Vérifier le fichier : le nombre de lignes utilisées n'est pas un " _
& "multiple de 7.", vbInformation, "Fichier non conforme"
Exit Sub
End If
End With
T(0, 0) = "Entreprise": T(0, 1) = "Région": T(0, 2) = "Adresse 1"
T(0, 3) = "Adresse 2": T(0, 4) = "Tél 1": T(0, 5) = "Tél 2": T(0, 6) = "Mail"
With Worksheets.Add(after:=ActiveSheet).Range("A1").Resize(it + 1, 7)
.Value = T
.Columns.AutoFit
With .Rows(1)
.HorizontalAlignment = xlCenter
.Font.FontStyle = "Bold Italic"
End With
End With
End SubCordialement.
Bonjour,
avec une feuille nommée "source" et une "cible" et des données groupées par 7 lignes (sans ligne vide) et qui commence en ligne 1 !
dans un module standard vba:
Option Explicit
Sub transp()
Dim Last%, Col%, Li%, I%
Dim Ws1, Ws2 As Worksheet
Set Ws1 = Sheets("Source"): Set Ws2 = Sheets("cible")
Last = Ws1.Cells(Rows.Count, 1).End(xlUp).Row
Col = 3: Li = 1
For I = 1 To Last
Ws2.Cells(Li, Col) = Ws1.Cells(I, 1).Value
Col = Col + 1
If I Mod 7 = 0 Then
Li = Li + 1: Col = 3
End If
Next
End SubP.
Merci MFerrand mais ca ne fonctionne pas
erreur d'exécution 91
Variable objet ou variable de bloc With non définie
je suis une quiche je le rappelle...
Merci de votre aide !
je teste celui de patrick1957
entre chaque "paquet" j'ai 1 ligne vide
et ca doit pas plaire a la macro car ca me fait un "tas" d'info inexploitable
Oui ! Et sur quelle ligne ?
MFerrand a écrit :Oui ! Et sur quelle ligne ?
Bin... on va apprendre que le fichier ne démarre pas en ligne 7, que ne ce sont pas des pas de 7 lignes, etc etc...
J'ai testé le code de MFerrand, et il fonctionne ! donc c'est ton fichier (dont nous n'avons pas d'extrait) qui est <>
P.
entre chaque "paquet" j'ai 1 ligne vide
Evidemment, ce n'est pas prévu !
Tu n'as pas de chance (si tu retombes sur un multiple de 7 en espaçant de 8 lignes) parce que ma proposition vérifiait que la dernière ligne du fichier était un multiple de 7 !
S'il n'y a que ce problème...
Sub Tranposer()
Dim T(), n%, i%, ii%, it%
With ActiveSheet
n = .Cells(.Rows.Count, 1).End(xlUp).Row
If (n + 1) Mod 8 = 0 Then
ReDim T((n + 1) \ 7, 6)
For i = 1 To n Step 8
it = it + 1
For ii = 0 To 6
T(it, ii) = .Cells(i + ii, 1)
Next ii
Next i
Else
MsgBox "Vérifier le fichier : le nombre de lignes utilisées ne correspond pas !", _
vbInformation, "Fichier non conforme"
Exit Sub
End If
End With
T(0, 0) = "Entreprise": T(0, 1) = "Région": T(0, 2) = "Adresse 1"
T(0, 3) = "Adresse 2": T(0, 4) = "Tél 1": T(0, 5) = "Tél 2": T(0, 6) = "Mail"
Application.ScreenUpdating = False
With Worksheets.Add(after:=ActiveSheet).Range("A1").Resize(it + 1, 7)
.Value = T
.Columns.AutoFit
With .Rows(1)
.HorizontalAlignment = xlCenter
.Font.FontStyle = "Bold Italic"
End With
End With
End SubIl suffit de lire ici:
https://forum.excel-pratique.com/annonces/explications-et-regles-a-respecter-t13.html
"Pensez à joindre un fichier pour faciliter la compréhension du problème et augmenter les chances de vous faire aider. La taille maximale autorisée est de : 500ko (si vous utilisez la version 2007 d'Excel ou une version plus récente, préférez les formats ".xlsx" ou ".xlsm" pour réduire la taille du fichier)."
et après on va entendre... oui mais c'est confidentiel , bin il suffit de le rendre anonyme avec une copie , voilà
P.
patrick1957 a écrit :Il suffit de lire ici:
https://forum.excel-pratique.com/annonces/explications-et-regles-a-respecter-t13.html
"Pensez à joindre un fichier pour faciliter la compréhension du problème et augmenter les chances de vous faire aider. La taille maximale autorisée est de : 500ko (si vous utilisez la version 2007 d'Excel ou une version plus récente, préférez les formats ".xlsx" ou ".xlsm" pour réduire la taille du fichier)."
et après on va entendre... oui mais c'est confidentiel , bin il suffit de le rendre anonyme avec une copie , voilà
P.
je ne peux pas vous mettre un fichier avec 1) des numéros de contrats, 2) des noms d'entreprises, 3) des numéros de tel et 4) des noms de personnes... surtout lorsqu'il s'agit d'un fichier commercial ...
je l'aurai bien volontiers joint si il n'y avait pas un GROS caractère de confidentialité...
MFerrand a écrit :entre chaque "paquet" j'ai 1 ligne vide
Evidemment, ce n'est pas prévu !
Tu n'as pas de chance (si tu retombes sur un multiple de 7 en espaçant de 8 lignes) parce que ma proposition vérifiait que la dernière ligne du fichier était un multiple de 7 !
S'il n'y a que ce problème...
Sub Tranposer() Dim T(), n%, i%, ii%, it% With ActiveSheet n = .Cells(.Rows.Count, 1).End(xlUp).Row If (n + 1) Mod 8 = 0 Then ReDim T((n + 1) \ 7, 6) For i = 1 To n Step 8 it = it + 1 For ii = 0 To 6 T(it, ii) = .Cells(i + ii, 1) Next ii Next i Else MsgBox "Vérifier le fichier : le nombre de lignes utilisées ne correspond pas !", _ vbInformation, "Fichier non conforme" Exit Sub End If End With T(0, 0) = "Entreprise": T(0, 1) = "Région": T(0, 2) = "Adresse 1" T(0, 3) = "Adresse 2": T(0, 4) = "Tél 1": T(0, 5) = "Tél 2": T(0, 6) = "Mail" Application.ScreenUpdating = False With Worksheets.Add(after:=ActiveSheet).Range("A1").Resize(it + 1, 7) .Value = T .Columns.AutoFit With .Rows(1) .HorizontalAlignment = xlCenter .Font.FontStyle = "Bold Italic" End With End With End Sub
il me met une erreur:
Vérifier le fichier: le nombre de lignes utilisées ne correspond pas !
moi rien comprendre
C'est bien ce que j'ai écrit...
et après on va entendre... oui mais c'est confidentiel , bin il suffit de le rendre anonyme avec une copie , voilà
Mais un exemple de la structure ?
Il commence en quelle ligne , il va de où à où
Combien de colonnes ?
Une copie ANONYMISEE , ça me parait clair à moi mais bon, c'est comme tu veux
P.
Ce n'est pas une erreur, c'est que la macro vérifie que ayant des blocs de 7 lignes séparés par une ligne, la dernière ligne utilisée est la dernière d'un bloc de 7. Si donc on a commencé ligne 1, le numéro de cette dernière ligne +1 (correspondant à la ligne intermédiaire qui disparaît à la fin) doit être un multiple de 8.
S'il ne l'est pas, on te dit que ça ne colle pas !
Qu'y a-t-il d'autre comme irrégularité ???
bon ca va pas le faire...
je suis en train de voir que par endroit j'ai 7 lignes et d'autres 8...
il va jamais comprendre ...
Version qui supprime préalablement les lignes vides, et procède ensuite comme la première version, avec vérification que le nombre de lignes après suppressions est un multiple de 7.
Sub Tranposer()
Dim T(), n%, i%, ii%, it%
Application.ScreenUpdating = False
With ActiveSheet
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = n To 1
If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete
Next i
n = .Cells(.Rows.Count, 1).End(xlUp).Row
If n Mod 7 = 0 Then
ReDim T(n \ 7, 6)
For i = 1 To n Step 7
it = it + 1
For ii = 0 To 6
T(it, ii) = .Cells(i + ii, 1)
Next ii
Next i
Else
MsgBox "Vérifier le fichier : le nombre de lignes utilisées n'est pas un " _
& "multiple de 7.", vbInformation, "Fichier non conforme"
Exit Sub
End If
End With
T(0, 0) = "Entreprise": T(0, 1) = "Région": T(0, 2) = "Adresse 1"
T(0, 3) = "Adresse 2": T(0, 4) = "Tél 1": T(0, 5) = "Tél 2": T(0, 6) = "Mail"
With Worksheets.Add(after:=ActiveSheet).Range("A1").Resize(it + 1, 7)
.Value = T
.Columns.AutoFit
With .Rows(1)
.HorizontalAlignment = xlCenter
.Font.FontStyle = "Bold Italic"
End With
End With
End SubSi on a d'autres irrégularités, que tous les blocs ne soient pas de 7 lignes par exemple, ce n'est pas forcément impossible mais il faut alors identifier chaque ligne à partir du type de données et quelques autres critères pour les données de même type...
Et sans un échantillon véritablement représentatif, il est difficile de tout imaginer !
Cordialement.
j'ai beaucoup trop de fois 8 voire 9 lignes, tampis ce sera fait a la main!
Bonjour,
Montre une partie du fichier avec ce qui est en début du groupe de 7 de 8 ou de 9 lignes, ça pourrait aider non ?
Pour les lignes vides, c'est facile à retirer , mais il y a probablement qq chose qui détermine un début de groupe de lignes
P.
en fait, les groupe de lignes qui diffèrent sont ceux qui ont une BP de ceux qui n'en ont pas essentiellement...
Après je n'ai pas lu les 5700 lignes.......
Oui... mais encore
un bout de fichier serait plus simple (tu remplaces ce qui est confidentiel) mais il faut savoir où commence un groupe de 7-8-9 lignes, par quel texte ?
P.