Transposition de valeurs de cellules

Tungstene

XLDnaute Occasionnel
Bonjour,

J'ai un gros problème de transposition de valeurs de cellules dû apparemment à leurs formats.

Explication de la procédure de mon fichier

1. J'ai une feuille contenant un tableau dans lequel je rentre des informations à l'aide d'une usf.
Dans cette usf je rentre notamment à l'aide d'une textbox un gain en € de type 0.348. Pour rentrer ce gain dans la textbox de ma usf j'utilise bien sûr le pavé numérique.

J'enregistre et les informations sont copiées dans le tableau.

2.Maintenant, j'ai besoin de trier ce gain et de le 'copier/coller' en fonction d'un critère qui est une date.
Ex, si je dis que mon gain de 0.348 € doit être affecté au mois de mars 2006, le copier/coller doit me copier et coller le gain à la case correspondant à mars 2006.

Jusque là tout fonctionne sans problème.

3.Ensuite, je fais la somme des gains affectés par mois, soit dans l'ex je fais la somme des gains qui sont 'copier/coller' dans la colonne du mois de mars 2006.
Or cela ne fonctionne pas et me marque 0.


Maintenant, lorsque je modifie manuellement dans mon tableau le gain de 0.348 € en le réécrivant tout simplement en ré-utilisant le pavé numérique, tout fonctionne correctement.

Donc je pense qu'il s'agit bien d'un problème de format.
J'ai vérifié mes formats des cellules et ils sont tous identiques : nombres

Dans ma usf, j'ai spécifié le format d'affichage de ma textbox :
Box_gains = Format(Box_gains, '# ##0.000')

Donc je ne vois vraiment pas comment faire. Mais ce qui est sûr, c'est qu'il faut que ça marche directement à partir de ma usf. L'utilisateur ne doit pas revenir modifié ou réécrire le gain pour que la somme fontionne.

Le problème c'est que c'est l'éssentiel de mon fichier de gérer ces gains en fonction des dates. Donc il faut que je trouve absolument l'erreur.

Merci d'avance pour les réposnes.
 

Tungstene

XLDnaute Occasionnel
Bon en fait je viens finalement de trouver une parade.

Lors de l'étape 2 du tri des gains en fonction des dates, j'utilise une formule excel du type :

=SI(année cellule A = année cellule B;SI(mois cellule C = mois cellule D);$N8;'');'')

Donc en faisant comme ça ça fonctionne pas.

Maintenant si je rajoute une chose, là ça fonctionne :

=SI(année cellule A = année cellule B;SI(mois cellule C = mois cellule D);$N8 x 1 ;'');'')

Mais j'aimerais quand même comprendre pourquoi ça marche pas sans cette modification car en toute logique cela devrait foncitonner.
 

Monique

Nous a quitté
Repose en paix
Bonjour,

Ta cellule est au format nombre,
mais son contenu est du texte.
C'est pour ça que $N8 * 1 fonctionne,
ça fonctionnerait aussi avec $N8 / 1 ou $N8 + 0 ou $N8 - 0 ou CNUM($N8)
(ça rend numérique le contenu de la cellule)

Fais un essai pour vérifier :
=ESTTEXTE(N8)
=ESTNUM(N8)
 

soft

XLDnaute Occasionnel
Le problème vient certainement quand tu renvoi la valeur du TextBox dans ta feuille.

Si tu écris :

Sheets(x).Range(y) = textBox.text => c'est du texte

il faut renvoyer une valeur numérique par exemple en écrivant :

Sheets(x).Range(y) = CDbl(textBox.text)

Pour limiter les valeurs complétée par les utilisateurs, tu peux utiliser la procédure TextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) comme suit :

Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii <> 46 Then
        If KeyAscii < 48 Then
            KeyAscii = 0
        ElseIf KeyAscii > 57 Then
            KeyAscii = 0
        End If
    End If
End Sub

Seuls les valeurs numérique et le point comme séparateur seront acceptés.
 

Tungstene

XLDnaute Occasionnel
J'ai bien compris ce que tu m'as dit et le code que tu m'as donnée fonctionne bien. C'est même parfait, sauf que maintenant, mon calcul ne s'effectue plus.
Je viens de chercher pendant un moment mais là je vois pas.

J'explique :

C'est la suite de ce qu'on a parlé précédemment.
J'ai 3 textbox dans ma usf, une pour le gains (qu'on a vu) nommée Box_gains, une pour le 'mix' (= à un %) nommée Box_mix, une pour le gain mix (= Box_gains*Box_mix) nommée Box_gains_mix.

L'idée comme je l'ai dit c'est que :

Box_gains_mix.value = Box_gains.value* Box_mix.value
Ex:
0.440 = 0.440 * 100%
ou
0.220 = 0.440 * 50%
….

Donc maintenant en tenant compte de tes remarques, le remplissage de Box_gains et Box_mix fonctionne, mais je n'arrive plus à effectuer le calcul.

Voici mon code. Il est clair qu'il y a des erreurs et cela ne m'étonnerait pas que cela soit au niveau du choix des procédures, car je ne maîtrise pas bien ça encore.

Le code du calcul fonctionnait avant que je modifie mon code avec tes remarques et donc là je ne voie plus comment faire.
J'ai testé plein de code avec la notion de CDbl mais ça ne marche pas.

Mon code :

Private Sub Box_gains_AfterUpdate()

If Box_gains.Value = '' Then
Box_gains.Value = '0'
End If

Box_gains.Value = Format(Box_gains.Value, '# ##0.000')

If Not IsNumeric(Box_mix) Then Exit Sub
Valmix = Box_mix.Value

Valgains_mix = CDbl(Valgains * Valmix / 100): Box_gains_mix = Valgains_mix: Box_gains_mix = Format(Box_gains_mix, '# ##0.000')

End Sub

Private Sub Box_gains_mix_AfterUpdate()

If Not IsNumeric(Box_gains_mix) Then Exit Sub
Valgains_mix = Box_gains_mix.Value

Box_gains_mix.Value = Format(Box_gains_mix.Value, '# ##0.000')

End Sub

Private Sub Box_mix_AfterUpdate()

If Box_mix.Value = '' Then
Box_mix.Value = '0'
End If

Box_mix.Value = Format(Box_mix.Value / 100, '0%')

If Not IsNumeric(Box_mix) Then Exit Sub
Valmix = Box_mix.Value

Valgains_mix = CDbl(Valgains * Valmix / 100): Box_gains_mix = Valgains_mix: Box_gains_mix = Format(Box_gains_mix, '# ##0.000')

End Sub

Private Sub Box_gains_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii <> 46 Then

If KeyAscii < 48 Then
KeyAscii = 0
ElseIf KeyAscii > 57 Then
KeyAscii = 0
End If

End If

End Sub

Private Sub Box_gains_mix_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii <> 46 Then

If KeyAscii < 48 Then
KeyAscii = 0
ElseIf KeyAscii > 57 Then
KeyAscii = 0
End If

End If

End Sub

Private Sub Box_mix_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii <> 46 Then

If KeyAscii < 48 Then
KeyAscii = 0
ElseIf KeyAscii > 57 Then
KeyAscii = 0
End If

End If

End Sub
 

soft

XLDnaute Occasionnel
Salut Tungstene, le forum,

Je ne comprends pas :

Code:
Valgains_mix = CDbl(Valgains * Valmix / 100): Box_gains_mix = Valgains_mix: Box_gains_mix =
Format(Box_gains_mix, '# ##0.000')

Tu fais référence à des variables ? - c'est quoi Valgains_mix et Valgains ?

Je n'ai pas non plus compris si le calcul se fait dans un seul sens - est-ce que tu cherches toujours à calculer Box_Gains_mix ou est-ce que tu dois aussi caluler les autres valeurs en fonction de 2 présentes ?

Essaye ce code qui utilise une seule macro pour le calcul, ça sera plus simple à comprendre et à modifier :

Code:
Private Sub Box_gains_AfterUpdate()
    Box_Gains.Value = Format(Box_Gains.Value, '# ##0.000')
    Calcul
End Sub

Private Sub Box_gains_mix_AfterUpdate()
    Box_Gains_Mix.Value = Format(Box_Gains_Mix.Value, '# ##0.000')
    Calcul
End Sub

Private Sub Box_mix_AfterUpdate()
    If Right(Box_Mix, 1) <> '%' Then Box_Mix.Value = Format(Box_Mix.Value / 100, '0%')
    Calcul
End Sub

Private Sub Box_gains_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii <> 46 Then
        If KeyAscii < 48 Then
            KeyAscii = 0
        ElseIf KeyAscii > 57 Then
            KeyAscii = 0
        End If
    End If
End Sub

Private Sub Box_gains_mix_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii <> 46 Then
        If KeyAscii < 48 Then
            KeyAscii = 0
        ElseIf KeyAscii > 57 Then
            KeyAscii = 0
        End If
    End If
End Sub

Private Sub Box_mix_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii <> 46 Then
        If KeyAscii < 48 Then
            KeyAscii = 0
        ElseIf KeyAscii > 57 Then
            KeyAscii = 0
        End If
    End If
End Sub

Private Sub Calcul()
    Dim Mix As Double
    If Box_Gains = '' Or Box_Mix = '' Then Exit Sub
    If Right(Box_Mix, 1) = '%' Then Mix = Left(Box_Mix, Len(Box_Mix) - 1) / 100
    Box_Gains_Mix = Box_Gains * Mix
    Sheets('Feuil1').Range('A1') = CDbl(Box_Gains_Mix)
End Sub

Edition:La dernière ligne (exemple) est pour mettre la valeur en nombre dans la feuille

Message édité par: soft, à: 07/11/2005 18:01
 

Tungstene

XLDnaute Occasionnel
C'est clair que c'est plus simple. Moi ce que j'ai fais c'est à partir d'exemple et de conseil de droite et de gauche.
Le calcul se fait bien dans un seul sens.
Je rentre mon gain, ex : 0.325 dans ma Box_gains
Je rentre mon mix, ex : 100% dans ma Box_mix
Le calcul du gain_mix s'effectue : 0.325*100% = 0.325 dans ma Box_gains_mix

Ensuite ce que je veux récupérer dans ma feuille c'est mon gain (Box_gains)

Le problème c'est que ça ne marche pas totalement.
Tout d'abord, lorsque je rentre mon gain, le format ne prend plus en compte 3 chiffres après la virgule. Je peux en renter autant que je veux.

Ensuite, le calcul du gain_mix ne s'effectue pas. J'ai bien essayer de changer plusieurs choses mais cela ne marche pas.
Je ne comprends pas d'ailleurs l'intérêt d'utiliser les 'right' et 'left' que je ne connaissais pas d'ailleurs.
 

Tungstene

XLDnaute Occasionnel
En fait ce qu'il ne reconnait pas apparemment c'est la ligne suivante ou il me mets qu'il y a incompatibilité de type.

Box_gains_mix = Box_gains * Mix

Ca me le faisait déjà avec l'ancien code et c'est pour ça qu'en passant par des valgains... ça fonctionnait +/-
 
T

Tungstene

Guest
Bon et bien maintenant avec val(Box_gains) ça marche.

Pour le fichier joint j'aurai bien aimé ça aurait simplifié les explications.
J'ai bien essayé de simplifier au max mon fichier mais même en ne gardant que l'essentiel c'est toujours trop gros.

J'avais bien essayer mais pas que sur box_gains.
En revanche il y a tj deux choses qui m'échappe pour le format de box_gains.

La première est que dès que je rentre + de 3 chiffres après la virgule, cela ne m'arrondi pas le chiffre à 3 derrière la virgule. Ca le laisse telle qu'il est rentré.

Mais plus grave c'est que si je rentre mettons 0.325, ça marche sans problème, mais dès que je n'entre pas ce format de chiffre ça merde.
Ex : si je rentre 0.5, ça me marque 0.003, 0.8 -> 0.006, 1.2 -> 0.043....
Si je rentre par exemple 85, 100... ça marche ça me marque par ex 100.000
 

Discussions similaires

Statistiques des forums

Discussions
300 718
Messages
1 986 643
Membres
209 555
dernier inscrit
Cookone