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 :

Coordonnées de cellule contenues dans une variable suite [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut Coordonnées de cellule contenues dans une variable suite
    Bonsoir,

    J'ai été confronté à un petit souci de syntaxe dans une variable et j'ai été gentiment dépanné par Bertrand et BBil, qu'ils en soient remercier.

    J'ai pensé appliquer la même solution à un autre cas, mais ça ne fonctionne pas.

    J'explique.
    Dans une macro, je dois marquer une plage de cellule en vue de faire des sous-totaux.
    Je connais les cellules de première et dernière colonne pour la ligne du haut mais la ligne de fin étant aléatoire, j'utilise la méthode classique qui consiste à plonger à la fin du fichier pour remonter jusqu'à la dernière ligne et ainsi connaître la deuxième partie des coordonnées de mon instruction RANGE.

    Voici ce que je fais avec la méthode RC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Application.Goto Reference:="R65536C1"
        Selection.End(xlUp).Select
        L = Application.ActiveCell.Row
        C = Application.ActiveCell.Column
     
        Range "(R6C1:R" & L & "C" & C & ").Select"
    Inutile de vous dire que j'ai déclaré mes variables et déplacé le dernier guillemet un peu partout, ça ne fonctionne pas.

    J'ai essayé une variante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Application.Goto Reference:="R65536C1"
        Selection.End(xlUp).Select
        Coord = Application.ActiveCell.Address
     
        Range "(A6:" & Coord & ")".Select
    Là aussi, j'ai déclaré mes variables et déplacé le dernier guillemet un peu partout, ça ne fonctionne pas.

    Une idée ?

    Merci d'avance.

    Henri

  2. #2
    Membre émérite
    Homme Profil pro
    Contrôleur de gestion en activité
    Inscrit en
    Juillet 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Contrôleur de gestion en activité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 545
    Par défaut
    Bonjour,

    et avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(ActiveCell, "A6").Select
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Selection, "A6").Select
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pointdedepart = ActiveCell.Address
    Range(pointdedepart, "A6").Select
    Michel

  3. #3
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Evite les Select et ActiveCell.

    Un petit exemple en créant un objet Range:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
      Dim rToHandle As Range
      With Sheets("Feuil1")  ' A adapter, évidemment
        Set rToHandle = Range(.Cells(6, 1), .Cells(.Rows.Count, 1).End(xlUp))
      End With
      MsgBox rToHandle.Address
    End Sub
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Bonjour Michel, Alain,

    Mille mercis pour vos réponses.

    L'une et l'autre fonctionne.
    Cependant, celle d'Alain me pose un petit problème; j'explique le contexte.

    Je marque une première plage de cellules depuis A4 jusqu'à la colonne J dernière ligne.
    Je fais un sous-total.

    Ensuite, je dois à nouveau marquer l'ensemble des cellules avec la particularité que 2 sous-totaux se sont insérés (raison pour laquelle je dois réévaluer l'emplacement de ma dernière ce qui explique l'origine de ma question) avec pour particularité que je ne dois pas prendre en compte les deux dernières lignes du tableau qui sont mon dernier sous-total et le total général.

    Malheureusement, en appliquant ta solution, Alain, il englobe aussi les totaux.

    J'ai contourné le problème en m'inspirant de la solution de Michel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Application.Goto Reference:="R65536C1"
        Selection.End(xlUp).Select
        Selection.End(xlToRight).Select
        PointdArrivee = ActiveCell.Address
        Range("A4", PointdArrivee).Select
    C'est certainement moins élégant que la formule d'Alain dont je ne comprends pas toutes les arcanes, mais avec ça je fais face à tous les cas de figure, à moins qu'Alain me sorte une solution de rechange, ce dont je ne serais pas surpris...

    Merci en tout cas à vous deux, j'ai appris tant par l'une que par l'autre.
    Et merci également aux organisateurs de ce forum, c'est vraiment ce qui s'appelle être utile à la société.

    Bonne journée !

    Henri

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Je ne comprends pas bien ton problème.

    Voici pour mettre dans un Range tout le tableau à traiter (jusque colonne J).
    A faire avant d'écrire les totaux.
    Le MsgBox n'est là que pour contrôle. A supprimer, bien entendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
      Dim rToHandle As Range
      With Sheets("Feuil1")  ' A adapter, évidemment
        Set rToHandle = Range(.Cells(6, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 9))
      End With
      MsgBox rToHandle.Address
    End Sub
    Après, même si tu ajoutes des totaux sous ce tableau, le Range aura toujours la même taille.

    Citation Envoyé par AlainTech Voir le message
    Evite les Select et ActiveCell.
    Tu peux créer autant de Ranges que tu veux: Un tableau, une colonne, une ligne ou même une seule cellule.

    L'avantage est que tu peux y faire référence quelles que soient les manipulations qui aient pu être faites après leur création.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Bonsoir Alain,

    Encore merci pour ton suivi.

    Je viens de procéder à quelques essais en interprété et je me suis rendu compte de mon erreur.
    En fait, il faut chaque fois reprendre toute la plage de données, sous-totaux et totaux généraux compris et Excel gère le truc.

    Moi, je voulais ne reprendre que les données sans les derniers sous-totaux et totaux généraux.
    Ça fonctionne, mais ça génère deux fois les totaux généraux ce qui tout compte fait, est inutile.

    Si j'ai bien compris, ton instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set rToHandle = Range(.Cells(6, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 9))
    permet de créer un Range, mais pour le marquer, est-ce qu'on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range rToHandle.Select
    Sous-question.
    Ici, je peux déterminer facilement la colonne de fin.
    Si je dois estimer ma ligne et ma colonne de fin, comment puis-je faire ?

    Une dernière question le "With Sheets / End With" est nécessaire si on est déjà dans la bonne feuille ?

    D'avance mille mercis pour ton aide.

    Henri

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par Henri1830 Voir le message
    mais pour le marquer, est-ce qu'on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range rToHandle.Select
    Mais pourquoi "marquer"?
    Je t'ai déjà dit qu'il faut éviter de sélectionner. Il faut apprendre à "penser objet".

    De plus, rToHandle est un objet Range. Si tu tiens absolument à le sélectionner, il suffit d'écrire
    Pour le copier, tu fais
    Pour le "vider" (supprimer le contenu et la mise en forme des cellules qui le composent):
    Sous-question.
    Ici, je peux déterminer facilement la colonne de fin.
    Si je dois estimer ma ligne et ma colonne de fin, comment puis-je faire ?
    Une méthode parmi plein d'autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub CreationObjetRange()
      Dim iLastColumn As Long
      Dim iLastRow As Long
      Dim rToHandle As Range
      With Sheets("Feuil1")
        iLastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column ' En supposant que ta ligne 1 permet de déterminer la dernière colonne utilisée
        iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row ' En supposant que ta colonne 1 (A) permet de déterminer la dernière ligne utilisée
        Set rToHandle = Range(.Cells(1, 1), .Cells(iLastRow, iLastColumn)) ' En supposant que la première cellule du Range est en A1
      End With
    End Sub
    Une dernière question le "With Sheets / End With" est nécessaire si on est déjà dans la bonne feuille ?
    Quand tu dis "on est" tu veux dire "on a sélectionné"...
    Relis ce que je t'ai répété à propos de sélectionner.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/06/2006, 14h23
  2. Executer 1 script contenu dans une variable PHP
    Par emstar dans le forum Langage
    Réponses: 5
    Dernier message: 19/04/2006, 11h48
  3. Comment afficher une valeur contenue dans une variable ?
    Par manubrard dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2006, 15h56
  4. Condition contenu dans une variable string
    Par tomo0013 dans le forum Access
    Réponses: 6
    Dernier message: 01/12/2005, 14h15
  5. Réponses: 7
    Dernier message: 25/10/2005, 15h19

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