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 :

trouver la dernière cellule d'une plage de cellules non contigues. [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut trouver la dernière cellule d'une plage de cellules non contigues.
    Bonjour,

    Je peine sur un double problème depuis 2 jours.

    J'en fait deux posts pour plus de clarté:

    Je souhaite trouver la dernière cellule d'une plage de cellules non contigues.

    J'utilise la methode "SpecialCells(xlCellTypeLastCell)" comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Set RangeToImport = xlApp.Union(.Range("A4"), .Range("D4:D8"), .Range("D9:E10"), .Range("D11:D12"), .Range("D13:E13"), .Range("D14:D15"), .Range("E16:E24"), .Range("D25"), .Range("D26:E37")) 
     
    'plage de test qui à terme sera passée argument de ma fonction
     
    Set b = RangeToImport.SpecialCells(xlCellTypeLastCell)
     'j'attend ici la cellule d'adresse E37 mais j'obtiens ce qui semble être la dernière celulle existante de la feuille de calcul
    Je commence à être à bout de ressources et de nerfs ....

    Merci pour votre aide.

    Je suis un développeur VBA très occasionnel. Je visite à ces occasions votre site depuis 2004 qui me permet toujours de me remettre dans le bain très rapidement. Merci à tous les contributeurs.

    H.

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    comme ça, vite fait, je vois deux pistes :

    • tu es en automation, est-ce que la constante xlCellTypeLastCell est définie ?
    • ton xlApp.Range(... ne précise pas la feuille sur laquelle pointer

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.Workbooks("Machin").sheets("Truc").Range(...
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci pour cette réponse rapide.

    ma plage est bien défine. Je ne l'ai pas fait apparaitre dans le code pour ne pas charger mais je travail dans un bloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With xlBook.Worksheets("PFM")
     
    'code préccédent
     
    end with
    Ma plage existe bien, a priori.

    Quant à savoir si la constante xlCellTypeLastCell est bien définie. Je dirais que oui car c'est proposé par le menu déroulant "contextuel" arpès que je tape .SpecialCells ... et surtout que la méthode renvoie bien une celulle mais pas celle que j'attends.

    Je comprend que la méthode Range.SpecialCells(xlCellTypeLastCell) renvoie la dernière cellule de Range. Peut être est-ce là le problème.

    Quant à mon second problème, si je n'ai pas trouvé de solution, j'ai sans doute trouvé comment le contourner, donc pas de second post ...

  4. #4
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour,

    Je pense effectivement que cafeine pose les bonnes questions, je viens de faire le test suivant qui fonctionne parfaitement chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim RangeToImport As Range, b As Range
    With Feuil1
    Set RangeToImport = Union(.Range("A4"), .Range("D4:D8"), .Range("D9:E10"), .Range("D11:D12"), .Range("D13:E13"), .Range("D14:D15"), .Range("E16:E24"), .Range("D25"), .Range("D26:E37"))
     End With
    'plage de test qui à terme sera passée argument de ma fonction
     
    Set b = RangeToImport.SpecialCells(xlCellTypeLastCell)
     
    MsgBox b.Address

  5. #5
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    finalement je n'ai pas trouvé mieux qu'une fonction qui analyse l'adresse ...
    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
    Type LastCellFinder_
        Left As Long
        Top As Long
        Right As Long
        bottom As Long
    End Type
     
    Function findLastCell(ByVal rng As Range) As LastCellFinder_
     
    Dim x As LastCellFinder_
    Dim r As String
    Dim c As String
    Dim iMin As Long
    Dim iMax As Long
     
    ' lignes
    r = Replace(rng.EntireRow.Address(True, False, xlR1C1), ":", ",")
    r = Replace(r, "R", "")
    tmp = Split(r, ",")
    iMin = 65536
    For i = LBound(tmp) To UBound(tmp)
        If tmp(i) < iMin Then iMin = tmp(i)
        If tmp(i) > iMax Then iMax = tmp(i)
    Next i
    x.Top = iMin
    x.bottom = iMax
     
    ' colonnes
    r = Replace(rng.EntireColumn.Address(False, True, xlR1C1), ":", ",")
    r = Replace(r, "C", "")
    tmp = Split(r, ",")
    iMin = 65536
    iMax = 0
    For i = LBound(tmp) To UBound(tmp)
        If tmp(i) < iMin Then iMin = tmp(i)
        If tmp(i) > iMax Then iMax = tmp(i)
    Next i
    x.Left = iMin
    x.Right = iMax
     
    findLastCell = x
     
    End Function
    Utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?findlastcell(Union(Range("A4"), Range("D26:E37"), Range("D4:D8"), Range("D9:E10"), Range("D11:D12"), Range("D13:E13"), Range("D14:D15"), Range("E16:E24"), Range("D25"))).right
     5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?findlastcell(Union(Range("A4"), Range("D26:E37"), Range("D4:D8"), Range("D9:E10"), Range("D11:D12"), Range("D13:E13"), Range("D14:D15"), Range("E16:E24"), Range("D25"))).bottom
     37
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim K As Integer
    Dim L As Long
    Dim c As Range
    L = 0: K = 0
    For Each c In MaPlage
        If c.Column > K Then K = c.Column
        If c.Row > L Then L = c.Row
    Next c
     
     
    MsgBox K & "...................." & L
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je vais en effet partir sur les boucles que vous me proposez d'autant que je n'ai en fin de compte de besoin que de la ligne de dernière cellule. Ca fonctionne bien.

    Je pensais que la méthode SpecialCells serait plus rapide.

    Je vais pouvoir avancer jusqu'au prochain problème d'ici 5 min!!

    Merci pour vos conseils.

  8. #8
    Membre éclairé
    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
    Points : 712
    Points
    712
    Par défaut
    Bonsoir à tous

    Avec un peu de retard, je propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set RangeToImport = Range("A4:d8", "a10:d13") 
    der_cell = RangeToImport.Cells(RangeToImport.Cells.Count).Address
    der_lign = RangeToImport.Cells(RangeToImport.Cells.Count).Row
    qui donne l'adresse ou la ligne de la dernière cellule
    si j'ai bien compris

    Eric

  9. #9
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je me rends compte que la notion de dernière cellule n'a pas de sens
    on peut trouver la dernière colonne et la dernière ligne de différentes méthodes mais, la cellule déterminée par cette dernière ligne et cette dernière colonne n'est pas forcément à l'intérieur de la plage

    Testez pour MaPlage=Range("A4:d8", "E6")

    ça donne E8 pour la dernière cellule
    eh bien E8 n'appartient pas à MaPlage!!!
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

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

Discussions similaires

  1. [XL-2007] InputBox pour sélectionner cellule ou une plage de cellules dans une feuille.
    Par Nonno 94 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/02/2014, 19h01
  2. Autoriser sélection d'une plage de cellule dans une feuille Excel
    Par philoflore dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/08/2008, 09h49
  3. Trouver une plage de cellule dans une autre plage
    Par ouskel'n'or dans le forum Contribuez
    Réponses: 0
    Dernier message: 16/04/2008, 14h27
  4. affecter une plage de cellule a une combo
    Par ricoree78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/07/2007, 15h35

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