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!

329classeur1.xlsm (14.14 Ko)

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 Sub

Hervé.

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 Sub

Je 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 Sub

Que 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

À date c'est ce que j'ai fait mais je ne comprend pas la fonction vlookup que j'applique a unité alors pour le range je ne sais aucunement quoi mettre et je ne sais pas non plus comment faire pour appliquer que par exemple 1 km vaut tant de mile comme je le disait précédemment

Merci

plana

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

Sincèrement désolé ,

voici mon fichier.

54classeur1.xlsm (22.43 Ko)

Bonjour

Quelques commentaires dans le code

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 Sub

Hervé.

82classeur1.xlsm (19.38 Ko)
Rechercher des sujets similaires à "monter petit programme conversion"