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 :

Comportement étrange de Vba


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    technicien télévision retraité
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien télévision retraité

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Comportement étrange de Vba
    Bonjour,

    J'ai un programme que j'ai fait en Vba et qui fonctionne depuis des années. Tout à coup, ça plante. En y allant de pas à pas, je finis par trouver exactement où. C'est la méthode « replace » qui, vous ne le croirez pas, fait changer la feuille active. (!!!!)

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        With Rg
            .Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
            MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
            .Replace What:="'", Replacement:=""
            .Replace What:="-", Replacement:=""
            .Replace What:="é", Replacement:="e"
            .Replace What:="ê", Replacement:="e"
              [...............ici on saute une douzaine de remplacements]
            .Replace What:="ù", Replacement:="u"
        End With
    Il s'agit de remplacer les espaces et les caractères accentués d'une chaîne qui est dans une cellule. Rg est une variable de type « range » qui pointe sur cette cellule.

    Aussitôt que le programme arrive au premier « replace », le focus passe de la feuille 1 à la feuille 2. Comme je suis en pas à pas, je peux cliquer pour redonner le focus à la page 1 et alors, au deuxième « replace », de nouveau c'est la feuille 2 qui est activée. Si je clique sur une autre feuille, 3, 4, 5, c'est toujours la feuille 2 qui est réactivée si je fais avancer le programme d'une ligne.

    Je travail avec une version Office 2007 qui a toujours bien fonctionné. J'ai fait rouler les diagnostiques dans l'option « Ressources » de mon Excel et tout semble en ordre. Sauf qu'à la fin, on m'envoie sur le Net chez Microsoft sur une page qui n'existe plus.

    Pierre Cloutier


    ---

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    et où et comment as-tu déclaré et initialisé la variable Rg ?
    (on ne le voit pas dans ton bout de code).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    technicien télévision retraité
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien télévision retraité

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Comportement étrange de Vba
    Bonjour et merci de votre réponse,

    Voici la fonction qui appelle le code en question :
    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
    Function SaS(a As String, f As Boolean) As String
                          ' Enlève les accents à une Chaîne  ''''  si f est vrai, force en minuscules
                          ' Fait un Range avec la chaîne puis appelle Sa
    Dim Rg As Range
     
    Application.ScreenUpdating = False
    Range(TrouveChrCol("XX") & "2").Select    ' la fonction TrouveChrCol trouve le caractère de la colonne qui a "XX" en cellule 1
    Selection.Value = a  ' a est la chaîne à modifier
     
    Set Rg = Selection
    Sa Rg         ' enlève les accents
     
    If f Then
        SaS = LCase(Rg.Value)             
    Else
        SaS = Rg.Value
    End If
     
    End Function
    Et voici la procédure « Sa » (Sans Accent) complète.
    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
     
    Sub Sa(Rg As Range)      ' Sa = Sans Accent
                      ' Enlève les accents ; ô devient o
     
    Application.ScreenUpdating = False
     
        With Rg
            .Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
            MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
            .Replace What:="'", Replacement:=""
            .Replace What:="-", Replacement:=""
            .Replace What:="é", Replacement:="e"
            .Replace What:="ê", Replacement:="e"
            .Replace What:="è", Replacement:="e"
            .Replace What:="ë", Replacement:="e"
            .Replace What:="ï", Replacement:="i"
            .Replace What:="î", Replacement:="i"
            .Replace What:="à", Replacement:="a"
            .Replace What:="â", Replacement:="a"
            .Replace What:="á", Replacement:="a"
            .Replace What:="ç", Replacement:="c"
            .Replace What:="ô", Replacement:="o"
            .Replace What:="ó", Replacement:="o"
            .Replace What:="ö", Replacement:="o"
            .Replace What:="û", Replacement:="u"
            .Replace What:="ù", Replacement:="u"
        End With
     
    End Sub
    En Vba, je suis un inculte. J'ai tout appris par moi-même et donc il me manque beaucoup de base. Mais je suis débrouillard et je réussis quand même à parvenir à mes buts. Dans ce cas-ci, j'ai vu que le « Chercher/Remplacer » ne fonctionne qu'avec un Range. J'utilise donc une cellule en dehors de mon tableau, j'y place ma chaîne et cette cellule devient Rg. Ensuite la méthode « replace » peut-être utilisée.

    Explication :
    La fonction principale s'appelle SaS et elle appelle Sa. À l'aide de ma fonction TrouveChrCol() elle trouve le caractère de la colonne qui a "XX" en rangée 1. C'est que mon tableau (une liste de membres) augmente d'une colonne à chaque événement auquel ces membres sont invités. Donc la colonne "XX" change de nom régulièrement. Aujourd'hui : KL ou 298.


    ---

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Pourquoi utilises-tu la Méthode Range.Replace alors que tu ne veux finalement travailler que sur une chaîne de caractères (la valeur d'une seule cellule) ?
    Utilise tout simplement la FONCTION Relace (rubrique Replace, Fonction de ton aide VBA interne)
    Tu feras ainsi de surcroît l'économie d'un objet (Rg).
    Ce qui devrait donner (écrit à main levée) --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sas = Range(TrouveChrCol("XX") & "2").value
    avec = array("é","è", "à" ......(tes lettres accentuées à remplacer ....)
    sans = arra("e","e,"a, .... les lettres de remplacement, dans le même ordre ...)
    for k = 0 to ubound(avec)
      Sas = replace(Sas, avec(k), sans(k)
    next
    puis ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If f Then
        SaS = LCase(Sas)             
     '''''''''''''''''''''''''''''''''''''Else  ' totalement inutile
     '''''''''''''''''''''''''''''''''''   SaS = Rg.Value ' totalement inutile
    End If
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    technicien télévision retraité
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien télévision retraité

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Comportement étrange de Vba
    Bonjour,
    Pourquoi utilises-tu la Méthode Range.Replace alors que tu ne veux finalement travailler que sur une chaîne de caractères (la valeur d'une seule cellule) ?
    Comme je vous ai dit, ça fait 8 ou 9 ans que j'ai écris ce code. Je débutais en Vba Excel et j'utilisais l'enregistreur de macros pour m'indiquer les bonnes (??) méthodes à utiliser. Ce n'est que beaucoup plus tard que j'ai découvert qu'il y avait aussi une fonction « Replace » et je m'en suis servi à d'autres occasions par la suite.

    Comme je vous ai dit aussi, ce code fonctionnait depuis des années. Pourquoi, tout à coup, cette commande fait-elle flippé la feuille Excel ?

    Que s'est-il passé ? Serait-ce une de ces mises à jour de Microsoft ?

    Bon, étant pro-actif, j'ai fait quelques tests :

    Peu importe quelle est la feuille active, le passage du curseur (surlignement jaune) sur cette ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Replace What:="'", Replacement:=""
    fait passer à la feuille 2. Toujours la feuille 2 peu importe quelle feuille est active à ce moment-là.

    J'ai essayé de changer de colonne. Pour cela, sans modifier le code, j'ai changé la valeur de la variable pointeur à la main dans la fenêtre Exécution. Et là, plus de problème. Mais un autre test m'a montré que ce n'est pas le numéro de la colonne qui cause le problème. Tout laisse croire que c'est le code lui-même où est déterminé l'adresse de la cellule à traiter. Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Rg As Range
     
    Range(TrouveChrCol("XX") & "2").Select    ' la fonction TrouveChrCol trouve le caractère de la colonne qui a "XX" en cellule 1
    Selection.Value = a  ' a est la chaîne à modifier
    Set Rg = Selection
     
    Sa Rg         ' enlève les accents
    J'ai donc essayé une toute petite modification qui semble être absolument la même chose. Voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Rg As Range
     
    Set Rg = Range(TrouveChrCol("XX") & "2")       ' la fonction TrouveChrCol trouve le caractère de la colonne qui a "XX" en cellule 1 
    Rg.Value = a    ' a est la chaîne à modifier
     
    Sa Rg         ' enlève les accents
    La différence : 2 lignes au lieu de 3 (plus élégant) et je n'utilise plus le mot clé Selection. Et là, le problème est résolu !

    Y a-t-il quelque chose à comprendre là-dedans ? J'ai souvent lu, sur des forums, des critiques sur l'utilisation du mot clé Selection. Mais au point de faire planter les programmes... non. Et, de toutes façons, l'enregistreur de macros d'Excel utilise Selection à profusion.

    Pierre Cloutier


    ---

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    J'ai souvent lu, sur des forums, des critiques sur l'utilisation du mot clé Selection.
    Ces critiques sont parfaitement justifiées.
    Et, de toutes façons, l'enregistreur de macros d'Excel utilise Selection à profusion.
    Et pour cause, puisque l'enregistreur de macro ne fait que coder chacun des gestes de l'utilisateur !
    amuse-toi donc à sélectionner A1, puis B1, puis C1, puis de nouveau A1 -->> bête et discipliné, il écrira bêtement :
    range("A1").select
    range("B1").select
    range("C1").select
    range("A1").select
    pour en revenir à ton problème : il est plus que probable que la feuille active au moment de l'exécution de ta macro était tout simplement la feuille 2
    Ce genre de désagrément ne se produit pas (ne peut se produire) lorsque l'on travaille systématiquement avec les objets Excel,parmi lesquels les objets Range, que l'on détermine avec précision, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workbooks("nom_du_classeur").worksheets("nom_de_la_feuille").range(.....)
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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