IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

restructurer sur 5 lignes, au lieu d'une


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de zipbox
    Homme Profil pro
    Excel VBA
    Inscrit en
    Juillet 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Excel VBA

    Informations forums :
    Inscription : Juillet 2004
    Messages : 49
    Par défaut restructurer sur 5 lignes, au lieu d'une
    Bonjour,

    j'aimerais bien restructurer des données d'un classeur sur 1 ligne au lieu de 5, voici ce dont j'ai besoin :

    ligne 1 : colonne 2 et 4
    ligne 2 : colonne 1 et 2
    ligne 3 : colonne 4
    ligne 4 : colonne 2 et 3
    ligne 5 : colonne 2 et 5

    certaines lignes ne sont pas toujours disponibles, mais la ligne 1 est toujours disponible
    les données sont triées sur le champ 'code', puis le champ 'line'

    voici un exemple de données :

    Nom : L01.jpg
Affichages : 193
Taille : 37,6 Ko

    voici ce que j'aimerais récupérer :

    Nom : L02.jpg
Affichages : 168
Taille : 17,3 Ko

    voici un début de bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    Option Explicit
     
    Sub iNiT_data()
      '
      Dim i As Long, n As Long, d(9) As Long
      Dim i1 As Long, i2 As Long
      '
      n = 0
      '
      For i1 = 2 To 10000
        '
        If (Sheets("data").Cells(i1, 1).Value = "") Then Exit For
        '
        If (Sheets("data").Cells(i1, 2).Value = 1) Then
          '
          ' --- clean ---
          '
          For i = 1 To 9
            d(i) = 0
          Next i
          '
          ' --- load ---
          '
          For i2 = i1 To (i1 + 4)
            If (Sheets("data").Cells(i1, 1).Value = Sheets("data").Cells(i2, 1).Value) Then
              '
              If (Sheets("data").Cells(i2, 2).Value = 1) Then d(1) = Sheets("data").Cells(i2, 4).Value: _
                                                              d(2) = Sheets("data").Cells(i2, 6).Value
     
              If (Sheets("data").Cells(i2, 2).Value = 2) Then d(3) = Sheets("data").Cells(i2, 3).Value: _
                                                              d(4) = Sheets("data").Cells(i2, 4).Value
     
              If (Sheets("data").Cells(i2, 2).Value = 3) Then d(5) = Sheets("data").Cells(i2, 6).Value
     
              If (Sheets("data").Cells(i2, 2).Value = 4) Then d(6) = Sheets("data").Cells(i2, 4).Value: _
                                                              d(7) = Sheets("data").Cells(i2, 5).Value
     
              If (Sheets("data").Cells(i2, 2).Value = 5) Then d(8) = Sheets("data").Cells(i2, 4).Value: _
                                                              d(9) = Sheets("data").Cells(i2, 7).Value
              '
            End If
          Next i2
          '
          ' --- save ---
          '
          n = n + 1
          '
          Sheets("result").Cells(n, 1).Value = Sheets("data").Cells(i1, 1).Value
          '
          For i = 1 To 9
            Sheets("result").Cells(n, (i + 1)).Value = d(i)
          Next i
          '
        End If
        '
      Next i1
      '
      MsgBox ("nb : " & n)
      '
    End Sub
    je me demande s'il n'y a pas un moyen plus simple, et plus optimiser, pour faire cela...

    merci, pour vos remarques, et conseils ...


  2. #2
    Membre émérite
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Par défaut
    Bonjour à toutes et tous
    Bonjour zipbox

    Peut-être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test_01()
    Dim maplage As Range
    Dim i As Integer
    Dim tablo()
     
    ' faire une boucle sur les "zones/plage"
    Set maplage = Range("C2:G6")
     
    tablo = Array(2, 4, 6, 7, 14, 17, 18, 22, 25)
    For i = 0 To 8
          ' pour tester
          Cells(6, 9 + i) = maplage.Cells(tablo(i))
    Next
     
    End Sub
    A adapter
    Eric

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par zipbox Voir le message
    Bonjour,

    j'aimerais bien restructurer des données d'un classeur sur 1 ligne au lieu de 5, voici ce dont j'ai besoin :

    ligne 1 : colonne 2 et 4
    ligne 2 : colonne 1 et 2
    ligne 3 : colonne 4
    ligne 4 : colonne 2 et 3
    ligne 5 : colonne 2 et 5
    Bonjour,

    Je ne sais pas si ma solution est plus simple, mais voici une proposition
    1) Utilisation de 5 filtres avancé (1 par ligne) pour ne garder que les colonnes que tu souhaites.
    Très simple et rapide
    2) Regroupement des 5 tableaux
    Là ça me parait plus compliqué sachant que
    certaines lignes ne sont pas toujours disponibles
    Soit par rechercheV (mais ça peut vite être lourd suivant le nombre de donnée)
    Soit en ajoutant les lignes vides manquantes: copier sous chaque résultat de filtre la liste totale des différents id, utiliser la suppression de doublon, trier par id, on obtient 5 tableaux avec le même nombre de ligne et trié de la même manière, il ne reste qu'a les réunir.

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    nul besoin de VBA, par formule Excel ça fonctionne très bien.

    Pour se faciliter la tâche, on va passer par des tableaux structurés


    1) Le tableau source est nommé "TAB_SOURCE"
    2) Il est impératif que le tableau soit trié sur la colonne id afin de les regrouper
    2) On construit un second tableau avec les colonnes "id" / "C1" / "C2" ..... / "C9"
    3) On écrit manuellement dans la colonne id chaque id existant
    4) voici les formules à écrire sur la première ligne (id "100" dans ton exemple)

    C1 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0);4)
    C2 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0);6)
    C3 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+1;3)
    C4 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+1;4)
    C5 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+2;6)
    C6 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+3;4)
    C7 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+3;5)
    C8 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+4;4)
    C9 : =INDEX(TAB_SOURCE;EQUIV([id];TAB_SOURCE[code];0)+4;7)
    Les formules se recopieront automatiquement sur les lignes suivantes, à chaque ajout d'un nouvel id dans ce tableau, il se redimensionne automatiquement et les formules se recopient

    Nom : Sans titre05.png
Affichages : 149
Taille : 22,8 Ko

  5. #5
    Membre actif Avatar de zipbox
    Homme Profil pro
    Excel VBA
    Inscrit en
    Juillet 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Excel VBA

    Informations forums :
    Inscription : Juillet 2004
    Messages : 49
    Par défaut
    super merci . . . pour vos réponses . . .

    je ne connaissais pas les tableaux structurés, et les références structurées.

    j'ai toujours un peu de mal avec les 2 fonctions : index() et equiv(), il me faut travailler cela . . .

    sinon, avant la boucle VBA :

    j'avais utilisé la concaténation des 2 colonnes, pour faire une colonne index : =TEXTE(code;"000") & "_" & TEXTE(line;"00")

    et j'avais une RechercheV dessus avec un test =si(EstNa(RechercheV("100_01";TAB_SOURCE;3;faux));0;RechercheV("100_01";TAB_SOURCE;3;faux))

    l'utilisation d'une boucle avec VBA, me permet de compter et vérifier par exemple.

    les formules cela va bien, mais j'ai toujours le reflexe vba, à la la

    merci . . .


Discussions similaires

  1. Update sur plusieurs lignes au lieu d'une seule
    Par peruvio dans le forum Doctrine2
    Réponses: 1
    Dernier message: 30/11/2016, 17h05
  2. 300 000 lignes au lieu d'une trentaine.. !
    Par djunityfr dans le forum Développement
    Réponses: 7
    Dernier message: 27/07/2009, 21h13
  3. Page de garde s'affiche sur deux pages au lieu d'une
    Par MPEG4 dans le forum Mise en forme
    Réponses: 8
    Dernier message: 04/03/2009, 19h35
  4. impression sur 2 pages au lieu d'une
    Par zanou666 dans le forum IHM
    Réponses: 7
    Dernier message: 12/11/2007, 13h58
  5. Afficher sur plusieur ligne du texte dans une balise <td>
    Par G_Kill dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 02/12/2006, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo