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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ;)

+ 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, 18h53
  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, 19h11
  3. Réponses: 3
    Dernier message: 19/06/2006, 15h25
  4. Réponses: 1
    Dernier message: 29/12/2005, 19h04
  5. Réponses: 1
    Dernier message: 28/09/2005, 19h10

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