problème code vba

tibtib075

Nouveau membre
Bonjour

Tout d'abord j'ai une feuille excel avec sur la première ligne et les cinq premières colonnes les titres des colonnes. "taux conversion", "en euros", "montant N-1", "montant N", "Variation des montants".

Je voudrais créer un framework pour renseigner le taux le montant N-1 et le montant N et que mon code calcul automatiquement la valeur en euro et la variation des montants.

Je vous laisse le script et dites moi ce que vous en pensez si cela est possible car je truove deux erreurs :
- Type mismatch au niveau de la ligne rate=.textbox1.value
- Dépassement de capacité au niveau de la ligne euross = montant / rate.
Pouvez-vous m'aider?

Code:
Dim rate As Double
Dim montant As Double
Dim euross As Double
Dim montantdernier As Double
Dim variation As Double
Dim line As Integer

Sub count_line()

line = 0
    Do
    line = line + 1
    Loop Until Cells(line + 1, 1) = ""
End Sub

Sub read()

With UserForm1
    rate = .TextBox1.Value
    montantdernier = .TextBox2.Value
    montant = .TextBox3.Value
End With

End Sub

Sub math()

euross = montant / rate
variation = (montant - montantdernier) / montantdernier

End Sub

Sub display()

Cells(line + 1, 1) = rate
Cells(line + 1, 2) = euross
Cells(line + 1, 3) = montantdernier
Cells(line + 1, 4) = montant
Cells(line + 1, 5) = variation

End Sub

Sub proc()

Sheets.Select ("Feuil1")
count_line
UserForm1.Show
read
math
display

End Sub
 

zeb

Modérateur
Bonjour,

moderator dixit: Merci d'utiliser les balises [code=vb] et [/code] pour encadrer ton code.
 

zeb

Modérateur
Quand tu auras mis ton message en conformité avec le règlement, nous parlerons de la fonction CDbl().
Et de toutes les petites choses qui ne vont pas dans ton code !
;)
 

zeb

Modérateur
Ben juge par toi-même, c'est plus joli, non?

Alors veux-tu que je te parle de CDbl() ?
Ou bien veux-tu que je t'en laisse regarder l'aide, histoire que tu trouves par toi-même ?

Je pense que l'option 2 est plus sympa, et au pire, on pourra revenir à l'option 1
;)


Parce que figure toi qu'il y a des choses à dire sur ton code.

D'abord, tu utilises un entier de type Integer (32 bit) pour numéroter tes lignes.
Rhaaa ! Combien de lignes par feuilles ? Quelles bornes pour un entier signé de 32 bits ?

Ensuite, je verrai bien une fonction (function) à la place d'une procédure (sub) pour count_line()
Comme ça :
Code:
Function count_line() As Long
    Dim line As Long
    line = 0
    Do
        line = line + 1
    Loop Until Cells(line + 1, 1).Value = ""
    count_line = line
End Sub

Sauf que Excel peut le faire pour toi bien plus rapidement :
Code:
Function count_line() As Long
    If Cells(1, 1).Value = "" then
        count_line = 1
    Else
        count_line = Cells(1, 1).End(xlDown).Row + 1
    End If
End Sub

Sauf qu'on peut ne pas travailler avec des coordonnées, mais directement avec des objets :
Code:
Function cell1_of_last_line() As Range
    If Cells(1, 1).Value = "" then
        cell1_of_last_line = Cells(1, 1)
    Else
        cell1_of_last_line = Cells(1, 1).End(xlDown).Offset(1)
    End If
End Sub

J'ai un faible pour les fonctions simples et génériques :
Code:
Function last_line() As Range
    If Cells(1, 1).Value = "" then
        last_line = Rows(1)
    Else
        last_line = Cells(1, 1).End(xlDown).Offset(1).EntireRow
    End If
End Sub

Alors, la fonction Display devient :
Code:
Sub display(rate as Double, montant as Double, montant_dernier as Double)
    Dim line As Range
    Set line = last_line()

    line.Cells(1).Value = rate
    If rate <> 0 Then line.Cells(2).Value = montant / rate
    line.Cells(3).Value = montantdernier
    line.Cells(4).Value = montant
    If montant_dernier <>  Then line.Cells(5).Value = (montant - montant_dernier) / montant_dernier
End Sub

Observe que j'ai passé des paramètres à la procédure et que je méfie des erreurs potentielles.
Je me passe aussi de la fonction math qui me semble trop triviale.

Et ainsi, le code de la procédure finale devient-il :
Code:
Sub proc()
	Sheets.Select "Feuil1"
	UserForm1.Show
	display UserForm1.TextBox1.Value, UserForm1.TextBox3.Value, UserForm1.TextBox2.Value
End Sub

-----------------------------------------------------------------------------------------------

Bien.
S'il y a bien un truc que je n'aime pas, c'est les problèmes de sélection de feuille.
Et si pour une raison ou une autre, la feuille active change. Que deviennent des macros ?

Modifions-les légèrement :
Code:
Function last_line(ws Worksheet) As Range
    If ws.Cells(1, 1).Value = "" then
        last_line = ws.Rows(1)
    Else
        last_line = ws.Cells(1, 1).End(xlDown).Offset(1).EntireRow
    End If
End Sub

Sub display(ws Worksheet, rate as Double, montant as Double, montant_dernier as Double)
    Dim line As Range
    Set line = last_line(ws)

    line.Cells(1).Value = rate
    If rate <> 0 Then line.Cells(2).Value = montant / rate
    line.Cells(3).Value = montantdernier
    line.Cells(4).Value = montant
    If montant_dernier <>  Then line.Cells(5).Value = (montant - montant_dernier) / montant_dernier
End Sub

Sub proc()
	Dim ws = Worksheet
	Set ws = Worksheets("Feuil1")
	
	ws.Select
	With UserForm1
		.Show
		display ws, .TextBox1.Value, .TextBox3.Value, .TextBox2.Value
	End With
End Sub

Et voilà !
J'attends autant de commentaires et/ou de critiques que tu veux, pourvu que ça te soit utile à mieux comprendre.

(évidemment, il reste un petit bug en rapport avec la question originale ;) )
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 059
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut