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 :

[VBA-E]selectionner une plage de cellules


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Points : 52
    Points
    52
    Par défaut [VBA-E]selectionner une plage de cellules
    Bonjour,


    pour selectionner une plage de cellules dans Excel on fait par exmeple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Range("B8:H16").Select

    je veux donner a la fonction le nombre de ligne comme parametres et je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Range(Cells(l3, 2), Cells(lignes+13, 7)).Select
    le souci c'est que sa ne marche j'ai essayer de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille("Cells(l3, 2)":"Cells(20, 7)").Select
    et sa ne marche pas non plu,

    merci de montrer comme resoudre ce petit problème

  2. #2
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ton lignes il est défini comment au départ ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Points : 52
    Points
    52
    Par défaut
    je vais être un peut plus précis,

    moi je doit faire apel a une fonction qui créer un tableau , mais le souci c'est que les lignes du tableau ne sont pas identiques

    a chque fois il faut que je précise a ma fonction le nombre de lignes : donc je lui donne comme argument le nombre de lignes : comme suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub CreerTableau(feuille As Worksheet, ligne As Integer)
        feuille.Select
    '    feuille.Range(Cells(l3, 2), Cells(ligne+13, 7)).Select
     
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Range("B8:H40").Select
    sa marche bien , mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Range(Cells(l3, 2), Cells(ligne+13, 7)).Select
    sa ne marche pas , le problème c'est que je lai déja utilisé dans une autre macro et sa a fonctionnée , je ne sais pas ou est le problème
    ou elle est l'erreur ?

    merci de m'aider pour que je puisse avancer dans mon projet

  4. #4
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Tu peut écrire ça comme ça sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuille.Range("B13:G" & ligne + 13).Select
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par k-eisti
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Range("B8:H40").Select
    sa marche bien , mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Range(Cells(l3, 2), Cells(ligne+13, 7)).Select
    sa ne marche pas , le problème c'est que je lai déja utilisé dans une autre macro et sa a fonctionnée , je ne sais pas ou est le problème
    ou elle est l'erreur ?
    Tu es sûr de feuille ? Moi je le suis moins.
    Remplace
    Sub CreerTableau(feuille As Worksheet, ligne As Integer)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub CreerTableau(feuille, ligne)
        With feuille.Range(Cells(13, 2), Cells(ligne+13, 7))
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
        End with
        '... etc
    et instancie feuille dans la macro appelante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub LaMacro()
    Dim feuille as worksheet, ligne as long
        Set feuille = Worksheets("feuil1")
        Ligne = 25
        CreerTableau feuille, ligne
        '....
    A+

  6. #6
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ousk, je comprend pas trop tes changements ? tu pourrait expliquer un peu pourquoi tu as fait ces changements ?

    On dirait, par rapport à ce que je vois, qu'il ne faut pas quand on créé une procédure faire comme variable pour celle-ci un worksheet..En tout cas c'est comme ça que je comprend tes modifs..
    Surtout que toi comme tu le fais, en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sub (feuille,ligne)
    Ta feuille et ta ligne ce sont des Variant au départ non ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Non. Si tu instancies feuille as Worksheet dans la macro appelante, tu passes l'instance à la sub appelée. Idem pour une variable
    L'utilité du format se trouve dans l'appel d'une fonction qui elle va te retourner un type de variable non déclarée dans la sub appelante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub LaMacro()
    Dim i as byte
    Dim j as byte
         i = 5
         j = 2
         Reponse = LaFonction(i,j)
         if Reponse then msgbox "C'est vrai !"
    End sub
     
    Function LaFonction(i,j)as boolean
        LaFonction = i*j = 10
    End function
    Mais comme je n'ai pas la science infuse, je sais que ça "marche" comme ça, maintenant si ça marche "par hasard" alors le hasard fait bien les choses car je n'ai jamais eu le moindre pb en appliquant "mes règles"
    A+

    Edit
    Hello Illight, tu as testé mon code précédent avec l'instance de la feuille ?
    A+

  8. #8
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ouaip ça marche ta macro t'a juste oublié le Call :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub LaMacro()
    Dim feuille As Worksheet, ligne As Long
        Set feuille = Worksheets("feuil1")
        ligne = 4
        Call CreerTableau(feuille, ligne)
    End Sub
    Comment ça je chipote ?

    Pour revenir à ce que je disais au dessus et en reprenant ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function LaFonction(i,j)
    Quant tu écris ça, i et j sont des Variant au début, OK quand tu les appelle après avant de les mettre dans la fonction tu les définis comme des Bytes, mais au départ, ce sont des Variant.

    Je pense, de mon point de vue que écrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function LaFonction(i As Byte,j As Byte)
    ça revient au meme en fait, c'est tetre plus lourd, mais c'est peut etre plus rigoureux dans la logique. Tu vois ce qu e je veux dire ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  9. #9
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Points : 52
    Points
    52
    Par défaut
    j'ai trouvé l'erreur


    il faut pas mettre des chiffres dans la soulution est de faire come suite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub CreerTableau(feuille As Worksheet, ligne As Integer)
        Dim ligne1 As Integer
        ligne1 = 13
        feuille.Select
      feuille.Range(Cells(ligne1, 2), Cells(ligne1 + ligne, 7)).Select
    A++

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ouaip ça marche ta macro t'a juste oublié le Call :
    J'ai corrigé mais j'ai pas mis Call juste pour t'embêter.

    Non, écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function LaFonction(i As Byte,j As Byte)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function LaFonction(i, j)
    ne revient pas au même. i et j, dans le premier cas, ne sont pas déclarés dans la macro et faut toujours déclarer les variables (me semble qu'on a déjà eu cette discussion )
    Or, quand tu les passes à la fonction, ce sont des Bytes de la macro que tu lui passes. Et en plus des constantes. Pourquoi les déclarer de nouveau ?
    Réponds à ça si t'es cap'

  11. #11
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Pour le premier cas, tu n'as pa sbesoin de les déclarer dans la macro, puisqu'ils sont déja déclarés pour la fonction, donc t'as pas besoin de répéter non ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par illight
    Pour le premier cas, tu n'as pas besoin de les déclarer dans la macro, puisqu'ils sont déja déclarés pour la fonction, donc t'as pas besoin de répéter non ?
    Tu réponds à côté.
    Dans la sub appelante, i et j ne sont pas déclarées. Or faut toujours déclarer les variables. Et si tu les déclares dans la sub appelante, normal, et que tu réitères dans la sub appelée, tu les as déclarées deux fois. Où est l'erreur ?
    Ou alors, c'est que tu ne les as pas déclarées dans la macro appelante et... c'est pas bien

    Maintenant, suppose que tu utilises les variables i et j dans la procédure appelante après avoir appelé la procédure appelée, alors pour toi, elle sont toujours déclarées ? Et toc !

    Mais je sens que tu n'es pas convaincu
    Quand tu instancies une feuille, tu peux en avoir besoin tout au long de la procédure appelante... Donc tu vas la déclarer. Sinon c'est pas bien...
    Si tu places cette instance en paramètre dans l'appel d'une macro, que la macro appelée reconnaît l'instance pour ce qu'elle est, pourquoi la déclarer une nouvelle fois ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ProcédureAppelante()
    Dim FL As Worksheet
         Set FL = Worksheets("Feuil1")
         NoLigne = 1
         ProcédureAppelée FL, NoLigne
         'ou
         Call ProcédureAppelée(FL, NoLigne) 'pour te faire plaisir bien qu'inutile ^^^
    End Sub
     
    Sub ProcédureAppelée(LaFeuille, NoLigne)
         LaFeuille.Cells(NoLigne, 1).Value = "Pourquoi ça marche ?"
    End Sub
    Dans la procédure appelée, tu crois que FL est considérée comme variant ? Et toc !

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Toujours pas convaincu ? Alors je te renvoie à l'aide à fonction
    Function, instruction
    Syntaxe
    [Public | Private | Friend] [Static] Function name [(arglist)] [As type]
    '...
    '...
    type Facultatif. Type de données de la valeur renvoyée par la procédure Function ; elle peut être de type Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (non pris en charge actuellement), Date, String ou (à l'exception des chaînes de longueur fixe), Object, Variant, ou tout type défini par l'utilisateur.
    Là, il était question de fonctions.
    Pour les sub, je suis allé chercher un exemple dans l'aide à Call puisque pour le type, il est dit à peu près la même chose.
    Call, instruction, exemple
    Cet exemple illustre comment l'instruction Call est utilisée pour transférer le contrôle vers une procédure Sub, une fonction intrinsèque etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' Appelle une procédure Sub.
    Call PrintToDebugWindow("Bonjour à tous")
    ' L'instruction ci-dessus transfère le contrôle à la
    ' procédure Sub suivante.
    Sub PrintToDebugWindow(AnyString)
        Debug.Print AnyString    ' Affiche dans la fenêtre Exécution.
    End Sub
    Enfin, et, pour ce qui me concerne j'ai épuisé le sujet, la déclaration du type d'une fonction se justifie selon le type de la donnée qu'elle renvoie si ce n'est un Variant. Mais là, c'est le type de la fonction dont je parle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function OuiNon(Fl, NoLigne, NoCol, Question) as boolean
    Mais je ne prétends pas t'apprendre quelque chose

    Allez, je vois bien que tu n'as pas changé d'avis, alors avant les sub de mon exemple précédent, ajoute "Option Explicit", tu verras bien que le bug est sur les variables non déclarées (il y en a une) pas sur les paramètres...

    Tout ça pour te dire que si j'ai passé et me suis emmberté une heure à vérifier et tester tout ça, c'est pour gagner du temps quand j'écris mes procédures

  14. #14
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ok ok c'est bon t'a gagné

    Merci en tout cas pour ces éclaircissements, maintenant je ferai comme toi

    Merci de t'avoir emmerdé une heure, meme si pour moi tu t'es pas vraiment emmerdé et je suis sur que tu as appris des choses aussi
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Et d'abord, je me suis pas em...comme tu dis mais emmberté, contraction des mots em... et embêter...
    Faut pas donner le mauvais exemple et toujours rester correct sur le forum

    PS - Bon, après cette intéressante discussion, ça ne t'ennuie pas si je fais le ménage des posts jusqu'à la dernière réponse de k-eisti ? Non, je pense que ça t'emmbertera pas... mais tu dis

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

Discussions similaires

  1. Trier une plage de cellules
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/12/2019, 13h04
  2. [VBA-E] Exporter une plage de cellule en image GIF
    Par cafeine dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2007, 17h12
  3. Réponses: 2
    Dernier message: 17/12/2006, 18h17
  4. [VBA-E] Copier une plage de cellules avec critère
    Par jfamiens dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 13/06/2006, 16h34
  5. [VBA-E]Selectionner une plage et la fusionner
    Par arkazar dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/03/2006, 17h21

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