Probleme de macro - WorksheetFunction.Product

Bonjour à tous,

Je reviens vers vous car j'ai un problème avec un fichier que j'ai créé pour le boulot.

J'ai créé un formulaire qui permet de remplir automatiquement mon fichier avec les informations qui m'intéressent.

Ces informations sont sensées alimenter des calculs qui se font automatiquement quand on clique sur le bouton 2 de mon formulaire. Ces calculs sont majoritairement de simples produits que je veux coder en VBA.

Or j'ai un problème avec ces produits, qui se trouvent dans le module 1 de mon fichier.

Je ne sais pas pourquoi, mes macro marchent une fois sur deux...

Est il possible de jeter un œil ?

J'y ai déjà passé des heures et impossible de comprendre ce qui coince...

Je vous envoie le fichier dans mon message suivant

Merci d'avance

En vous souhaitant une belle journée

Jeanne


Je fais remonter le sujet, dans l'espoir que quelqu'un ait une petite idée d'amélioration pour mes WorksheetFunction

D'avance, merci !!!

Une parties du code qui pose problème est la suivante

'remplir les colonnes de centre de couts avec les montants en euros
Sub CCineuros()

    Dim Column_68080 As Long
    Dim Column_84154 As Long
    Dim Column_80690 As Long
    Dim Column_80700 As Long
    Dim Column_61740 As Long
    Dim Column_55570 As Long
    Dim Column_80640 As Long
    Dim Column_83040 As Long
    Dim Column_02580 As Long
    Dim Column_83330 As Long
    Dim Column_FR80720 As Long
    Dim Column_FR09750 As Long
    Dim Column_FR09920 As Long
    Dim Column_TotalTTC  As Long
    Dim NextRow As Long

       Sheets("Données").Activate

    nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
    nb_l = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Row 'Nombre de lignes remplies

'déterminer quelles colonnes sont les bonnes colonnes
        For I = 1 To nb_c
            If Cells(1, I) Like "*68080 - Hub DA*" Then Column_68080 = Cells(1, I).Column
            If Cells(1, I) Like "*84154R Lux*" Then Column_84154 = Cells(1, I).Column
            If Cells(1, I) Like "*80690 Paris - 3155*" Then Column_80690 = Cells(1, I).Column
            If Cells(1, I) Like "*80700 BV - 3848*" Then Column_80700 = Cells(1, I).Column
            If Cells(1, I) Like "*6174 Val*" Then Column_61740 = Cells(1, I).Column
            If Cells(1, I) Like "*5557 Compta Instit*" Then Column_55570 = Cells(1, I).Column
            If Cells(1, I) Like "*80640 Londres*" Then Column_80640 = Cells(1, I).Column
            If Cells(1, I) Like "*83040 Italy*" Then Column_83040 = Cells(1, I).Column
            If Cells(1, I) Like "*02580 GC Custo*" Then Column_02580 = Cells(1, I).Column
            If Cells(1, I) Like "*8333 BAU Card/DIM*" Then Column_83330 = Cells(1, I).Column
            If Cells(1, I) Like "*FR80720 Madrid*" Then Column_FR80720 = Cells(1, I).Column
            If Cells(1, I) Like "*FR09750 OTC*" Then Column_FR09750 = Cells(1, I).Column
            If Cells(1, I) Like "*FR09920 MFS*" Then Column_FR09920 = Cells(1, I).Column
            If Cells(1, I) Like "*Total TTC*" Then Column_TotalTTC = Cells(1, I).Column

        Next I

'Mettre les colonnes en pourcentage à deux décimales
 For l = 2 To nb_l
        Cells(l, Column_68080).NumberFormat = "0.00%"
        Cells(l, Column_84154).NumberFormat = "0.00%"
        Cells(l, Column_80690).NumberFormat = "0.00%"
        Cells(l, Column_80700).NumberFormat = "0.00%"
        Cells(l, Column_61740).NumberFormat = "0.00%"
        Cells(l, Column_55570).NumberFormat = "0.00%"
        Cells(l, Column_80640).NumberFormat = "0.00%"
        Cells(l, Column_83040).NumberFormat = "0.00%"
        Cells(l, Column_02580).NumberFormat = "0.00%"
        Cells(l, Column_83330).NumberFormat = "0.00%"
        Cells(l, Column_FR80720).NumberFormat = "0.00%"
        Cells(l, Column_FR09750).NumberFormat = "0.00%"
        Cells(l, Column_FR09920).NumberFormat = "0.00%"
    Next l

    'Mettre les colonnes en pourcentage à deux décimales
 For l = 2 To nb_l
        Cells(l, Column_68080).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_84154).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_80690).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_80700).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_61740).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_55570).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_80640).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_83040).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_02580).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_83330).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_FR80720).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_FR09750).Offset(0, 1).NumberFormat = "0.00"
        Cells(l, Column_FR09920).Offset(0, 1).NumberFormat = "0.00"
    Next l

    'Détermine la prochaine ligne vide
    NextRow = Application.WorksheetFunction.Count(Column_68080 + 1) + 1

    'calculer le pourcentage

        Cells(NextRow, Column_68080).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_68080), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_84154).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_84154), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_80690).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_80690), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_80700).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_80700), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_61740).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_61740), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_55570).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_55570), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_80640).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_80640), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_83040).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_83040), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_02580).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_02580), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_83330).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_83330), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_FR80720).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_FR80720), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_FR09750).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_FR09750), Cells(NextRow, Column_TotalTTC))
        Cells(NextRow, Column_FR09920).Offset(0, 1) = WorksheetFunction.Product(Cells(NextRow, Column_FR09920), Cells(NextRow, Column_TotalTTC))

   'Remplir les cost centres vides
        If Cells(NextRow, Column_68080).Value = "" Then Cells(NextRow, Column_68080).Value = "0,00%"
        If Cells(NextRow, Column_84154).Value = "" Then Cells(NextRow, Column_84154).Value = "0,00%"
       If Cells(NextRow, Column_80690).Value = "" Then Cells(NextRow, Column_80690).Value = "0,00%"
       If Cells(NextRow, Column_80700).Value = "" Then Cells(NextRow, Column_80700).Value = "0,00%"
        If Cells(NextRow, Column_61740).Value = "" Then Cells(NextRow, Column_61740).Value = "0,00%"
       If Cells(NextRow, Column_55570).Value = "" Then Cells(NextRow, Column_55570).Value = "0,00%"
        If Cells(NextRow, Column_80640).Value = "" Then Cells(NextRow, Column_80640).Value = "0,00%"
        If Cells(NextRow, Column_83040).Value = "" Then Cells(NextRow, Column_83040).Value = "0,00%"
       If Cells(NextRow, Column_02580).Value = "" Then Cells(NextRow, Column_02580).Value = "0,00%"
       If Cells(NextRow, Column_83330).Value = "" Then Cells(NextRow, Column_83330).Value = "0,00%"
        If Cells(NextRow, Column_FR80720).Value = "" Then Cells(NextRow, Column_FR80720).Value = "0,00%"
        If Cells(NextRow, Column_FR09750).Value = "" Then Cells(NextRow, Column_FR09750).Value = "0,00%"
        If Cells(NextRow, Column_FR09920).Value = "" Then Cells(NextRow, Column_FR09920).Value = "0,00%"

End Sub

Et ce qui me pose problème entre autre, c'est la fameuse WorksheetFunction.Product qui parfois marche, parfois beugue, et je n'arrive pas à comprendre les raisons de ce beug

je fais remonter !

Bonjour,

Aucune donnée dans ton fichier, ça n'intéresse personne d'essayer de deviner quoi y mettre pour tester. Mettre 6-10 lignes où seules quelques-unes seront sélectionnées lors du test.

Et pas de modop minimum pour le faire fonctionner.

eric

Ma faute, j'ai pensé que ce serait clair mais c'est vrai que ça fait des heures que je travaille dessus

En fait je ne peux pas mettre de données car l'idée est qu'à chaque fois qu'on appuie sur le bouton, cela fasse apparaitre un formulaire. Le formulaire est okay et alimente bien la base de données des informations qu'on lui demande.

Ce qui me pose problème, c'est qu'une fois que le formulaire a alimenté ma base de donnée (onglet donnée dans le formulaire) suite au clique sur le bouton "1. Enregistrer les valeurs", l'utilisateur puisse cliquer sur le bouton "2. Appliquer les formules" et ainsi déclencher un calcul automatique de valeur, et notamment le calcul du Total TTC (montant HT * montant TVA), les couts alloués à chaque centres de couts (le formulaire alimentant les colonnes centre de couts avec un %), et la colonne "Amount in euros" dans le cas ou le montant enregistré dans le formulaire aurait été dans une devise autre que l'euro.

Ces calculs sont en fait de simples multiplications mais je peine à les écrire en code VBA... Mon code marche en fait une fois sur deux.

Pour ce faire, j'ai utilisé des WorksheetFunction.product, mais je ne suis pas sure que ce soit la bonne méthode...

Comme mon code fonctionne sur une base de "NextRow", il ne sert à rien que je remplisse plus mon fichier (à l'exception du code) que la première ligne, puisque tant qu'elle n'est pas rempli, le reste ne se remplit pas...

Je le joins à nouveau avec la première ligne remplie

Le code qui me pose problème se trouve dans le module 1.

Il porte les titres Sub Column_Amount_in_euros(), Sub Column_TotalTTC(), Sub CCineuros().

Voila un extrait (puisque je pense que ce qui me pose problème est particulièrement ces Worksheet Function :

Sub Column_TotalTTC()

    Dim Column_Amountineuros As Long
    Dim Column_TVA As Long
    Dim Column_TotalTTC As Long
    Dim NextRow As Long

    Sheets("Données").Activate

    nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
    nb_l = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Row 'Nombre de lignes remplies

    'Détermine la prochaine ligne vide
    NextRow = Application.WorksheetFunction.Count(Column_TotalTTC) + 1

    For I = 1 To nb_c
    If Cells(1, I) Like "*Amount in euros*" Then Column_Amountineuros = Cells(1, I).Column
    If Cells(1, I) Like "*TVA*" Then Column_TVA = Cells(1, I).Column
    If Cells(1, I) Like "*Total TTC*" Then Column_TotalTTC = Cells(1, I).Column
    Next I

    Cells(NextRow, Column_TotalTTC) = WorksheetFunction.Product(Cells(NextRow, Column_Amountineuros), (Cells(NextRow, Column_TVA) + 1))

End Sub

Un autre point de difficulté est que j'ai essayé de remplir toutes mes colonnes centre de cout (cost centre) par 0% si elles étaient vides, et je ne suis pas sure d'y être parvenue (pareil, une fois sur deux). J'ai procédé comme suit :

 'Remplir les cost centres vides
        If Cells(NextRow, Column_68080).Value = "" Then Cells(NextRow, Column_68080).Value = "0,00%"
        If Cells(NextRow, Column_84154).Value = "" Then Cells(NextRow, Column_84154).Value = "0,00%"
        If Cells(NextRow, Column_80690).Value = "" Then Cells(NextRow, Column_80690).Value = "0,00%"
        If Cells(NextRow, Column_80700).Value = "" Then Cells(NextRow, Column_80700).Value = "0,00%"
        If Cells(NextRow, Column_61740).Value = "" Then Cells(NextRow, Column_61740).Value = "0,00%"
        If Cells(NextRow, Column_55570).Value = "" Then Cells(NextRow, Column_55570).Value = "0,00%"
        If Cells(NextRow, Column_80640).Value = "" Then Cells(NextRow, Column_80640).Value = "0,00%"
        If Cells(NextRow, Column_83040).Value = "" Then Cells(NextRow, Column_83040).Value = "0,00%"
        If Cells(NextRow, Column_02580).Value = "" Then Cells(NextRow, Column_02580).Value = "0,00%"
        If Cells(NextRow, Column_83330).Value = "" Then Cells(NextRow, Column_83330).Value = "0,00%"
        If Cells(NextRow, Column_FR80720).Value = "" Then Cells(NextRow, Column_FR80720).Value = "0,00%"
        If Cells(NextRow, Column_FR09750).Value = "" Then Cells(NextRow, Column_FR09750).Value = "0,00%"
        If Cells(NextRow, Column_FR09920).Value = "" Then Cells(NextRow, Column_FR09920).Value = "0,00%"

Si quelqu'un a une petite idée...

Merci d'avance


Peut être qu'il faut que je cible plus ma question ?

1)

    nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
For I = 1 To nb_c
    If Cells(1, I) Like "*Amount in euros*" Then Column_Amountineuros = Cells(1, I).Column
    If Cells(1, I) Like "*TVA*" Then Column_TVA = Cells(1, I).Column
    If Cells(1, I) Like "*Total TTC*" Then Column_TotalTTC = Cells(1, I).Column
    Next I

Rien à voir avec tes pb mais tu fais ça des dizaines de fois.

Tu pourrais le faire une fois pour toute dans une seule boucle dans le Initialize() de l'UF. Voire même juste à l'ouverture du fichier si tes colonnes ne sont pas amenées à bouger (dans variables public d'un module Standard).

2) pourquoi utiliser = worksheetfunction.product(var1,var2) au lieu de =var1 * var2 ?

Si c'est pour éviter une erreur si var1 ou var2 est un texte est-ce normal d'y avoir un texte ?

Si tu as des doutes sur ce calcul il faut le faire en pas à pas en contrôlant la valeur des variables

3) If Cells(NextRow, Column_68080).Value = "" Then Cells(NextRow, Column_68080).Value = "0,00%"

"0,00%" est du texte !

=0 si tu veux un numérique. Le ,00% doit être fait avec le formatage de la colonne.

Si tu as fait ça à d'autres endroits ça explique peut-être le 2)

Il y aurait bien beaucoup d'autres choses à dire sur ton code mais hors sujet. On voit que tu t'es appliquée mais tu t'es compliqué la vie souvent et pas mal de longueurs évitables.

eric

Merci pour ces conseils !! Je débute seulement donc je me doute qu'il doit y avoir pas mal de redondance...

Je vais essayer de regarder ca demain!

Sinon je ne voulais pas figer mes colonnes dans le cas où le fichier est amené à bouger (pour pouvoir permettre des modifications de la base de donnés en terme de placement de colonne si besoin )


Effectivement je ne savais pas que le code de l'userform initialize etait bon pour le reste du code.... Bon à savoir

Rechercher des sujets similaires à "probleme macro worksheetfunction product"