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

mail

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 Sub

Cordialement.

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 Sub

P.

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 Sub

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.

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 Sub

Si 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.

Rechercher des sujets similaires à "macro transposition"