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 :

Créer un plan - excel vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Par défaut Créer un plan - excel vba
    Bonjour,

    J'ai un fichier Excel avec plus de 60000 lignes représentant des nomenclatures d'ensembles. Dans ce fichier, j'ai mis dans la première colonne les niveaux de nomenclature.

    Je souhaite grouper les lignes en créant un plan. Comme en exemple sur le fichier joint dans l'onglet "avec plan". Avec 60000 lignes, ça va être fastidieux de le faire manuellement. Donc je souhaiterai le faire avec une macro.

    Mais je bloque. J'ai essayé de faire des boucles en testant la valeur de la cellule dans la colonne "Niveau", mais je me perds dans les boucles et le passage d'une ligne à l'autre.

    Enfin bref, est-ce que quelqu'un aurait une idée svp ?

    Ci-dessous le lien de mon fichier
    https://www.cjoint.com/c/NIfvFdnLE3F


    Merci d'avoir lu ma question

    (Je suis en Excel 2016)

  2. #2
    Membre chevronné
    Homme Profil pro
    Formateur bureautique
    Inscrit en
    Janvier 2021
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 302
    Par défaut Idée
    Bonjour

    au lieu de faire des plans, j'aurai plutôt mis une cellule où inscrire le nom de la nomenclature que je veux voir et un bouton d'action qui masquerait les lignes qui ne correspondent pas à la nomenclature.
    quid d'un simple filtre ?

  3. #3
    Membre chevronné
    Inscrit en
    Avril 2008
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 270
    Par défaut
    Bonjour gbdos, Fab, le forum,

    Tu trouveras dans le classeur ci-joint (Essai-plan.xlsm) une solution.
    Elle se base sur :
    • un module de classe Cls_Item utilisé pour gérer un élément de l'arborescence (et la notion de "Parent/Enfants") :
      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
      Private m_l_rowNum As Long
      Private m_l_level As Long
      Private m_o_parent As Cls_Item
      Private m_o_childs As VBA.Collection
       
      Public Property Let RowNum(p_l_rowNum As Long):             m_l_rowNum = p_l_rowNum:        End Property
      Public Property Get RowNum() As Long:                       RowNum = m_l_rowNum:            End Property
      Public Property Let Level(p_l_level As Long):               m_l_level = p_l_level:          End Property
      Public Property Get Level() As Long:                        Level = m_l_level:              End Property
      Public Property Set Parent(p_o_parent As Cls_Item):         Set m_o_parent = p_o_parent:    End Property
      Public Property Get Parent() As Cls_Item:                   Set Parent = m_o_parent:        End Property
      Public Property Set Childs(p_o_childs As VBA.Collection):   Set m_o_childs = p_o_childs:    End Property
      Public Property Get Childs() As VBA.Collection:             Set Childs = m_o_childs:        End Property
       
      Public Function FullChildsCount() As Long
      Dim l_o_item As Cls_Item
          FullChildsCount = Childs.Count
          For Each l_o_item In Childs
              FullChildsCount = FullChildsCount + l_o_item.FullChildsCount
          Next l_o_item
      End Function
       
      Private Sub Class_Initialize()
          Set Childs = New VBA.Collection
      End Sub
    • une macro GroupData utilisée pour analyser l'arborescence de la feuille et grouper les éléments :
      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
      Public Sub GroupData()
      Const levelColumn   As Long = 1
      Const firstRow      As Long = 2
      Dim lastRow         As Long
      Dim i               As Long
      Dim j               As Long
      Dim tabItems()      As Variant
      Dim objItem         As Cls_Item
       
          With ThisWorkbook.Worksheets("sans plan")
              'charger les items
              lastRow = .Cells(.Rows.Count, levelColumn).End(xlUp).Row
              ReDim tabItems(1 To lastRow - firstRow + 1)
              For i = firstRow To lastRow
                  Set objItem = New Cls_Item
                  objItem.RowNum = i
                  objItem.Level = .Cells(i, levelColumn)
                  j = j + 1
                  Set tabItems(j) = objItem
              Next i
              'chercher les parents/enfants
              For i = UBound(tabItems) To 2 Step -1
                  If tabItems(i).Level > 1 Then
                      For j = i - 1 To 1 Step -1
                          If tabItems(j).Level = tabItems(i).Level - 1 Then
                              Set tabItems(i).Parent = tabItems(j)
                              tabItems(j).Childs.Add tabItems(i)
                              Exit For
                          End If
                      Next j
                  End If
              Next i
              'grouper les lignes
              For i = UBound(tabItems) To 1 Step -1
                  If tabItems(i).FullChildsCount <> 0 Then
                      .Range(.Cells(tabItems(i).RowNum + 1, 1), .Cells(tabItems(i).RowNum + tabItems(i).FullChildsCount, 1)).EntireRow.Group
                  End If
              Next i
          End With
      End Sub


    A+
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Créeation planning journalier (VBA Excel)
    Par MehdiMn dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 24/08/2017, 17h06
  2. Programmer un planning sous VBA Excel
    Par camillenathan dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/02/2015, 15h30
  3. [XL-2000] macro vba pour remplir un planning excel
    Par darkvadave dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/01/2012, 14h21
  4. problème arrière plan excel vba
    Par xav30 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 04/12/2007, 00h32
  5. Comment grouper et créer un plan en VBA Excel ?
    Par vacknov dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/11/2007, 07h00

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