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 Fonction SI


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 28
    Par défaut VBA Fonction SI
    Bonjour à tous!

    Voila je cherche à remplacer sur une plage de mon fichier, (C9 à T54) toutes les cellules contenant "N" par la valeur 0.

    Mon code actuel sur lequel je travaille est celui ci mais il ne marche pas.
    J'ai vraiment du mal à identifier quel est le problème.

    Merci pour votre aide

    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 delete_N()
    '
    ' delete_N Macro
    ' suppression des N
    '
    ' Touche de raccourci du clavier: Ctrl+d
    '
        Sheets("Plan SGL").Select
        Range("C9:T24").Select
        If.Range(C9:T24) = "N" Then
        .Range('C9:T24').Value = 0
     
    End If
    End Sub

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    ton code ne fonctionne pas car la logique y est erronée !


    • Tu testes l'égalité à "N" au lieu de si contient "N" …

    Consulter l'aide de la méthode Find, la fonction InStr
    • Tu testes une plage au lieu de vérifier cellule par cellule …

    Consulter l'aide et l'exemple de l'instruction For Each...Next


  3. #3
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Bonjour,

    Marc-L a déjà relevé les problèmes logiques de ton code, qui à mon avis doit tester chaque cellule et non pas l'ensemble.

    Toutefois, si l'objectif est de remplacer tous les N par des 0 tu peux facilement utiliser 'Replace' qui évite alors une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Range("C9:T54").Replace _
            What:="N", _
            Replacement:="0", _
            LookAt:=xlPart, _
            SearchOrder:=xlByRows, _
            MatchCase:=False, _
            SearchFormat:=False, _
            ReplaceFormat:=False

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ton meilleur ami est l'enregistreur de macros
    1) Tu sélectionnes la plage C9:T24 de la feuille [Plan SGL]
    2) Tu actives l'enregistreur de macros et tu utilises le raccourci Ctrl+H (Outils Rechercher/Remplacer)
    3) Opération à faire dans la boîte de dialogue Rechercher/Remplacer
    a) Dans la zone Rechercher tu tapes N et dans la zone remplacer 0
    b) Tu cliques sur le boutons Options et tu actives l'option mot entier (pour éviter de remplacer le N de Bonjour par exemple) et éventuellemnt l'option respecter la casse.
    c) Tu cliques sur OK
    4) Tu arrêtes l'enregistreur
    5) Tu vas dans l'éditeur VBE (Alt+F11) et tu découvres le code ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Macro1()
        Selection.Replace What:="N", Replacement:=0, LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub
    6) Tu modifies Selection par Sheets("Plan SGL").Range("C9:T24")
    et tu obtiens ton nouveau code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Macro2()
        Sheets("Plan SGL").Range("C9:T24").Replace What:="N", Replacement:=0, LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub
    Comme tu es quelqu'un qui pense à l'avenir et que tu te dis que certainement prochainement tu seras confronté à un nouveau remplacement d'autres valeurs et sur d'autres plages, tu te construis une procédure comme ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub FindReplace(Rng As Range, SearchWhat As Variant, ReplaceBy As Variant)
       Rng.Replace What:=SearchWhat, Replacement:=ReplaceBy, LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub
    Que tu appelles par exemple avec cette procédure qui remplace deux plages de deux feuilles différentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub TestFindReplace()
     FindReplace Sheets("Feuil1").Range("B2:C11"), "O", "Yes"
     FindReplace Sheets("Feuil3").Range("C8:D17"), "Bonjour", "Au revoir"
    End Sub
    Bon la procédure peut être mieux paramétrée mais cela donne une idée de ce que l'on peut faire

    [EDIT]Désolé Frédéric mais pendant que j'écrivais mon post, j'ai été détourné de mes activités et je viens de voir que tu avais donné la même réponse.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 28
    Par défaut
    Merci à vous, c'est ce que j'ai fais du coup et tout fonctionne

  6. #6
    Invité de passage
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mars 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 1
    Par défaut
    Si on veut malgré tout utiliser un For Each, une manière de le faire est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Sub delete_N()
        Dim Wb As Workbook, Ws As Worksheet
        Set Wb = Workbooks("Classeur")
        Set Ws = Wb.Worksheets("Feuille1")
     
        For Each Cellule In Ws.Range("C9:T54")
            If Cellule.Value = "N" Then
                Cellule.Value = 0
            End If
        Next
    End Sub

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

Discussions similaires

  1. [VBA] fonction vba à l'ouverture d'un fichier access
    Par fabiolous dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/05/2007, 16h27
  2. [VBA-E] Equivalent VBA :fonction " = Cellule"
    Par Xaphyr dans le forum Excel
    Réponses: 4
    Dernier message: 01/04/2007, 12h57
  3. [VBA]Fonction 'ajout' en vba sur une table
    Par rico63 dans le forum VBA Access
    Réponses: 15
    Dernier message: 28/03/2007, 16h56
  4. [VBA] Fonction non définie dans l'expression
    Par DREADY dans le forum VBA Access
    Réponses: 17
    Dernier message: 08/03/2007, 16h49
  5. [Excel VBA]fonction dans une cellule qui modifie une autre cellule
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/01/2007, 17h43

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