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 :

Nombres lignes utilisées dans une colonne [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 20
    Points
    20
    Par défaut Nombres lignes utilisées dans une colonne
    Je dispose dans ma feuille des valeurs suivantes, mon but est d’obtenir toutes les combinaisons possibles.

    ________ A________ B________ C_________ D
    1_______ aa_______ bb_______ cc________ ff
    2________ __________________dd________ gg
    3________ __________________ee________ hh


    Le code suivant me permet d’obtenir ce que je désire :
    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
     
    For Each Cell4 In FeuilleTable2.Range("A1")
        For Each Cell5 In FeuilleTable2.Range("B1")
            For Each Cell6 In FeuilleTable2.Range("C1:C3")
                For Each Cell7 In FeuilleTable2.Range("D1:D3")
     
    Test = Cell4.Value & “ “ & Cell5.Value & “ “ & Cell6.Value & “ “ & Cell7.Value
                 MyClasses.Add Test
                    For i = 1 To MyClasses.Count
                          FeuilleTable3.Range("A" & i) = MyClasses.Item(i)
                    Next i
                Next Cell7
            Next Cell6
        Next Cell5
    Next Cell4
    Le résultat est le suivant :

    aa bb cc ff
    aa bb cc gg
    aa bb cc hh
    aa bb dd ff
    aa bb dd gg
    aa bb dd hh
    aa bb ee ff
    aa bb ee gg
    aa bb ee hh

    J’ai malgres tout deux problèmes.

    Le premier est que je voudrais connaitre le nombre de lignes utilisées pour chaque colonne. J’ai pensé à :
    NbLignes = FeuilleTable2.UsedRange.Rows.Count
    For Each Cell4 In FeuilleTable2.Range("A1:" & NbLignes)
    Mais je ne sais pas l’adapter à une seule colonne.

    Mon deuxième problème est que je ne suis pas limité à 4 colonnes comme dans mon exemple mais cela peut varier donc je ne sais pas comment faire pour adapter mon code en fonction du nombre de colonnes.

    Voila tout, en espérant que quelqu’un poura m’aider.
    Merci.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Connaître le nombre de lignes sur une seule colonne,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbLigne = Range("A65536").End(xlUp).Row 'pour colonne A
    Ou, pour la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Cell4 In FeuilleTable2.Range("A1:A" & NbLignes)
    'Ou en direct,
    For Each Cell4 In FeuilleTable2.Range("A1:A" & Range("A65536").End(xlUp).Row )
    A+

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Août 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2007
    Messages : 117
    Points : 133
    Points
    133
    Par défaut NbLigne
    Bonjour

    tu peux aussi utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbLigne =  Application.CountA ( TaPlage)

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    Le nombre de colonnes à explorer est donné par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FeuilleTable2.Cells(1, 1).End(xlToRight).Column
    en estimant que le nombre de lignes est déterminé par de la dernière colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FeuilleTable2.Cells(65536, Dercolonne).End(xlUp).Row
    un exemple de code complet
    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
    Public Sub GetCombinaison()
    'Ligne explorée
    Dim Ligne As Long 
    'Colonne explorée et nombre de colonnes
    Dim Colonne As long, DerColonne As Long 
    'Conserve pour chaque colonne la dernière ligne contenant une valeur 
    Dim CellValue() As Long
     
      With FeuilleTable2
    'Récupérer le nombre de colonnes à explorer
       DerColonne=.Cells(1, 1).End(xlToRight).Column
    'Redimensionne le tableau sur le nombre de colonnes
       Redim CellValue(1 To DerColonne)
     
       For Ligne=1 to .Cells(65536, 1).End(xlUp).Row
         For Colonne=1 To DerColonne
    'si la cellule(ligne, colonne) est non vide alors conserver son n° de ligne
          If .Cells(Ligne, colonne)<>"" Then CellValue(Colonne)=Ligne
    'Inscrire dans le feuillet la valeur de la cellule
          FeuilleTable3.Range("A" & Ligne)=FeuilleTable3.Range("A" & Ligne) & Iif(FeuilleTable3.Range("A" & Ligne)="","", " ") & .Cells(CellValue(Colonne), Colonne)
         Next Colonne
       Next Ligne
     End with
    End sub

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Merci de vos réponses.
    Au final je n'est pas beaucoup modifié mon 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
     
    For Each Cell1 In FeuilleTable3.Range("A1:A" & FeuilleTable3.Range("A20").End(xlUp).Row)
        For Each Cell2 In FeuilleTable3.Range("B1:B" & FeuilleTable3.Range("B20").End(xlUp).Row)
            For Each Cell3 In FeuilleTable3.Range("C1:C" & FeuilleTable3.Range("C20").End(xlUp).Row)
                For Each Cell4 In FeuilleTable3.Range("D1:D" & FeuilleTable3.Range("D20").End(xlUp).Row)
                    For Each Cell5 In FeuilleTable3.Range("E1:E" & FeuilleTable3.Range("E20").End(xlUp).Row)
                         For Each Cell6 In FeuilleTable3.Range("F1:F" & FeuilleTable3.Range("F20").End(xlUp).Row)
                            For Each Cell7 In FeuilleTable3.Range("G1:G" & FeuilleTable3.Range("G20").End(xlUp).Row)
                                For Each Cell8 In FeuilleTable3.Range("H1:H" & FeuilleTable3.Range("H20").End(xlUp).Row)
                                    For Each Cell9 In FeuilleTable3.Range("I1:I" & FeuilleTable3.Range("I20").End(xlUp).Row)
     
     
     TestArray = Cell1.Value & " " & Cell2.Value & " " & Cell3.Value & " " & Cell4.Value & " " & Cell5.Value & " " & Cell6.Value & " " & Cell7.Value & " " & Cell8.Value & " " & Cell9.Value
                    MyClasses.Add Test
                    For i = 1 To MyClasses.Count
                          FeuilleTable3.Range("A" & i) = MyClasses.Item(i)
                    Next i
     
                                   Next Cell9
                                Next Cell8
                            Next Cell7
                        Next Cell6
                    Next Cell5
                Next Cell4
             Next Cell3
        Next Cell2                                  
    Next Cell1
    Ca fonctionne mais c'est super long quand j'execute la macro pour de nombreuses feuilles...
    Enfaite je voudrais une méthode sans les for ..each !! Mais je ne sais pas faire..
    Alors je redemande de l'aide ^^
    Merci

  6. #6
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    imaginon que tu lui donne 10 infos par colonne tu boucle 10^9 fois. Normale que ca rame un peu non?

    par contre je ne vois pas trop l'interet de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    MyClasses.Add Test
                    For i = 1 To MyClasses.Count
                          FeuilleTable3.Range("A" & i) = MyClasses.Item(i)
                    Next i
    Pourquoi ne pas directment récrire la valeur de
    TestArray dans la première celule vide de A?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FeuilleTable3.Range("A" &FeuilleTable3.Range("A65536").End(xlUp).Row+1)=TestArray
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour à tous,

    ok je viens de comprendre ce que tu souhaites obtenir

    j'y arrive avec deux fonctions en plus de la procédure GetCombinaison qui récupère et copie les combinaisons:
    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
     
    Dim Cellules() as Long
     
    'fonction récursive qui lit et renvoie le contenue de chaque cellule
    Public Function ReadCell(ColIndex As Long) As String
        If cellules(colindex)=0 then cellules(colindex)=1 
        If ColIndex = FeuilleTable2.Cells(1, 1).End(xlToRight).Column Then ReadCell = FeuilleTable2.Cells(Cellules(ColIndex), ColIndex): Exit Function
        ReadCell = FeuilleTable2.Cells(Cellules(ColIndex), ColIndex) & " " & ReadCell(ColIndex + 1)
    End Function
     
    'Fonction qui incremente le n° de ligne de lecture pour chaque cellule
    'Quand la dernère ligne est atteinte revient à la première et incémente
    'le n° de ligne de colonne précédente
    Public Function GetNextLine(ColIndex As Long) As Boolean
        GetNextLine = False
        If Cellules(ColIndex) = FeuilleTable2.Cells(65536, ColIndex).End(xlUp).Row Then
            Cellules(ColIndex) = 1
            If ColIndex <> 1 Then GetNextLine = GetNextLine(ColIndex - 1)
        Else
            Cellules(ColIndex) = Cellules(ColIndex) + 1
            GetNextLine = True
        End If
    End Function
     
     
    'Procédure d'affectation des combinaisons
    Public Sub GetCombinaison()
        Dim DerColonne As Long, Ligne As Long
        DerColonne = FeuilleTable2.Cells(1, 1).End(xlToRight).Column
        ReDim Cellules(1 To DerColonne)
        Ligne = 1
        Do
            FeuilleTable3.Range("A" & Ligne) = ReadCell(1)
            Ligne = Ligne + 1
        Loop Until Not GetNextLine(DerColonne)
    End Sub

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    Salut,

    Avec une recursive, plus de limite de colonnes.
    Et en passant par un tableau, surement un peu plus rapide

    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
    Option Explicit
     
    Dim Tablo() As Variant
    Dim TabloCombi() As String
     
    Sub Combinaisons()
        Dim CptLig As Integer
        Dim CptCol As Byte
        Dim Combinaison As String
     
        ReDim Tablo(1 To Feuil1.UsedRange.Rows.Count, 1 To Feuil1.UsedRange.Columns.Count)
        ReDim TabloCombi(1 To 1)
     
        For CptLig = 1 To Feuil1.UsedRange.Rows.Count
            For CptCol = 1 To Feuil1.UsedRange.Columns.Count
                If Feuil1.Cells(CptLig, CptCol).Value <> "" Then
                    Tablo(CptLig, CptCol) = Feuil1.Cells(CptLig, CptCol).Value
                End If
            Next CptCol
        Next CptLig
     
        ChercheCombinaison 1, 1, ""
     
        For CptLig = 2 To UBound(TabloCombi)
            Feuil2.Range("A" & CptLig).Value = TabloCombi(CptLig)
        Next CptLig
     
        ReDim Tablo(0)
        ReDim TabloCombi(0)
    End Sub
     
    Sub ChercheCombinaison(CptLigIni As Integer, CptColIni As Byte, PrefCombinaison As String)
        Dim CptLig As Integer
        Dim CptCol As Byte
        Dim CombiTmp As String
     
        CombiTmp = PrefCombinaison
     
        For CptLig = 1 To UBound(Tablo, 1)
            For CptCol = CptColIni To UBound(Tablo, 2)
                If Not IsEmpty(Tablo(CptLig, CptCol)) Then
                    CombiTmp = CombiTmp & " " & Tablo(CptLig, CptCol)
     
                    If CptCol = UBound(Tablo, 2) Then
                        ReDim Preserve TabloCombi(1 To UBound(TabloCombi) + 1)
                        TabloCombi(UBound(TabloCombi)) = Mid(CombiTmp, 2)
                        CombiTmp = PrefCombinaison
                         Exit For
                    ElseIf CptCol < UBound(Tablo, 2) Then
                        ChercheCombinaison CptLig, CptCol + 1, CombiTmp
                        CombiTmp = PrefCombinaison
                        Exit For
                    End If
                Else
                    CombiTmp = PrefCombinaison
                    Exit For
                End If
            Next CptCol
        Next CptLig
    End Sub
    ++
    Minick


    EDIT: Oops, j'avais pas rafraichi donc pas vu ta solution par recursive...
    ++
    Minick

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    C'est ce que je voulais .
    Merci Pour les réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Compter le nombre d'entrées dans une colonne
    Par gastoncs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2009, 22h09
  2. Réponses: 6
    Dernier message: 04/11/2008, 22h35
  3. Compter un nombre de date dans une colonne
    Par MASK55 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/11/2007, 11h17
  4. Calcul du nombre d'occurences dans une colonne
    Par Masmeta dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/09/2007, 15h11
  5. nombre de cellule dans une colonne excel
    Par mahboub dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/11/2006, 23h00

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