Monter un petit programme de conversion
Bonsoir à vous!
En exercice, on me demande de créer un petit programme de conversion d'unités avec VBA.
La question contient les restrictions suivantes:
Lorsque le fichier ouvre, il est prêt pour une conversion. Il contient 3 colonnes: À convertir, Unité et Converti. La première contient les valeurs à convertir. La seconde les unités de conversion (j'ai mis le menu déroulant) et la 3e est l'espace ou le chiffre converti apparaît. La conversion est faite en cliquant sur le bouton convertir. Elle se fait pour toutes les valeurs entrées; on arrête de prendre les valeurs lorsqu'on tombe sur une case vide. On utilise les unités de conversion de la liste.
Pour concertir, on fait une recherche dans le chiffrier (rechercheV - vlookup pour retrouver l'unité de conversion correspondante et on applique le calcul. Au moins 1 boucle de la fonction VBA doit être utilisée. Les cellules de la colonne À convertir doivent seulement contenir des nombres réels.
En gros, j'accroche sur la partie en gras... Comment utilise-t-on ces fonctions pour représenter chacun des cas de conversion possibles?
***J'ai mis un fichier excel en pièce jointe avec les colonnes demandées, la liste qui contient toutes les conversions ainsi que le taux de conversion de chaque cas...
Quelqu'un peut me guider un peu pour que je puisse me débrouiller? Merci!!
P.S. Il se peut que le bouton Convertir mette un message d'erreur, mais il n'y avait pas de code de toute façon!
Bonjour,
Regarde ceci (aucun commentaire pour que tu cherche un peu ;o) ) :
Sub Convertir()
Dim Plage As Range
Dim Cel As Range
With ActiveSheet
Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
For Each Cel In Plage
Select Case Trim(Cel.Offset(0, 1))
Case "Mile -> Km"
Cel.Offset(0, 2) = Cel * 1.609344
Case "Km -> Mile"
Cel.Offset(0, 2) = Cel / 1.609344
Case "Pied -> Mètre"
Cel.Offset(0, 2) = Cel * 0.3048
Case "Mètre -> Pied"
Cel.Offset(0, 2) = Cel / 0.3048
Case "Cm -> Pouce"
Cel.Offset(0, 2) = Cel * 0.393700787
Case "Pouce -> Cm"
Cel.Offset(0, 2) = Cel / 0.393700787
Case "Kg -> Livre"
Cel.Offset(0, 2) = Cel * 2.20462262
Case "Livre -> Kg"
Cel.Offset(0, 2) = Cel / 2.20462262
Case "Litre -> Gallon"
Cel.Offset(0, 2) = Cel * 0.264172052
Case "Gallon -> Litre"
Cel.Offset(0, 2) = Cel / 0.264172052
Case "Celsius -> Kelvin"
Cel.Offset(0, 2) = Cel + 273.15
Case "Kelvin -> Celsius"
Cel.Offset(0, 2) = Cel - 273.15
Case "Mètre Carré -> Pied Carré"
Cel.Offset(0, 2) = Cel * 10.7639104
Case "Pied Carré -> Mètre Carré"
Cel.Offset(0, 2) = Cel / 10.7639104
End Select
Next Cel
End SubHervé.
Bonjour à toi, merci pour cette réponse mais je dois utiliser vlookup et non select case...
En gros j'ai essayé avec:
Sub Convertir_Bouton()
Dim intConvertir As Integer
Dim strUnite As String
Dim intConverti As Integer
If Not IsNumeric(Range("A2").Value) Then
Range("A2").Value = "Vous n'avez pas saisi un chiffre!"
Else
intConvertir = Range("A2").Value
strUnite = Range("B2").Value
intConverti = VLookup(strUnite, Unite, 2, FAUX) * intConvertir
End If
End SubJe sais que ce n'est pas bon pour le moment... On me dit comme erreur "Erreur de compilation: Fonction ou Sub non définie". Or je crois avoir tout défini? Ou dois-je définir le tableau que j'ai nommé Unite?
En gros je veux prendre la valeur dans la colonne A, choisir une conversion dans la colonne B (j'ai une liste déroulante) et avoir la réponse convertie dans la colonne C. Je dois utiliser vlookup absolument, puisque je suis peu familier avec la commande je ne sais pas comment l'utiliser... Quelqu'un peut m'éclairer?
***J'ai mis "mile -> km" car je ne sais pas quoi mettre d'autre, si je dois le faire pour chaque cas? et Unite dans le 2e argument est un tableau que j'ai fait, 1re colonne est la conversion (ex. mile -> km) et la 2e colonne est la multiplication( 1 mile = X km , X est dans cette colonne)
Bon presque tout fonctionne sauf une petite partie: on me dit qu'il est impossible de lire la propriété VLookup de WorksheetFunction...
Voici le code maintenant:
Sub Convertir_Bouton()
Dim sngConvertir As Single
Dim varUnite As Variant
Dim sngConverti As Single
Dim i As Integer
i = 2
Do While (Worksheets(1).Cells(i, 1).Value <> "")
If Not IsNumeric(Cells(i, 1).Value) Then
Cells(i, 1).Value = "Vous n'avez pas saisi un chiffre!"
Else
sngConvertir = Cells(i, 1).Value
varUnite = Application.WorksheetFunction.VLookup([b]varUnite[/b], "F2:G15", 2, FAUX)
sngConverti = varUnite * intConvertir
End If
i = i + 1
Loop
End SubQue dois-je mettre à la place de "varUnite" en gras pour que ce soit ce qui arrive peu importe la conversion que j'utilise?
Bonjour
La fonction RECHERCHEV
Extrait de l'aide
RECHERCHEV(valeur_cherchée;table_matrice;no_index_col;valeur_proche)
Valeur cherchée : comme son nom l'indique c'est ce que l'on cherches, et d'après ce que je comprends tu cherches ce qu'il y a en colonne B
table_matrice : Zone de recherche (la recherche se fait toujours dans la colonne de gauche), en VBA une désignation d'une zone se fait avec l'objet Range
Ta formule de recherche devient
varUnite = Application.WorksheetFunction.VLookup(Cells(i, 2),[surligner=#FFFF80]Range("F2:G15"), 2, FAUX)Je te le laisse le soin de corriger et il te manque toujours l'affichage en colonne C
J'essai de comprendre le tout, mais j'ai quelques interogations.
Premièrement, comment je fais pour indiquer que par exemple 1 km vaut tant de mile avec la fonction vlookup?
Deuxièmement, Le range dans application worksheet de la fonction vlookup représente quoi exactement?
Dernière petite intérogation, comment je dois écrire que je veux que ma conversion s'affiche dans la colonne C?
Merci
Bonsoir
Fournis ce que tu as fais on pourra mieux t'orienter vers une solution ou du moins te donner des explications
Bonsoir
Comment veux tu que l'on te fournisse une réponse à partir d'une image
Il faut ton fichier pour savoir ce que tu as fais
Parce que moi avec ton image je ne vois pas ton tableau
Bonjour,
La fonction VlookUp doit rechercher dans un Range (plage) (ou un Array si celui-ci contient un Range). La valeur cherchée verticalement se fait dans la colonne la plus à gauche de la plage et selon l'index, la valeur correspondante est renvoyée par la fonction. Dans mon exemple, la plage se trouve en E2:F15, en colonne E, les sens de conversions et en colonne F les coefficients :
Sub Convertir()
Dim Plage As Range
Dim Cel As Range
Dim Coeff As Single
Dim Tbl
'la plage de recherche verticale est en E2:F15 avec en colonne
'E les sens de conversions et en colonne F les coefficients
'ici, utilisation d'un Array mais le range peut être entrée directement
'dans la fonction "VLookup"
Set Tbl = Range("E2:F15")
With ActiveSheet
'en colonne B
Set Plage = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
End With
For Each Cel In Plage
Coeff = Application.WorksheetFunction.VLookup(Cel, Tbl, 2, 0)
Select Case Cel
'gère le cas de conversion des degrés
Case "Celsius -> Kelvin", "Kelvin -> Celsius"
Cel.Offset(0, 1) = Cel.Offset(0, -1) + Coeff
Case Else
Cel.Offset(0, 1) = Cel.Offset(0, -1) * Coeff
End Select
Next Cel
End SubHervé.
