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 SubEt 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 SubUn 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 IRien à 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