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 :

Problème sur une macro créée en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut Problème sur une macro créée en VBA
    Bonjour,

    C'est encore moi avec une application VBA qui doit insérer une formule dans une case d'un fichier Excel.

    Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      Formule2 = "SUMPRODUCT((DI" & CStr(Debut) & ":DI" & CStr(Fin) & ">0)*(DG" & CStr(Debut) & ":DG" & CStr(Fin) & "=" & Quote & "IRP" & Quote & "))"
                    Formule3 = "(SUM(CC" & CStr(Debut) & ":CC" & CStr(Fin) & ")-SUM(DI" & CStr(Debut) & ":DI" & CStr(Fin) & "))/" & Formule2
                    Formule = "=IF(" & Formule2 & ">0;" & Formule3 & ";0)"
                    .Range(sColAI_IRP & Fin + indexLigne).Formula = Formule
                    .Range(sColAI_IRP & Fin + indexLigne).NumberFormat = "0.00%"
    Debut et Fin sont des valeurs numériques.
    Formule, Formule2 et Formule3 sont des chaines de caractères.
    sColAI_IRP est une chaine de caractères qui vaut "BO"

    Le code ci-dessus construit (dans la variable Formule) la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =IF(SUMPRODUCT((DI362:DI382>0)*(DG362:DG382="IRP"))>0;(SUM(CC362:CC382)-SUM(DI362:DI382))/SUMPRODUCT((DI362:DI382>0)*(DG362:DG382="IRP"));0)
    J'ai copié la macro dans le bloc note, j'ai remplacé SUMPRODUCT par SOMMEPROD, SUM par SOMME et IF par SI. J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(SOMMEPROD((DI362:DI382>0)*(DG362:DG382="IRP"))>0;(SOMME(CC362:CC382)-SOMME(DI362:DI382))/SOMMEPROD((DI362:DI382>0)*(DG362:DG382="IRP"));0)
    et si je colle cette version "traduite" dans une case de mon fichier Excel, elle marche très bien.

    Malheureusement, quand j'exécute le code VBA donné ci-dessus (qui construit la même macro dans la variable Formule, avec les noms des fonctions en anglais), j'ai une erreur 1004 ("Erreur définie par l'application ou l'objet") qui se déclenche sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Range(sColAI_IRP & Fin + indexLigne).Formula = Formule
    c'est à dire quand j'affecte la macro à une case de ma feuille Excel.
    Pourtant, j'ai vérifié qu'elle marchait très bien quand je la colle moi même dans un fichier Excel.

    Si vous avez une idée qui expliquerait ce comportement, merci de me la soumettre. Pour ma part, j'y ai passé plus d'une heure sans succès ...

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    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 : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Malheureusement, quand j'exécute le code VBA donné ci-dessus (qui construit la même macro dans la variable Formule, avec les noms des fonctions en anglais), j'ai une erreur qui se déclenche sur la ligne :
    Quand tu demandes de l'aide et que tu reçois un message d'erreur, il n'est pas superflu de donner le code et le message d'erreur.

    Je vois au moins deux problèmes
    Que renvoie ce calcul sColAI_IRP & Fin + indexLigne vraisemblablement pas une référence correcte et de plus ta formule utilise des références relatives or il me semble que tu insères la formule en une fois sur plusieurs cellules. Si c'ets le cas, il faut utiliser des références absolues.
    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

  3. #3
    Membre expérimenté
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Points : 1 580
    Points
    1 580
    Par défaut
    Bonjour,
    Pour passer du français à l'anglais, il ne suffit pas de traduire les fonctions. Il faut aussi remplacer les point-virgules par des virgules pour séparer les paramètres :-)
    Une autre solution plus simple consiste à utiliser la méthode FormulaLocale et à mettre dedans la formule en français.

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    J'ai rectifié mon message après coup pour indiquer le type d'erreur (1004) que je reçois.

    Par ailleurs, le calcul :

    sColAI_IRP & Fin + indexLigne

    renvoie "B0" & 382 + 4 soit "BO386" dans un fichier qui contient plus de 800 lignes et dont les colonnes vont de "A" à "DI".

    Je génère la macro avec l'aide de plusieurs variables (Formule, Formule2 et Formule3), mais je ne l'insert que dans une seule case, à savoir "BO382". Je n'ai pas compris ta remarque sur les références relatives ou absolues ...

    Il faut dire que dans mon programme, un code quasiment similaire permet d'insérer d'autres formules à d'autres endroits du fichier, et que tout se passe bien.

  5. #5
    Membre expérimenté
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Points : 1 580
    Points
    1 580
    Par défaut
    Re,
    Est-ce que tu as essayé ma solution ?

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par tedo01 Voir le message
    Bonjour,
    Pour passer du français à l'anglais, il ne suffit pas de traduire les fonctions. Il faut aussi remplacer les point-virgules par des virgules pour séparer les paramètres :-)
    Une autre solution plus simple consiste à utiliser la méthode FormulaLocale et à mettre dedans la formule en français.
    Mais alors pourquoi la version française donnée dans mon premier message (avec des point virgules) fonctionne lorsque je la colle moi même dans le fichier Excel ?

    Citation Envoyé par tedo01 Voir le message
    Re,
    Est-ce que tu as essayé ma solution ?
    Pas encore, car j'ai dans le code d'autres macro construites de la meme façon et insérées de la même manière dans le fichier Excel, et cela fonctionne parfaitement. J'aimerais donc comprendre d'où vient le problème plutôt que de traiter d'une façon spécifique une macro qui devrait fonctionner comme les autres.

    Mais si je n'arrive pas à comprendre d'où vient le problème, cette suggestion m'aidera peut être à résodre mon problème ?

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    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 : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tedo01
    Pour passer du français à l'anglais, il ne suffit pas de traduire les fonctions. Il faut aussi remplacer les point-virgules par des virgules pour séparer les paramètres :-)
    Celle là m'avait échappée.

    IAmByB
    Je n'ai pas compris ta remarque sur les références relatives ou absolues ...
    SOMMEPROD fait référence à plusieurs cellule. par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD( (A2:A100="Ville") * 1)
    A2:A100 est une référence relative alors que $A$2:$A$100 est une référence absolue.
    Si tu devais recopier la formule sur plusieurs cellules il y aurait lieu de référencer la plage de manière absolue.
    Il y aussi les références mixtes comme $A2:$A100 et A$2:A$100.
    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

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    Alors là, je dois remercier tedo01 pour ses conseils. En effet, le problème venait du fait que dans la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Formule = "=IF(" & Formule2 & ">0;" & Formule3 & ";0)"
    j'utilisais des points virgule, alors que la ligne qui fonctionne est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Formule = "=IF(" & Formule2 & ">0," & Formule3 & ",0)"
    (avec des virgules).

    Merci beaucoup !!! C'est comme ça qu'on apprend.

  9. #9
    Membre expérimenté
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Points : 1 580
    Points
    1 580
    Par défaut
    re,
    Merci pour le retour.
    A noter que la syntaxe suivante marcherait aussi, ce qui peut être plus simple si on part d'une formule existante en Excel pour la coder en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Formule = "=SI(" & Formule2 & ">0;" & Formule3 & ";0)"
    .Range(sColAI_IRP & Fin + indexLigne).FormulaLocal = Formule

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

Discussions similaires

  1. VBA : problème sur une macros basé sur un SI
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/04/2009, 22h54
  2. problème sur une macro pour une conversion en VB6.3
    Par Zoldick dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/06/2008, 14h41
  3. [VBA] Menu qui pointe sur une macro contenue dans un fichier xla protégé
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/08/2007, 14h34
  4. Réponses: 4
    Dernier message: 16/06/2005, 15h37

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