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 :

probleme fonction remplacement


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
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut probleme fonction remplacement
    Bonjour,

    Je me permets d'ouvrir une discussion car j'ai un problème pour un code très simple, mais c'est la première fois que j'essais de faire une macro...

    Ce que je veux faire est très simple et requier deux étapes.
    1) J'ai une liste de code à 4 lettres sur une collonne. Je voudrais copier coller cette colonne à coté puis changer certains codes par d'autres. Les codes ayant été changer devrait apparaitre sur fond jaune.
    2) Je voudrais copier coller cette liste modifier à coté pour remplacer les codes par des numéros.

    J'ai donc créé le code suivant qui n'est certainement pas optimisé, et qui surtout, ne marche pas. Quand je le lance, le copier coller fonctionne bien mais rien n'est remplacé. Toutes les cases non utilisées sont rendu en fond jaune. Et les chiffre apparaissent sous la liste de code...
    De plus, à la manière donc je l'ai codé, la liste est limité à 60 codes...
    Que s'est-il passé ? Comment corriger ce code ? Comment l'améliorer pour qu'il prenne en compte une colonne entière (les listes que je veux lui faire remplacer sont de longueurs variables) ?

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Function changer(code1, code2)
     
       Selection.Replace What:=code1, Replacement:=code2, LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=True
     
    End Function
    Sub conversion()
    ' Conversion Macro
    ' Macro enregistrée le 06/12/2012 par Mathspountz
    ' Touche de raccourci du clavier: Ctrl+p
     
    Range("A2:A100").Select
        Application.CutCopyMode = False
        Selection.Copy
        Range("C2").Select
        ActiveSheet.Paste
    'copier coller
     
    With Application.ReplaceFormat.Font
            .FontStyle = "Gras"
            .Subscript = False
        End With
        Application.ReplaceFormat.Interior.ColorIndex = 6
    'mise en page des remplacements
     
    Call changer(AABB, CCDD)
    Call changer(AACC, GGTT)
    Call changer(YYTT, IUJN)
    Call changer(PPOO, Error)
    'liste des choses à changer
     
    Range("C2:C100").Select
        Application.CutCopyMode = False
        Selection.Copy
        Range("E2").Select
        ActiveSheet.Paste
    'copier coller
     
    Call changer(AABB, 800)
    Call changer(AACC, 700)
    Call changer(YYTT, 600)
    Call changer(PPOO, 500)
    'liste des choses à changer
     
    End sub

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

    Ca ne résoudra probablement pas ton problème mais ta fonction n'en est pas une car elle ne renvoie rien.

    Remplace Function / End Function par Sub / End Sub.

    Une autre piste:

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Range("A2:A100").Select
        Application.CutCopyMode = False
        Selection.Copy
        Range("C2").Select
        ActiveSheet.Paste
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Application.CutCopyMode = False
      With ActiveSheet
        .Range("A2:A100").Copy .Range("C2")
      End With
    De même pour "C2:C100" -> "E2"

    A force de regarder ton code, je crois que ton problème est à l'intérieur de ta "fonction".
    Tu y travailles sur la Selection mais une seule cellule est sélectionnée (C2 ou E2) lors de l'appel.
    Il vaudrait mieux que tu passes la colonne à traiter en paramètre.
    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!

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Merci pour ta réponse,

    Je vais prendre en compte ce que tu dis, ça me donne une piste car j'étais vraiment bloqué étant un jeune padawan. Le temps d'y réflechir et de tester je donnerai des nouvelles demain !

    Merci encore.

  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,

    Comme dit Alain, une fonction est sensée retourner une ou des valeurs. Excel sait bien faire certaines choses en l'occurrence effectuer le remplacement de valeurs dans une plage entière sans que l'on soit obligé de boucler. Dans mon exemple, le bouclage se fait sur le tableau contenant les codes à remplacer et de remplacement (le compilateur faisant lui même sa boucle de remplacement sur la plage concernée) :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Sub conversion()
     
        Dim Tbl()
        Dim I As Integer
     
        'défini les dimensions du tableau de remplacement des code
        'dimension 1 les codes à remplacer, dimension 2 les codes de remplacement
        ReDim Tbl(1 To 2, 1 To 4)
     
        Tbl(1, 1) = "AABB": Tbl(2, 1) = "CCDD"
        Tbl(1, 2) = "AACC": Tbl(2, 2) = "GGTT"
        Tbl(1, 3) = "YYTT": Tbl(2, 3) = "IUJN"
        Tbl(1, 4) = "PPOO": Tbl(2, 4) = "Error"
     
        'copie de A en C
        Range("A2:A100").Copy Range("C2")
     
        'boucle sur le tableau et effectue les remplacement
        'en une fois par code (Excel sait le faire alors laisson-le ;o) ne pas ré-inventer la roue)
        For I = 1 To UBound(Tbl, 2)
     
            Range("A2:A100").Replace Tbl(1, I), Tbl(2, I)
     
        Next I
     
        'second groupe de codes
        Tbl(1, 1) = "AABB": Tbl(2, 1) = 800
        Tbl(1, 2) = "AACC": Tbl(2, 2) = 700
        Tbl(1, 3) = "YYTT": Tbl(2, 3) = 600
        Tbl(1, 4) = "PPOO": Tbl(2, 4) = 500
     
        'copie de C en E
        Range("C2:C100").Copy Range("E2")
     
        'boucle sur le tableau et effectue les remplacement
        For I = 1 To 4
     
            Range("C2:C100").Replace Tbl(1, I), Tbl(2, I)
     
        Next I
     
    End Sub
    Hervé.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Bonjour,

    Ton code fonctionne très bien Theze, je ne suis pas encore super à l'aise avec les dim mais cet exemple m'aide à comprendre un peu mieux cet aspect.

    De plus le "replace" facilite grandement le code en effet !

    Par contre est ce qu'il y a moyen de parametrer vis à vis de la tipographie des remplacements ? Exemple, tous les changements sont surlignés, ou en gras etc...

    Merci beaucoup en tout cas.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Juste par curiosité,

    Est-il possible de faire un tableau à trois colonnes par exemple :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Sub conversion()
     
        Dim Tbl()
        Dim I As Integer
     
        ReDim Tbl(1 To 3, 1 To 4)
     
        Tbl(1, 1) = "AABB": Tbl(2, 1) = "CCDD": Tbl(3, 1) = 800
        Tbl(1, 2) = "AACC": Tbl(2, 2) = "GGTT": Tbl(3, 2) = 700
        Tbl(1, 3) = "YYTT": Tbl(2, 3) = "IUJN": Tbl(3, 3) = 600
        Tbl(1, 4) = "PPOO": Tbl(2, 4) = "Error": Tbl(3, 4) = 500
     
        'copie de A en C
        Range("A2:A100").Copy Range("C2")
     
        'Remplacement 1
        For I = 1 To UBound(Tbl, 2)
     
        Range("C2:C100").Replace Tbl(1, I), Tbl(2, I)
     
        Next I
     
        'copie de C en E
        Range("C2:C100").Copy Range("E2") 
     
        'remplacement 2
        For I = 1 To UBound(Tbl, 3)
     
        Range("E2:E100").Replace Tbl(2, I), Tbl(3, I)
     
        Next I
     
    End Sub
    Comme ca si j'ai 100 codes auxquelles se réfèrent toujours les 15 mêmes informations, je peux créer un tableau (1 to 15, 1 to 100) ?

    Vous qui avez l'expérience, qu'est ce qui est préférable ?

    2e question, est-il possible de remplacer le bloc :
    Tbl(1, 1) = "AABB": Tbl(2, 1) = "CCDD": Tbl(3, 1) = 800
    Tbl(1, 2) = "AACC": Tbl(2, 2) = "GGTT": Tbl(3, 2) = 700
    Tbl(1, 3) = "YYTT": Tbl(2, 3) = "IUJN": Tbl(3, 3) = 600
    Tbl(1, 4) = "PPOO": Tbl(2, 4) = "Error": Tbl(3, 4) = 500

    Parce que un bloc de 15*100 comme ca me parait compliqué et propice aux erreurs...
    Genre dim Tbl("A1:C4") ou dim Tbl("A1:O100" ... ?

    Par un tableau de 3*4 cellules excel ? Ce qui permettrait de modifier rapidement les informations ?

Discussions similaires

  1. [Mail] Probleme fonction mail()
    Par tissot dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2005, 12h55
  2. problème fonctions callback
    Par youp_db dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/10/2005, 14h47
  3. probleme fonction gethostbyname
    Par oclone dans le forum Développement
    Réponses: 6
    Dernier message: 14/04/2005, 10h31
  4. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52
  5. Probleme avec remplacement de caractere
    Par genzo93 dans le forum ASP
    Réponses: 9
    Dernier message: 18/01/2005, 10h51

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