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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    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 confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    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(...

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    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
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    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

  5. #5
    Expert éminent 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
    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

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    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.

  7. #7
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    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

+ 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