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 :

Range - Colonnes non contiguës = Areas - Adresse de la ligne complète


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut Range - Colonnes non contiguës = Areas - Adresse de la ligne complète
    Bonjour,

    J'ai un Range composé comme suit :
    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 Macro2()
    Dim PL As Long, DL As Long
    Dim Plage As Range
     
    'première ligne à traiter :
    PL = 3
    'dernière ligne à traiter :
    DL = 8
    'Plage à traiter :
    Set Plage = Union(Range("E" & PL & ":E" & DL), _
                Range("F" & PL & ":F" & DL), _
                Range("H" & PL & ":H" & DL), _
                Range("I" & PL & ":I" & DL))
    Debug.Print Plage.Rows(1).Address
    End Sub
    Je souhaite, pour chacune des "lignes" de ce Range, appliquer une Worksheetfunction.
    Soit sur les "lignes" suivantes : Range("E3:F3, H3:I3") puis Range("E4:F4, H4:I4") etc...

    Le souci est que, si le Range à traiter possède des areas (comme c'est le cas), la propriété Rows(x).Address du Range renvoie l'adresse du premier area concerné, dans l'exemple : "E3:F3" puis "E4:F4".

    Comment faire pour obtenir "l'adresse complète" de la ligne du Range concerné?

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Franck
    La méthode Union reconstitue (en la condensant par aires) la plage "unie".
    Dans ton exemple, serait ainsi retournée l'adresse $E$3:$F$8,$H$3:$I$8
    Si tu veux conserver un "morcellement" différent (par aires non "condensées), tu n'as d'autre recours que celui d'attribuer une plage à chaque "morceau" à distinguer, puis d'afficher l'adresse de chacun de ces "morceaux" (défini par sa plage).

    EDIT : dans ton exemple, toutefois, on vois bien que chaque ligne commence et finit aux mêmes numéros de colonnes.
    Et dans ce cas, cela devrait être exploitable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For each a in plage.areas
      for each r in a.rows
        msgbox r.row
      next
    next

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour Jacques,

    Merci de ta réponse.
    En fait, le but était de faire un CountA sur chaque "ligne" de ma plage.
    Donc, il convient, si je conserve cette manière de faire, d'attribuer un nouveau Range à ma variable Plage à chaque tour de boucle.
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim L As Long, Plage As Range, NBVal As Integer
     
    For L = 1 To 125
        Set Plage = Range("E" & L & ":E" & L & ", F" & L & ":F" & L & _
                    ", H" & L & ":H" & L & ", I" & L & ":I" & L & _
                    ", K" & L & ":K" & L & ", L" & L & ":L" & L & _
                    ", N" & L & ":N" & L & ", O" & L & ":O" & L & _
                    ", Q" & L & ":Q" & L & ", R" & L & ":R" & L & _
                    ", T" & L & ":T" & L & ", U" & L & ":U" & L)
        NBVal = WorksheetFunction.CountA(Plage)
    Next L
    Je pense m'orienter vers un Array des colonnes et une boucle sur cet Array, 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
    16
    17
    18
    Dim PremLig As Integer, DL As Long, i As Long, j As Integer, NBVal As Integer
    Dim Cols As Variant
     
    'dernière ligne colonne A
    DL = Range("A" & Rows.Count).End(xlUp).Row
    'première ligne à traiter :
    PremLig = 3
    'array des colonnes à traiter
    Cols = Array("E", "F", "H", "I", "K", "L", "N", "O", "Q", "R", "T", "U")
    'Boucle :
    For i = PremLig To DL
        NBVal = 0
        'double boucle
        For j = LBound(Cols) To UBound(Cols)
            If Range(Cols(j) & i) <> "" Then NBVal = NBVal + 1
        Next j
        'Traitement ici
    Next i
    Cette méthode me parait plus aisée à maintenir, à faire éventuellement évoluer.

  4. #4
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    bonjour pijaku,
    intéressé par le pbm, est t il possible d'avoir un mini exemple avec résutat final de countA sur un fichier xlsx stp (et oui parfois j'ai besoin de visualiser en réel )
    afin d'éviter de faire fausse route … je suis allé vers une direction … mais pour mieux approfondir l'exemple serait un plus
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    est t il possible d'avoir un mini exemple avec résutat final de countA
    Bien sur, voici le fichier de base :
    Pièce jointe 239967

    Le demandeur souhaite obtenir un texte en colonne AD selon si telle ou telle colonne est remplie.
    La "plage" de ces colonnes est : ("E", "F", "H", "I", "K", "L", "N", "O", "Q", "R", "T", "U")

    Du coup, je comptais faire un CountA pour chaque ligne, méthode abandonnée car par de Rows(x).Address.

    J'ai remplacé cela par une boucle sur les colonnes, la macro complète est celle-ci :

    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
    Sub conditionV2()
    Dim PremLig As Long, DL As Long, i As Long, j As Long
    Dim Cols As Variant, Texte As Variant
     
    'première ligne à traiter :
    PremLig = 3
    'dernière ligne colonne A
    DL = Range("A" & Rows.Count).End(xlUp).Row
    'array des colonnes à traiter
    Cols = Array("E", "F", "H", "I", "K", "L", "N", "O", "Q", "R", "T", "U")
    'texte à saisir selon colonne
    Texte = Array("Date d'envoi d'offre", "Il faut envoyer l'offre", _
        "Attente de l'AAO", "Attente de l'AAO", "AAO reçu", _
        "Essais planifiés", "Essais en cours", "Fin des essais", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport final", "Rapport final à envoyer", _
        "Rapport final envoyé")
    'Boucle :
    For i = PremLig To DL
        'double boucle
        For j = LBound(Cols) To UBound(Cols)
            If Range(Cols(j) & i) = "" Then Range("AD" & i) = Texte(j): Exit For
        Next j
        If Range("AD" & i) = "" Then Range("AD" & i) = Texte(UBound(Texte))
    Next i
    End Sub

  6. #6
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,
    Avec l'exemple et le code je vois mieux
    Le countA en fait te permet de récupérer le texte voulu
    C'est quoi le nombre de lignes max ??
    J'ai une idée en tête, pas de countA mais par contre un moyen d'éviter le discontigue et de compter
    Par contre j'ai toujours du mal à me rappeler de la syntaxe précise.

    Je retrouve ça et re-post …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    C'est quoi le nombre de lignes max ??
    Je ne sais pas. Ce n'est pas pour moi.
    Prends une estimation haute, 20 000 lignes !

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par RyuAutodidacte Voir le message
    Run moyen d'éviter le discontigue et de compter
    Par contre j'ai toujours du mal à me rappeler de la syntaxe précise.
    Ceci peut-être via le B-A-BA d'Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        With Feuil1.[A1].CurrentRegion.Rows
            If .Count < 3 Then Beep: Exit Sub
            VA = Application.Index(.Value, Evaluate("ROW(3:" & .Count & ")"), [{5,6,8,9,11,12,14,15,17,18,20,21}])
        End With
    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  9. #9
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Coucou Marc
    Oui c'est exactement ça (ce code je me le met tjs bien au chaud ) merci Marc
    Dsl Mais pas eu le temps de re poster, surcharger de taf

    Edit : comme tu peu le constater pijaku tu obtiens un tableau avec seulement les colonnes voulus
    Il ne reste plus qu'à faire le comptage de tes lignes avec

    Edit 2 : Comme Marc l'a deviné (en même temps c'est son code) c'est ce code auquel je pensais, je l'ai déjà utilisé à plusieurs reprise car bien pratique
    permettant de faire un tableau en sélectionnant seulement les colonnes que l'on veut (on peut même changer l'ordre), mais il y a une limite de 65536 lignes,
    certes que l'on peut déverrouiller (voir discussion ici), mais ...

    Donc voilà le code que je voyais :
    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
    Sub conditionV3()
    Const Entete = 2
    Dim DL As Long, VA, i As Long, j As Long, Texte As Variant, C As Byte
     
        DL = Range("A" & Rows.Count).End(xlUp).Row
     
        Texte = Array("Date d'envoi d'offre", "Il faut envoyer l'offre", _
        "Attente de l'AAO", "Attente de l'AAO", "AAO reçu", _
        "Essais planifiés", "Essais en cours", "Fin des essais", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport final", "Rapport final à envoyer", _
        "Rapport final envoyé")
     
        With Feuil1.[A1].CurrentRegion.Rows
            If .Count < 3 Then Beep: Exit Sub
            VA = Application.Index(.Value, Evaluate("ROW(3:" & .Count & ")"), [{5,6,8,9,11,12,14,15,17,18,20,21}])
        End With
        For i = LBound(VA) To UBound(VA)
            For j = LBound(VA, 2) To UBound(VA, 2)
                If VA(i, j) > "" Then C = C + 1
            Next
            Range("AD" & i + Entete) = Texte(C): C = 0
        Next
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  10. #10
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,
    sinon mon idée au départ c'était un truc du genre :
    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
    Sub Macro2()
    Dim PL As Long, DL As Long
    Dim Plage As Range
     
    'première ligne à traiter :
    PL = 3
    'dernière ligne à traiter :
    DL = 8
    'Plage à traiter :
     
    For i = PL To DL
        For j = 5 To 20 Step 3
            Debug.Print Range(Cells(i, j), Cells(i, j + 1)).Address
        Next
    Next
    End Sub
    Ce qui donne avec les infos supplémentaires donneées :
    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
    Sub Macro2()
    Dim PL As Long, DL As Long, Texte As Variant, Total_NBVal As Byte
     
    PL = 3: DL = 8
     
        Texte = Array("Date d'envoi d'offre", "Il faut envoyer l'offre", _
        "Attente de l'AAO", "Attente de l'AAO", "AAO reçu", _
        "Essais planifiés", "Essais en cours", "Fin des essais", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport final", "Rapport final à envoyer", _
        "Rapport final envoyé")
     
    For i = PL To DL
        For j = 5 To 20 Step 3
            NBVal = Application.CountA(Range(Cells(i, j), Cells(i, j + 1)))
            Total_NBVal = Total_NBVal + NBVal
        Next
        Range("AD" & i) = Texte(Total_NBVal): Total_NBVal = 0
    Next
    End Sub
    Voilà plus simple qd on est pas pris par le taf
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  11. #11
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour Messieurs,

    En effet, toutes vos méthodes sont valables, mais elles répondent à un besoin, pas à la question initiale.

    Je souhaite, à la base, boucler sur toutes les lignes de ma plage et utiliser une WorksheetFunction sur certaines colonnes non contiguës de cette plage.
    En fait, la réponse tient en une méthode : Intersect

    Voici comment faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim L&, PL&, DL&, NBVal&
    For L = PL To DL
        NBVal = WorksheetFunction.CountA(Intersect(Rows(L), Range("E:F,H:I,K:L,N:O,Q:R,T:U")))
    Next L
    Ce qui correspond donc à :
    Citation Envoyé par unparia
    Si tu veux conserver un "morcellement" différent (par aires non "condensées), tu n'as d'autre recours que celui d'attribuer une plage à chaque "morceau" à distinguer
    Merci à vous tous d'avoir apporter vos solutions. Je reste ouvert, bien entendu, à toutes suggestions.

    Une très bonne journée.

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

Discussions similaires

  1. [XL-2007] VBA Erreur 1004 avec sélection de colonnes non contiguës
    Par pétrin dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/09/2014, 17h53
  2. [XL-2007] SOMME colonnes non contiguës en fonction de critères
    Par Sadar007 dans le forum Excel
    Réponses: 1
    Dernier message: 23/05/2014, 18h11
  3. Réponses: 3
    Dernier message: 19/06/2006, 14h25
  4. Réponses: 1
    Dernier message: 29/12/2005, 18h04
  5. Réponses: 1
    Dernier message: 28/09/2005, 18h10

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