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 :

Changer la valeur d'une cellule selon une formule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Février 2014
    Messages : 14
    Par défaut Changer la valeur d'une cellule selon une formule
    Bonjour,
    Débutante sur VBA, j'aurai besoin de votre aide.
    J'aimerai pouvoir dans mon fichier excel mettre la valeur S à toutes les cases qui sont inférieures à 11 , sauriez vous quel code puis je utiliser ?
    Merci!

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    Bonjour, par exemple si le tableau commence en "A1"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub essai()
    tableau = Range("A1").CurrentRegion
    For ligne = 1 To UBound(tableau, 1)
    For colonne = 1 To UBound(tableau, 2)
    If tableau(ligne, colonne) < 11 Then tableau(ligne, colonne) = "S"
    Next
    Next
    Range("$A$1").Resize(UBound(tableau, 1), UBound(tableau, 2)) = tableau
    End Sub

  3. #3
    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
    Juste une petite remarque au cas où : cela peut se faire soit par mise en forme conditionnelle sans passer par VBA (il vaut mieux éviter si des copier-coller seront effectués par la suite dans la feuille), soit comme l'a proposé a_diard dans une boucle qui change après un test la mise en forme (cette façon de faire est plus robuste) et il est également possible de mettre en place une mise en forme conditionnelle par macro (mais en prenant les précautions nécessaires afin de ne pas tomber dans le travers de la première méthode...).

    Concernant les tableaux, la petite subtilité est que par défaut l'indice de départ est 0 (ce qui peut être changé par l'instruction facultative Option Base 1).

    LBound donne la borne inférieure d'un tableau, comme UBound donne la borne inférieure. Du coup quand je fais la boucle sur un tableau j'aime bien utiliser les deux. Hésitez pas à me dire pourquoi si quelqu'un trouve ça idiot xD

    J'en profite pour rappeler les bienfaits de la fonction recherche (sur le forum et ailleurs) et de la consultation de l'aide d'Excel et de MSDN. (Petite proposition subliminale à l'auteur de la question : crois moi tu vas progresser en cherchant ^^)



    Edit :

    L'indice de départ des tableaux est 0 par défaut mais celui des lignes et des colonnes est 1. Par conséquent affecter une zone de la feuille de calcul dont la première cellule est A1 va effectivement forcer le changement de base, mais il suffit d'utiliser un autre tableau en base 0 dont les valeurs vont servir à faire des opérations sur les valeurs des cellules du tableau précédent pour potentiellement avoir un souci qui avec un peu de chance ne causera même pas d'erreur donc sera difficile à repérer. D'où ma remarque. Cf complément d'explication dans mon post ci-plus-bas dans cette discussion

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Désolé de te reprendre Nagel Tha mais ce que tu dis là n'est pas totalement juste :
    Concernant les tableaux, la petite subtilité est que par défaut l'indice de départ est 0 (ce qui peut être changé par l'instruction facultative Option Base 1).
    Quand tu affectes à un tableau un Range, la base est toujours 1 et non 0 car il n'existe ni ligne 0 ni colonne 0 !
    Il suffit de le tester de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Test()
     
        Dim Tableau
     
        Tableau = Range("A1").CurrentRegion
        MsgBox LBound(Tableau)
     
    End Sub
    A1 doit avoir au moins une cellule voisine non vide même si elle même est vide

  5. #5
    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 Tableaux et Option Bas
    Bonjour,

    Je me suis dit que finalement ça valait un post et non un simple edit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
     
        Dim Tableau As Variant
     
        Tableau = Range("A1").CurrentRegion
        Debug.Print LBound(Tableau) 'affiche 1 : A1 est la première cellule de coordonnées (1;1) et il n'en existe pas avant
        'L'indice de départ du tableau est donc forcé à 1
     
        Dim Tableau2(2) As Variant
        Debug.Print LBound(Tableau2) 'affiche 0 : par défaut l'indice de départ des tableaux est 0 et non 1
    End Sub
    Cette différence est source de confusions dans deux cas évidents pour moi :
    1. dans une boucle où les deux tableaux seraient présents
    2. lorsque l'on fait des opérations entre ces tableaux


    C'est pourquoi je proposais de fixer Option Base 1 afin d'éviter toute confusion. Sachant que ce genre de confusions sera potentiellement difficile à débusquer (c'est très simple et évident mais qu'on a le nez dans le code on peut passer des heures à essayer de comprendre le pourquoi du comment et réaliser en revenant dessus des heures plus tard que c'était "aussi simple que ça" finalement ; en tout cas ça m'arrive...).

    Voici le même code, avec l'instruction Option Base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Base 1 ' l'indice de départ des tableaux est désormais 1
    Sub Test()
     
        Dim Tableau As Variant
     
        Tableau = Range("A1").CurrentRegion
        Debug.Print LBound(Tableau) 'affichait 1 sans Option Base 1 et affiche 1 avec Option Base 1
     
        Dim Tableau2(2) As Variant
        Debug.Print LBound(Tableau2) 'affichait 0 sans Option Base 1 et affiche 1 avec Option Base 1
    End Sub
    Je le précise pour ceux qui connaissent moins VBA : l'instruction Debug.Print est un outil de débogage qui permet d'afficher ce qui suit (si compatibilité de type bien sûr) directement dans la fenêtre d'exécution qui se trouve de deux manières :
    1. Affichage > Fenêtre d'exécution
    2. Ctrl + G

    Cette manière de faire présente l'avantage de ne pas sortir de la fenêtre VBA et est plus rapide à exécuter. De plus, elle garde en mémoire les affichages effectués durant la session ouverte ce qui est assez pratique.

    Autre remarque : ne pas définir le type de variable va donner le type Variant à cette variable (cependant l'écrire le type rend les choses plus claires). Cependant ici, l'affichage du type de la variable va donner 8204. Explication : 8204 = vbArray + vbVariant, soit un tableau de type Variant. J'ai trouvé l'explication ici (en anglais) : https://stackoverflow.com/questions/...204-for-arrays

    Pour ceux qui débutent :

    Quelques ressources sur MSDN :
    Option Base
    Resize
    CurrentRegion

    Quelques ressources complémentaires de DVP :
    Tutoriel sur les tableaux de SilkyRoad
    Tutoriel sur les mises en forme conditionnelles de SilkyRoad
    FAQ mise en forme conditionnelle

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    C'est pour cette raison que j'ai dis :
    ...ce que tu dis là n'est pas totalement juste
    Quand tu affectes un Range à un tableau ce dernier sera toujours en base 1

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Nagel Tha Voir le message
    Juste une petite remarque au cas où : cela peut se faire soit par mise en forme conditionnelle sans passer par VBA[…]
    Suis curieux de voir la solution que tu proposes par MFC…
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  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
    Citation Envoyé par Pierre Fauconnier Voir le message
    Suis curieux de voir la solution que tu proposes par MFC…
    Je me suis trompé : je pensais à un projet Excel où j'utilisais la MFC mais j'utilisais en même temps le SI() de Excel, donc ce n'est pas réellement la MFC seule qui fait le travail (confusion de ma part)

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Mon grain de sel…

    Jouer avec Option Base est potentiellement dangereux et empêche de réutiliser sans risques le code d'un module dans un autre projet.

    Si besoin de fixer l'indice de base du tableau, il est à mon sens préférable de le faire de façon explicite avec dim t(x to y) en précisant le x. On peut ainsi commencer où on le souhaite en fonction de ce que l'on a à faire avec le tableau. On pourrait par exemple avoir Dim t(10 to 29)) pour faire coller l'indice du tableau avec la ligne correspondante d'une plage qui commencerait en ligne 10 d'une feuille.


    Comme le dit Theze, le passage d'une plage à un tableau génèrera toujours un tableau de base 1, quelle que soit Option Base en début de module.

    Il peut être également intéressant de savoir que si l'on crée un tableau avec la fonction Array(…), la base du tableau dépend de Option Base sauf si on utilise Vba.Array(…) qui génèrera un tableau de base 0 quel que soit Option Base

    C'était donc mon grain de sel…
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/02/2017, 13h03
  2. Réponses: 2
    Dernier message: 29/07/2016, 17h49
  3. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 18h37
  4. [XL-2007] problème de codage en vba ("copie d'une partie d'une cellule dans une cellule vide")
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/10/2010, 18h01
  5. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 13h59

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