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 :

Renommer une "Function" en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut Renommer une "Function" en VBA
    Bonjour à tous,

    Dans un fichier, j'ai une mise en valeur de la colonne filtrée qui se fait grâce à la mise en forme conditionnelle et une fonction j'ai trouvé sur un forum (je vous la donne car elle est bien pratique ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function ChampActif(C)
      Application.Volatile
      ChampActif = Sheets(Application.Caller.Parent.Name).AutoFilter.Filters.Item(C.Column - Sheets(Application.Caller.Parent.Name).Range("_FilterDataBase").Column + 1).On
    End Function
    Ce même fichier est alimenté régulièrement grâce à une macro qui vérifie si les enregistrements son déjà présents.

    Tout cela me donnais satisfaction jusqu’à ce que j' ajoute des instruction de mise en forme (quadrillage) pour faciliter la lecture.

    La, ma macro ne fonctionne plus ! Arrivée à la ligne ou j'applique le quadrillage ( .BorderAround Weight:=xlThin) la macro stoppe sans message d'erreur...

    Après bien des tâtonnements, j'ai trouvé que cela arrivait a cause de la mise en forme conditionnelle (si je la supprime, la macro roule sans problème) et je suis à la recherche d'un moyen d'arriver à faire cohabiter tout cela.

    - J'ai essayé de désactiver le traitement des évènements avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False
    : mauvaise piste, ça ne marche pas (car la fonction n'est pas un évènement ?)

    - J'ai essayé de supprimer la mise en forme conditionnelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .FormatConditions.Delete
    pour la rétablir après le traitement mais l'execution s'arrête sans message d'erreur à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= "=champactif(A1)"
    .

    - A la main, j'ai renommé la fonction "ChampActif" et là ma macro s'exécute sans problème...

    Selon vous :

    1/ je fais ça en vba : renommer "ChampActif" en "machino", exécuter mon code de mise à jour et de mise en forme puis renommer "machino" en "ChampActif" => Comment renommer une macro en vba ?

    2/ vous connaissez un autre moyen plus élégant.

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

    Sans voir le code au complet, difficile de t'aider mais renommer une Fonction pour que le code s'exécute comme il faut, ça je n'ai jamais vu !
    vous connaissez un autre moyen plus élégant.
    Une manière plus élégante, sans trop m'avancer je dirai oui mais comme dit, il faut voir le code au complet.

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Puisque Champactif c'est l'application d'un filtre automatique, pourquoi ne pas remplacer ton filtre automatique par un filtre Avancé (élaboré) ?

    Cela te permettrait d'afficher le résultat de ton filtre dans une plage ou même une feuille différente; feuille différente qui peut être sans mise en forme automatique, et ne pas nuire à la feuille d'origine.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Oui... mais non.
    Le fichier est partagé par plusieurs personnes et ne peux pas subir de telles modification.
    J'en fais la mise à jour régulièrement d'ou l'utilisation de macro mais "en exploitation" le fichier doit rester avec ses filtres auto.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    @ Theze:

    Le code en lui même est tout bê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
    Sub MAJ_FORMAT()
        Dim ValEtat As String
        Dim lig As Integer
        Dim premlig As Integer
        Dim derlig2 As Integer
        premlig = 1
        derlig2 = Range("A100000").End(xlUp).Row
        For lig = 2 To derlig2 + 1
                If Cells(lig, 25).Value <> Cells(lig - 1, 25).Value Then
                    With Sheets("journal").Range(Cells(premlig, 1), Cells(lig - 1, 32))
                        .BorderAround Weight:=xlThin
                        .Borders(xlInsideHorizontal).LineStyle = xlNone
                    End With
                    premlig = lig
               End If
        Next lig
    End Sub
    Il fonctionne parfaitement seul ou appelé depuis une autre macro... tant que ma fonction "champactif" n'est pas là.
    Si elle est présente le code s'arrête sans message d'erreur.
    Si je la supprime ou si j'en change le nom, tout se passe bien.

    Citation Envoyé par Theze Voir le message
    renommer une Fonction pour que le code s'exécute comme il faut, ça je n'ai jamais vu !
    Comme le code bloque sur cette fonction "perso", mon idée c'est de supprimer (temporairement) la cause du blocage.

  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
    C'est quoi qui déclenche l'appel de la fonction "ChampActif" durant le déroulement du code de la proc "MAJ_FORMAT", une procédure évènementielle dans une feuille ou le classeur ?

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Pour ceux que ça peut intéresser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Function_Rename()
    With ThisWorkbook.VBProject.VBComponents("MODULE").codemodule
    .ReplaceLine .ProcStartLine("nom_fonction1", 0), Replace(.Lines(.ProcStartLine("nom_fonction1", 0), 1), "nom_fonction1", "nom_fonction2")
    End With
    End Su
    avec
    MODULE = le nom du module ou se trouve la fonction
    nom_fonction1 = ancien nom
    nom_fonction2 = nouveau nom
    Cerise sur le gâteau : le même code marche pour une macro.

    Ca ne marche que si la fonction est en ligne 1 du module sans doute à cause d'un problème avec la recherche du nom de la fonction dans le module...
    Ceux qui comprennent mieux que moi sauront faire marcher ce code correctement.

    Ca fait le boulot pour moi : j'ai placé la fonction à renommer en haut du module. (le roi de l'esquive j'vous dis)

    A+

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    @ Theze :
    C'est quoi qui déclenche l'appel de la fonction "ChampActif" durant le déroulement du code de la proc "MAJ_FORMAT", une procédure évènementielle dans une feuille ou le classeur ?
    Aucune idée.
    Tout ça pour moi c'est de l'hébreu.
    Je ne pige pas grande chose à la programmation. Je glane des bout de code à gauche à droite et je les fais fonctionner entre eux de manière empirique...

    Tout ce que je peux te dire c'est :
    * Sur la feuille, la première ligne du tableau comporte des filtres.
    * Sur la ligne de filtre j'ai appliqué un formatage conditionnel qui colore en rouge vif le titre de la colonne ayant un filtre actif.
    * Le test de cette condition se fait grâce à la fonction "champactif".
    * Une première macro effectue une MAJ des données. Pendant ce traitement un section applique un formatage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With FL2.Range("a" & derlig2 & ":AF" & derlig2)
                            .VerticalAlignment = xlCenter
                            .Borders.LineStyle = xlContinuous
                            .Font.Color = 0
    End With
    * Après la mise à jour du fichier une macro "MAJ_FORMAT" ajuste le quadrillage des lignes pour faciliter la lecture.
    * Si j’exécute pas à pas "MAJ_FORMAT" sans rien modifier ça s'arrête sans message d'erreur sur la ligne ".BorderAround Weight:=xlThin" dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         With FL2.Range(Cells(premlig, 1), Cells(lig - 1, 32))
                        .BorderAround Weight:=xlThin
                        .Borders(xlInsideHorizontal).LineStyle = xlNone
    End With
    * Si je supprimer le formatage conditionnel ou si je supprime / renomme "champactif" alors "MAJ_FORMAT" se déroule sans problème.

    En te répondant, je me suis demandé si ce n'était pas ".BorderAround Weight:=xlThin" qui posait problème alors j'ai essayé de mettre ".Borders.LineStyle = xlContinuous" (utilisé juste avant) à la place pour voir si le code plantait...
    Et bien il plante aussi !

    Dans le même ordre d'idée j'ai essayé de changer la façon dont je désignais le range en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With "FL2.Range(Cells(premlig, 1), Cells(lig - 1, 32))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With FL2.Range("a" & premlig & ":AF" & lig - 1)
    ...
    Ca plante aussi.


    J'ai lu qq part que le formatage conditionnel cohabitait mal avec vba mais c'était plutôt technique et en anglais donc je n'ai pas saisi les subtilités.

    Merci de ton aide en tout cas.

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

    Une règle incontournable:
    Une fonction appelée depuis la formule d'une cellule ne peut faire que renvoyer une valeur. Elle ne peut en aucun cas effectuer de modification dans le classeur.
    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!

Discussions similaires

  1. Appeler une dll ou un autre module vba depuis une macro excel vba
    Par technobiz dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/11/2008, 14h24
  2. Comment renommer une feuille en VBA
    Par Jusomi31 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/04/2007, 15h43
  3. Demarrer une Macro/Appli VBA sans paser par les feruilles Excel
    Par size_one_1 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/12/2006, 21h23
  4. execute une macro via vba sous access
    Par nes dans le forum Access
    Réponses: 4
    Dernier message: 28/03/2006, 23h15
  5. Réaliser une macro en VBA pour excel afin de créer un graphe
    Par xavier le breuil dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2005, 14h41

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