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 :

La macro stoppe à ExecuteExcel4Macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant en modélisation financière
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en modélisation financière
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut La macro stoppe à ExecuteExcel4Macro
    Bonjour,

    J'ai créé une macro de mise en forme conditionnelle d'un tableau de relevés de prix pour que, notamment, la quantité achetée d'un article soit affichée dans un format correspondant au type de quantité mise à la vente. Par exemple, si l'article est vendu à l'unité, le format sera # ##0 ; s'il est vendu au kg, le format sera # ##0,000 kg ; s'il est vendu au litre, le format sera # ##0,000 l ; etc.

    Je ne suis pas un professionnel et j'ai créé cette macro à l'aide la commande "Enregistrer une macro". A chaque mise en forme conditionnelle d'un nombre, cette commande a ajouté une ligne "ExecuteExcel4Macro". Mais lorsque je lance la macro, elle s'arrête à la première ligne "ExecuteExcel4Macro" [dont je ne comprends d'ailleurs ni le fonctionnement ni l'utilité ici ;-)].

    Le message d'erreur est le suivant :

    Nom : Capture d’écran 2023-09-11 100107.jpg
Affichages : 198
Taille : 22,4 Ko

    Nota : La commande "Enregistrer une macro" ne crée pas de ligne "ExecuteExcel4Macro" pour d'autres mises en forme que celle des formats de nombres ; il n'y en a pas, par exemple pour la création de traits de séparation en fonction de la date, de l'acheteur (payeur) ou du tiers (magasin) ...

    Voici le code de ma macro :

    Sub MiseEnForme()
    '
    ' Mise en forme conditionnelle du tableau :
    ' - Application des formats appropriés en fonction du type de quantité mise à la vente
    ' - Insertion d'une bordure entre chaque date et chaque tiers
    '

    Application.ScreenUpdating = False

    Dim Plage As Range

    'Redéfinit les champs nommés

    'Identifie la dernière ligne du tableau de la feuille active
    ActiveSheet.Range("N1").Select
    Selection.End(xlDown).Offset(0, -1).Select
    Selection.End(xlUp).Select
    L = ActiveCell.Row

    'Définit le tableau des données dans la feuille sélectionnée
    With ActiveSheet
    Set Plage = Range("A1:M" & L)
    ActiveWorkbook.Names("Tableau").RefersTo = Plage
    End With

    'Définit la colonne des quantités
    With ActiveSheet
    Set Plage = Range("G1:G" & L)
    ActiveWorkbook.Names("Quantités").RefersTo = Plage
    End With

    'Définit la colonne des prix
    With ActiveSheet
    Set Plage = Range("H1:H" & L)
    ActiveWorkbook.Names("Prix").RefersTo = Plage
    End With

    'Définit la colonne des vérifications
    With ActiveSheet
    Set Plage = Range("M1:M" & L)
    ActiveWorkbook.Names("Vérifications").RefersTo = Plage
    End With

    'Crée les règles de mise en forme conditionnelle du tableau

    'Annule les précédentes règles
    Range("Tableau").Select
    Cells.FormatConditions.Delete

    'Règle 1 : Applique le format nombre standard aux cellules contenant des quantités de type "unité" dans la colonne G
    Range("Quantités").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$F1=""unité"""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    ExecuteExcel4Macro "(2,1,""# ##0"")"
    Selection.FormatConditions(1).StopIfTrue = False

    'Règle 2 : Applique le format nombre 0,000 kg aux cellules contenant des quantités de type "kg" dans la colonne G
    Range("Quantités").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$F1=""kg"""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    ExecuteExcel4Macro "(2,1,""# ##0,000"" kg"""")"
    Selection.FormatConditions(1).StopIfTrue = False

    ...

    'Règle 9 : Trace un trait de séparation entre les dates, les payeurs et les tiers sur toute la largeur du tableau
    Range("Tableau").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
    "=OU($A1<>$A1;$B2<>$B1;$D2<>$D2)"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Borders(xlBottom)
    .LineStyle = xlContinuous
    .TintAndShade = 0
    .Weight = xlThin
    End With
    Selection.FormatConditions(1).StopIfTrue = False

    Range("A1").Select
    Application.ScreenUpdating = True

    End Sub

    Savez-vous pourquoi la macro bloque sur ces lignes "ExecuteExcel4Macro" ? Merci d'avance pour vos lumières !

  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
    13 158
    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 158
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne sais pas ce que vous avez utilisé comme commande en enregistrant votre macro car ExecuteExcel4Macro provient des anciennes macros avant que l'on utilise le VBA.
    Pour obtenir ce que vous souhaitez, il faut utiliser le format personnalisé et en VBA le format nombre d'une cellule, c'est la propriété NumberFormat que je ne vois pas dans votre code.
    Je n'utilise jamais de code VBA pour la mise en forme conditionnelle, je le fais manuellement.
    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
    Nouveau membre du Club
    Homme Profil pro
    Consultant en modélisation financière
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en modélisation financière
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Je ne sais pas ce que vous avez utilisé comme commande en enregistrant votre macro car ExecuteExcel4Macro provient des anciennes macros avant que l'on utilise le VBA.
    Pour obtenir ce que vous souhaitez, il faut utiliser le format personnalisé et en VBA le format nombre d'une cellule, c'est la propriété NumberFormat que je ne vois pas dans votre code.
    Je n'utilise jamais de code VBA pour la mise en forme conditionnelle, je le fais manuellement.
    Merci de cette indication. Personnellement je n'avais jamais vu et je connaissais pas cette instruction ExecuteExcel4Macro : c'est en utilisant la fonctionnalité d'enregistrement automatique d'une macro proposée par Excel dans le menu développeur qu'elle est apparue toute seule dans les lignes de codes [mais où va-t-on si Excel ne sait pas exécuter les commandes qu'il propose lui même :-) !]

    Pièce jointe 643723

    Dans mon cas, je ne peux laisser la mise en forme conditionnelle à la main de l'utilisateur : il faut que je la code en VBA. Or, en ce qui concerne la propriété NumberFormat, il me semble qu'elle permet de formater des nombres dans une plage déterminée, mais je ne vois pas comment l'utiliser dans une mise en forme conditionnelle programmée en VBA.

  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 158
    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 158
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans mon cas, je ne peux laisser la mise en forme conditionnelle à la main de l'utilisateur : il faut que je la code en VBA.
    Je ne laisse pas non plus les utilisateurs appliquer la mise en forme conditionnelle. Je voulais juste dire que je ne vois pas la raison de faire en VBA ce que je peux faire manuellement en quelques minutes.

    Voici un exemple de code avec une mise en forme conditionnelle sur la colonne "Qté" du tableau nommé "t_Catalogue"
    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
    Sub ApplyConditionalFormatting()
      Const TableName As String = "t_Catalogue"       ' Nom de la table
      Const LabelName As String = "Qté"               ' Colonne où appliquer la MFC
      Const FormulaPattern As String = "=(D3=<Type>)" ' Modèle de la formule
      Const NumberPattern As String = "#.##0 <Unité>" ' Modèle du format nombre à appliquer
      Dim l As ListObject            ' Table à traiter
      Dim r As Range                 ' Plage où appliquer la MFC (voir LabeName)
      Dim t As Variant, u As Variant ' Tables
      Dim e As Byte
      Set l = Range(TableName).ListObject
      Set r = l.ListColumns("Qté").DataBodyRange
      t = Array("Poids;Kg", "Longueur;m", "Unité;Pcs")
      ' Effacer tous les formats conditionnels existants
      r.FormatConditions.Delete
      ' Appliquer le format conditionnel suivant liste t
      For e = LBound(t) To UBound(t)
        u = Split(t(e), ";")
        With r.FormatConditions.Add(Type:=xlExpression, Formula1:=Replace(FormulaPattern, "<Type>", Chr(34) & u(0) & Chr(34)))
        .NumberFormat = Replace(NumberPattern, "<Unité>", Chr(34) & u(1) & Chr(34))
        End With
      Next
      Set l = Nothing: Set r = Nothing
    End Sub
    Illustration

    Nom : 230911 dvp ConditionnalFormating_NumberFormat.png
Affichages : 180
Taille : 10,6 Ko
    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
    Nouveau membre du Club
    Homme Profil pro
    Consultant en modélisation financière
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en modélisation financière
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut La macro stoppe à ExecuteExcel4Macro
    OK, merci beaucoup : j'ai un exemple sérieux.

    Maintenant, je vais essayer de le décrypter ;-).

    En tout cas, il me reste beaucoup à apprendre !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Consultant en modélisation financière
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en modélisation financière
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Voici un exemple de code avec une mise en forme conditionnelle sur la colonne "Qté" du tableau nommé "t_Catalogue"
    L'idée que vous m'avez donnée d'utiliser NumberFormat, votre exemple et quelques autres recherches sur le net m'ont permis, enfin, de faire tourner ma macro.

    C'est quand même extraordinaire que la commande "Enregistrer une macro" d'Excel 365 fournisse du code erroné !

    En tout cas, merci encore : l'aide sur ce forum est précieuse !

Discussions similaires

  1. [XL-2010] Peut-on empêcher une macro d'être stoppée ?
    Par Justunpeu dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/11/2018, 20h47
  2. [XL-2010] Macro stoppe à la 65536e ligne !
    Par Stardust31 dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 24/02/2018, 14h14
  3. Macro stoppée par correcteur orthographique
    Par ilcocodrillo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/08/2008, 14h33
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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