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 sur une plage de cellule avec ligne variable VBA [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 1
    Par défaut Range sur une plage de cellule avec ligne variable VBA
    Bonjour,

    J'ai un petit problème qui doit être sans doute très simple à résoudre :

    Dans mon code VBA je voudrais sectionné une plage de cellule pour cela j'utilise : sauf que dans ma situation je voudrai que la ligne soit définit par une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim LIGNE As Byte
        LIGNE = Range("G14").Value
        Range("B" & LIGNE & ":" & "K" & LIGNE).Select
    C'est la que je n'arrive plus, lorsque que je le fais avec une cellule ça marche mais avec une plage de cellule ça ne marche pas.

    Merci d'avance pour votre aide,
    Cordialement.
    Nheude.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Il faudrait voir ce que retourne ta variable LIGNE

    Plutôt que Byte, aussi bien y aller avec Long.
    Les systèmes d'aujourd'hui sont beaucoup plus performants qu'il y a 20 ans...
    Et quand on parle de lignes, on parle de millions possibles, donc Long

    Ceci devrait fonctionner si LIGNE renvoie bien un nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B" & LIGNE & ":K" & LIGNE).Select
    Ceci dit, évite les Select lorsque possible, soit à peu près toujours

  3. #3
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonsoir Nheude, bonsoir le forum,

    To code est tout a fait correct, toutefois la déclaration de la variable LIGNE comme byte limite à la ligne 255. Si tu dois aller au-delà il faut la déclarer comme Integer. Que signifie : ça ne marche pas ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Responsable de production
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de production
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    hello,
    tu peux égalemment travailler avec "Cells(x,x)" qui permet de remplacer les deux "x" par des variables par exemple "Ligne, Colonne" pour facilité la lecture du code ou comme dans l'exemple ci-dessous uniquement le "x" des colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     dim Colonne as byte
    Colonne=Range("G14").value
    Range(Cells(2,Colonne),Cells(11,Colonne))
    attention de bien mettre "," entre les deux Cells et non pas ";" sinon cel ne fonctionne pas!

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    ou avec Offset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim ligne as Long
    ligne=Range("G14").Value
    range("B1:K1").offset(ligne-1).Select
    Pour enfoncer un peu plus le clou :-) les .select sont à éviter quand on peut, c'est à dire dans 99% des cas.
    eric

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Bonjour,

    Première chose : sauf si absolument nécessaire, bannir les .Select et .Activate.

    Il y a plusieurs façons de faire ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' exemple :
    Dim Ligne, Colonne As Integer
    ActiveSheet.Cells(Ligne, Colonne). Select 'une cellule de coordonnées (Ligne ; Colonne) est sélectionnée
    ActiveSheet.Range(ActiveSheet.Cells(1,1), ActiveSheet.Cells(Ligne, Colonne)).Select 'une plage allant de la cellule A1 à la cellule de coordonnées (Ligne ; Colonne) est sélectionnée
     
    ActiveSheet.Range("A" & Ligne).Select 'sélectionne la cellule de coordonnées (Ligne ; 1)
    ActiveSheet.Range(ActiveSheet.Range("A1"), ActiveSheet.Range("C" & Ligne)).Select 'sélectionne une plage allant de la cellule A1 à la cellule de coordonnées (Ligne ; 3)
    J'espère que cela t'aide. Je compléterai si besoin avec d'autres exemples. Je te suggère de lire la documentation MSDN également

  7. #7
    Membre confirmé
    Homme Profil pro
    Responsable de production
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de production
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    bonjour,
    vos messages m’interpelle;

    Citation Envoyé par Nagel Tha Voir le message

    Première chose : sauf si absolument nécessaire, bannir les .Select et .Activate.

    Il y a plusieurs façons de faire ce que tu veux.

    ActiveSheet.Range(ActiveSheet.Cells(1,1), ActiveSheet.Cells(Ligne, Colonne)).Select 'une plage allant de la cellule A1 à la cellule de coordonnées (Ligne ; Colonne) est sélectionnée
    j'ai l'impression que vous vous contredite; ne pas employer .Select et les solutions que vous proposez sont toutes avec des .Select
    ai-je loupé quelque chose, car personnellement je ne vois pas comment ne pas employer les .Select!
    merci de vos éclaircissements .

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Pas du tout.

    La méthode .Select permet de sélectionner et sélectionner uniquement une cellule ou une plage de cellules. Mon exemple montre simplement comment sélectionner une cellule ou une plage de cellules de coordonnées variables et donc la méthode .Select y est nécessaire et inévitable.

    En revanche dès lors que sur ces cellules ou plage de cellules, la sélection n'apportera rien, la méthode .Select deviendra inutile.

    Ainsi pour modifier la valeur d'une cellule on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Cells(Ligne, Colonne).Value = Valeur
    Car sélectionner la cellule n'apporte absolument rien dans ce cas.

    En revanche, si vous souhaitez forcer la sélection sur une cellule après une action la méthode .Select devient justifiée. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ActiveSheet.Cells(Ligne, Colonne).Value = Valeur1 Then ActiveSheet.Cells(Ligne + Valeur1, Colonne).Select
    En écrivant votre code, il est donc important de se demander si telle ou telle ligne de code est absolument nécessaire ou non. Si vous souhaitez modifier la valeur d'une cellule, .Select est donc à bannir sauf dans le cas où l'action suivante de l'utilisateur le justifie.

  9. #9
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonsoir,
    j'ai l'impression que vous vous contredite; ne pas employer .Select et les solutions que vous proposez sont toutes avec des .Select
    Il ne faut pas confondre le fait de vouloir sélectionner une plage évidemment avec .select et utiliser inutilement . select,qui ralenti la sauce ,
    voir ci dessous les trois macros qui font toutes les trois la même chose.

    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 Macro1()
        Range("A4").Select
        Selection.Copy
        Range("A6").Select
        ActiveSheet.Paste
    End Sub
     
    Sub Macro2()
         Range("A6").Value = Range("A4").Value
    End Sub
     
    Sub Macro3()
    Range("A4").Copy
    Range("A6").PasteSpecial
    End Sub
    Cordialement

  10. #10
    Membre confirmé
    Homme Profil pro
    Responsable de production
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de production
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    merci à vous deux, comme cela c'est plus clair, je vais dorénavant construire mieux mes macros

  11. #11
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Re
    Par ailleurs, pour aller un peu plus loin, les deux macro ci-dessous font le même travail.
    Vous êtes sur la feuille2, et vous voulez copier une cellule sur une autre dans la feuille trois.
    La macro1 a base de .Select impose une sélection de feuilles de Feuil2 a Feuil3 avec retour sur Feuil2
    Vous pourrez remarquer ainsi le pratique et la concision de la macro 2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Macro1()
    Sheets("Feuil3").Select
        Range("A4").Select
        Selection.Copy
        Range("A6").Select
        ActiveSheet.Paste
    Sheets("Feuil2").Select
    End Sub
     
    Sub Macro2()
    With Sheets("Feuil3")
         .Range("A6").Value = .Range("A4").Value
    End With
    End Sub
    Cordialement

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Salut

    Il est aussi préférable de n'utiliser les activeSheet, activeWorkbook et compagnie uniquement sous la torture, le reste du temps il est préférable d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.sheets("NomFeuil").range...
    Ou tout autre écriture faisant apparaitre clairement sur quel classeur on travaille et sur quelle feuille on travaille

    Ou encore le codename de la feuille
    Feuil1.range(...
    Pour modifier le codename de la feuille c'est ici
    Nom : 2015-01-18_134906.png
Affichages : 30606
Taille : 14,2 Ko
    Le code name de la feuille c'est l'équivalent d'une variable worksheet, ça revient au même que de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MaFeuil as worksheet
     
    Set MaFeuil = ThisWorkbook.sheets("NomFeuil")
    Sauf que cette partie du Code, VBA c'est déjà chargé de l'écrire pour nous.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Membre confirmé
    Homme Profil pro
    Responsable de production
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de production
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    re,
    encore une question
    je suis en train de mettre à jour une de mes macro pour supprimer les .Select et je tombe sur ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Sheets(Onglet(16))
        If Now - Range("B1") > 1 Then
            TypeEquipe = InputBox("entrer 2 ou 3", "nbrs équipe", 2)
            Range("E1") = TypeEquipe
        End If
    End With
    si je laisse comme cela le IF travaille sur l'onglet actif et non pas sur celui souhaité et si je mets un point devant le IF cela bug
    est-ce un cas où il faut garder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Onglet(16)).Select
    ?
    merci d'avance de vos conseilles éclairés

  14. #14
    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,

    Exemple (regarde bien l'importance du point devant Range) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Sheets(1)
       'se rapporte à la feuille 1 :
       .Range("A1").Value = "toto"
        'se rapporte à la feuille active :
       Range("A1").Value = "titi"
    End With
    A noter : toujours indiquer qu'elle propriété tu utilises... Dans l'exemple j'utilise la propriété Value des Range.

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Salut

    Il est aussi préférable de n'utiliser les activeSheet, activeWorkbook et compagnie uniquement sous la torture, le reste du temps il est préférable d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.sheets("NomFeuil").range...
    Ou tout autre écriture faisant apparaitre clairement sur quel classeur on travaille et sur quelle feuille on travaille

    Ou encore le codename de la feuille
    Feuil1.range(...
    Pour modifier le codename de la feuille c'est ici
    Nom : 2015-01-18_134906.png
Affichages : 30606
Taille : 14,2 Ko
    Le code name de la feuille c'est l'équivalent d'une variable worksheet, ça revient au même que de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MaFeuil as worksheet
     
    Set MaFeuil = ThisWorkbook.sheets("NomFeuil")
    Sauf que cette partie du Code, VBA c'est déjà chargé de l'écrire pour nous.

    ++
    Qwaz
    Cela dépend de l'endroit où tu mets ton code : ThisWorkbook implique que le code se trouve dans le même classeur que la ou les feuilles à modifier.

  16. #16
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Citation Envoyé par Nagel Tha Voir le message
    Cela dépend de l'endroit où tu mets ton code : ThisWorkbook implique que le code se trouve dans le même classeur que la ou les feuilles à modifier.
    Citation Envoyé par Qwazerty
    Ou tout autre écriture faisant apparaitre clairement sur quel classeur on travaille

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Te citer ne veut pas nécessairement dire que je suis en désaccord avec toi. D'ailleurs je pourrais tout aussi bien ne pas te citer et être en désaccord tout de même ou bien être d'accord sans pour autant te citer. Là il se trouve que je suis d'accord sur le fait qu'il faut préciser dès qu'une confusion est possible le classeur sur lequel on travaille si plusieurs classeurs sont ouverts ou même si l'on travaille sur plusieurs classeurs

    Cependant j'ajoute une nuance : ActiveWorkbook ou ActiveSheet peuvent être utilisés sans problème si l'on travaille sur un seul classeur sous réserve de s'assurer qu'un seul classeur soit ouvert et permettent d'utiliser la macro sur plusieurs classeurs. En effet, si je souhaite utiliser ma macro sur plusieurs classeurs (non ouverts en même temps) sur des classeurs dont je ne connais pas forcément le nom à l'avance et qui même n'existent pas encore l'utilisation de ActiveWorkbook est très pratique. Jusque là je n'ai pas rencontré de problème en l'utilisant et pourvu qu'on prenne des précautions en programmant de manière systématique il ne va pas se produire n'importe quoi en lançant une macro.

    Pour éviter tout problème, on peut fermer les autres classeurs que le classeur à modifier en demandant à l'utilisateur s'il veut les sauvegarder par exemple. On peut également demander à l'utilisateur de sélectionner le classeur ou la feuille à modifier ou de renseigner leurs noms.

    Ce ne sont que des propositions. Il y a d'autres manières de faire. Par exemple ne modifier que les classeurs dont le nom comporte telle chaîne, portion de chaîne ou extension.

    Je répète donc que je ne cite pas pour te corriger, mais pour dire qu'il y a d'autres manières de faire. Utiliser les codenames ou les noms des feuilles (si on les connaît à l'avance) est une bonne idée (et je le fais moi-même) mais encore une fois il y a plusieurs manières de faire et il est important de le dire.

  18. #18
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Te citer ne veut pas nécessairement dire que je suis en désaccord avec toi. D'ailleurs je pourrais tout aussi bien ne pas te citer et être en désaccord tout de même ou bien être d'accord sans pour autant te citer. Là il se trouve que je suis d'accord sur le fait qu'il faut préciser dès qu'une confusion est possible le classeur sur lequel on travaille si plusieurs classeurs sont ouverts ou même si l'on travaille sur plusieurs classeurs
    Vu que l'utilisateur est souverain et ouvre autant de classeur qu'il veut sans que la macro ne le sache, autant préciser tout le temps.

    Cependant j'ajoute une nuance : ActiveWorkbook ou ActiveSheet peuvent être utilisés sans problème si l'on travaille sur un seul classeur sous réserve de s'assurer qu'un seul classeur soit ouvert et permettent d'utiliser la macro sur plusieurs classeurs. En effet, si je souhaite utiliser ma macro sur plusieurs classeurs (non ouverts en même temps) sur des classeurs dont je ne connais pas forcément le nom à l'avance et qui même n'existent pas encore l'utilisation de ActiveWorkbook est très pratique. Jusque là je n'ai pas rencontré de problème en l'utilisant et pourvu qu'on prenne des précautions en programmant de manière systématique il ne va pas se produire n'importe quoi en lançant une macro.
    Le jour ou tu feras une macro avec un traitement de plusieurs 10ène de secondes ou que ta session d'excel va se mettre à ramer pour une raison x. L'utilisateur va vouloir cliquer un peu partout, ouvrir un autre classeur pour continuer à bosser pendant que ça "tourne" et bim.

    La plupart des gens qui viennent demander de l'aide ici sont débutant donc autant qu'ils prennent les bonne habitude de suite et mettent en place des automatismes . Préciser Classeur Feuille range en est à mon avis un TRES important. Tu sembles visiblement très aguerrie en programmation et tu arrives donc à prendre en compte au file de l'eau les problèmes mais met toi à la place de ceux qui débutent et plutôt que de les inciter à prendre des habitudes les obligeant par la suite à contrôler tous un tas de paramètres qu'il est de plus très difficile à maitriser (nombre de classeur ouvert par exemple, à quel moment faire le test? En début de macro? mais si le traitement est plus long que prévu, qu'est ce qui empêche d'ouvrir d'autres classeurs?).

    Il m'arrive de les utiliser mais il faut vraiment que j'y sois contraint et forcé. Le seul cas qui me vient en tête c'est lors de la copie d'une feuille vers un autre classeur. Copy ne renvoi pas l'objet worksheet de destination et oblige donc à utiliser activeworksheet. Mais je le fait à contre coeur à chaque fois.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pour éviter tout problème, on peut fermer les autres classeurs que le classeur à modifier en demandant à l'utilisateur s'il veut les sauvegarder par exemple. On peut également demander à l'utilisateur de sélectionner le classeur ou la feuille à modifier ou de renseigner leurs noms.
    Ça n'est pas ma politique. L'utilisateur est souverain, c'est le programmeur qui doit faire en sorte de parer à des "écarts" d'utilisations. En ce qui me concerne, je pense que bien programmer c'est ça. Faire un programme qui suit l'utilisateur et pas un programme qui le cantonne dans un couloir. Mais chacun sa vision des choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ce ne sont que des propositions. Il y a d'autres manières de faire. Par exemple ne modifier que les classeurs dont le nom comporte telle chaîne, portion de chaîne ou extension.
    Ça revient bien à préciser sur quel(s) classeur(s) on travailles. Non?

    Je répète donc que je ne cite pas pour te corriger, mais pour dire qu'il y a d'autres manières de faire. Utiliser les codenames ou les noms des feuilles (si on les connaît à l'avance) est une bonne idée (et je le fais moi-même) mais encore une fois il y a plusieurs manières de faire et il est important de le dire.
    Il y a plusieurs manière de faire en effet dont certaines mènent, à mon avis, à des problèmes un jour ou l'autre.
    Tu sais je ne dis pas ça pour t'agresser, je dis ça parce que ça fait maintenant un paquet d'année que je fais du code sur Excel et des soucis, j'en ai eu.
    Des macros que j'ai mal écrites et qui m'ont bouffées des données sur d'autre classeurs j'ai déjà fait et si je peux l'éviter à d'autre en leur expliquant qu'on précise toujours sur quel classeur on travailles,je le répèterais autant de fois qu'il le faut. Et je serais vent debout contre les personne qui tiennent un discours disant qu'il suffit de tester "si y'a plusieurs classeurs", "si la macro est trop rapide pour qu'on puisse changer de classeur", "si...."
    Autant faire simple, préciser le classeur ça coute 2 lignes de code avec un with ou avec une variable worksheet, pourquoi s'en priver.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  19. #19
    Membre confirmé
    Homme Profil pro
    Responsable de production
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de production
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    re,
    Citation Envoyé par pijaku Voir le message
    Exemple (regarde bien l'importance du point devant Range) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Sheets(1)
       'se rapporte à la feuille 1 :
       .Range("A1").Value = "toto"
        'se rapporte à la feuille active :
       Range("A1").Value = "titi"
    End With
    A noter : toujours indiquer qu'elle propriété tu utilises... Dans l'exemple j'utilise la propriété Value des Range.
    merci, mais cette partie du problème je l'avais compris , la pertie que je ne comprends pas est comment faire pour que mon"IF" travaile sur le bon onglet sans employer de ".Select" ? (voir exemple plus haut)

  20. #20
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Le jour ou tu feras une macro avec un traitement de plusieurs 10ène de secondes ou que ta session d'excel va se mettre à ramer pour une raison x. L'utilisateur va vouloir cliquer un peu partout, ouvrir un autre classeur pour continuer à bosser pendant que ça "tourne" et bim.
    Dans ces cas-là il vaut mieux afficher des messages, voire une barre de progression ou même pour faire un peu d'humour (si la situation le prête) inviter l'utilisateur à prendre sa pause à café. Il est aussi possible de bloquer les actions de l'utilisateur. Avant de livrer un code, il faut penser à tout (gestion de tous les boutons, des erreurs, des évènements imprévus...). On peut aussi estimer le temps de calcul et afficher un timer. Sachant que dix secondes c'est faible, j'ai déjà fait une macro qui traitait des centaines de classeur et prenait trente minutes ou plus pour le service informatique d'une des boîtes où j'ai fait un stage et là la solution c'était de gérer les boutons, commenter le code à fond, faire une démo aux personnes concernées et livrer une notice avec.

    Ça n'est pas ma politique. L'utilisateur est souverain, c'est le programmeur qui doit faire en sorte de parer à des "écarts" d'utilisations. En ce qui me concerne, je pense que bien programmer c'est ça. Faire un programme qui suit l'utilisateur et pas un programme qui le cantonne dans un couloir. Mais chacun sa vision des choses.
    Il y a plusieurs façons de faire (sachant que fermer les classeurs est une façon de parer à ces écarts). Après on peut aussi imaginer mettre en pause la macro à certains moments pour laisser l'utilisateur faire des actions, mais étant donné que tu ne peux pas prévoir ce que l'utilisateur va faire en faisant cela tu vas t'exposer à d'autres problèmes et donc cela va t'obliger à rallonger considérablement ton code pour prévoir le plus possible. Sachant qu'un homme seul ne va pas penser à tout. L'utilisateur peut faire des écarts auxquels tu n'auras pas pensé. Le plus simple est de prévenir cela en limitant au moins un peu ce qu'il faut faire. En ce qui me concerne, je connais la programmation mais ce n'est pas mon métier ni ma formation donc je vais pas être capable ou alors je serais capable mais sans avoir le temps de faire aussi bien que toi si c'est ton métier ou que cela fait partie de ta formation.

    Ça revient bien à préciser sur quel(s) classeur(s) on travailles. Non?
    Non car tu n'en connais pas le nom dans ce cas. Par exemple tu peux ne modifier que les classeurs dont le nom contient "MIAOU". Tu sélectionnes bien un ensemble réduit de classeurs mais tu ne désignes pas le nom exact (ce qui implique que l'utilisateur ne décide pas de créer un classeur contentant cette chaîne dans le même répertoire sinon tu auras un classeur modifié qui ne devais pas l'être d'où l'importance de la notice et de limiter les action de l'utilisateur quand c'est possible ce qui n'est pas toujours le cas).

    Il y a plusieurs manière de faire en effet dont certaines mènent, à mon avis, à des problèmes un jour ou l'autre.
    Empêcher l'utilisateur de faire certaines choses le limite justement.

    Autant faire simple, préciser le classeur ça coute 2 lignes de code avec un with ou avec une variable worksheet, pourquoi s'en priver.
    Je ne dis pas de s'en priver. Simplement, dans certaines conditions. Je dis bien dans certaines conditions on peut se permettre de faire autrement, voire on ne peut pas faire autrement. Mais bien sûr si on peut le faire autant le faire.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Saut de ligne sur une plage de cellules
    Par Excel'air dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/07/2018, 09h10
  2. Réponses: 1
    Dernier message: 11/09/2014, 14h48
  3. [XL-2000] Supprimer ligne si cellule d'une colonne = 0, sur une plage de cellules
    Par audesara dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/05/2011, 16h16
  4. [XL-2007] Dimensions d'une plage de cellule ? (avec Range.)
    Par Kwick dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/03/2010, 08h57
  5. Réponses: 2
    Dernier message: 27/09/2006, 19h41

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