Calculateur de transport

Bonjour,

J'ai un formulaire de calcul de transport en VBA. Lorsque je rentre un département et un poids dans ce formulaire, il sort un prix de transport pour ce poids et ce département. Dès lors ma feuille Excel se met à jour.

Ce que je souhaiterais c'est pouvoir entrer le département non pas dans le formulaire mais dans la cellule de la feuille excel et que cela mette à jour le reste de la feuille.

Voici le code VBA du formulaire:

Public Dep As String

Public Sub Affiche()
    'Affiche le résultat
    If Me.Num_Département And Me.Poids <> " kg" Then
        Me.Titre_qte = "Livraison de " & Me.Poids & vbCr & " dans le " & Me.Num_Département & " - " & Me.Nom_Département

        Me.T_chr_qte = Cells(51, 4) & " € HT"

        Me.Top13_qte = Cells(38, 4) & " € HT"

        Me.Top_13_delai = Cells(25, 12) & "H"

        Me.Top18_qte = Cells(45, 4) & " € HT"

        Me.Top_18_delai = Cells(26, 12) & "H"

        Me.T_exp_qte = Cells(32, 4) & " € HT"

        Me.express_delai = Cells(24, 12) & "H"

        Me.T_aff_qte = Cells(26, 4) & " € HT - " & Cells(24, 3) & " palette(s)"

        Me.Cout_Qte = Cells(29, 13) & " = " & Cells(29, 12) & " € HT"

    Else
        Me.Titre_qte = ""

        Me.T_chr_qte = ""

        Me.Top13_qte = ""

        Me.Top_13_delai = ""

        Me.Top18_qte = ""

        Me.Top_18_delai = ""

        Me.T_exp_qte = ""

        Me.express_delai = ""

        Me.T_aff_qte = ""

        Me.Cout_Qte = ""

    End If
End Sub
Private Sub Cb_Quitter_Click()
    If Workbooks.Count = 1 Then
        Application.DisplayAlerts = False
        Application.Quit
    Else
        Application.ActiveWorkbook.Close SaveChanges:=False
    End If
End Sub

Private Sub Num_Département_Enter()
    Me.Dep = Me.Num_Département
    Me.Num_Département.BackColor = -2147483629
End Sub

Private Sub Num_Département_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Integer
    Application.ScreenUpdating = False

    'Test si le département à changé
    If Me.Num_Département = Me.Dep Then
        Me.Num_Département.BackColor = -2147483629
        Application.ScreenUpdating = True
        Exit Sub
    End If
    Cells(18, 3) = Me.Num_Département
    'Ajoute un 0 devant le département si compris entre 1 et 9
    If Me.Num_Département > 0 And Me.Num_Département < 10 Then
        Me.Num_Département = "0" & Right(Me.Num_Département, 1)
    End If
    If Me.Num_Département > 0 And Me.Num_Département < 96 Then
        'Affiche le nom du département
        Me.Nom_Département.Value = Fichier.INIGetSetting("Z:\Transport\Département.ini", "Num-Nom", Me.Num_Département.Value)
        'Récupère les valeur pour l'Express
        i = 2
        Sheets("Transport").Select
        Do While i < 41
            Cells(5, i) = CDec(Fichier.INIGetSetting("Z:\Transport\Express.ini", Me.Num_Département, i))
            i = i + 1
        Loop
        'Récupère les valeur pour l'Affretement
        i = 2
        Do While i < 34
            Cells(2, i) = CDec(Fichier.INIGetSetting("Z:\Transport\Affretement.ini", Me.Num_Département, i))
            i = i + 1
        Loop
        'Récupère les valeur pour Joyau TOP 13
        i = 2
        Do While i < 41
            Cells(10, i) = CDec(Fichier.INIGetSetting("Z:\Transport\top13.ini", Me.Num_Département, i))
            i = i + 1
        Loop
        'Récupère les valeur pour Joyau TOP 18
        i = 2
        Do While i < 41
            Cells(13, i) = CDec(Fichier.INIGetSetting("Z:\Transport\top18.ini", Me.Num_Département, i))
            i = i + 1
        Loop

        Me.Num_Département.BackColor = -2147483629
        Call Me.Affiche
    Else
        'Message si erreur de saisie
        MsgBox "Ce département n'éxiste pas !" & vbCr & "Veuillez corriger votre saisie.", vbInformation, "Erreur de saisie"
        Me.Num_Département = ""
        Cancel = True
    End If
    Application.ScreenUpdating = True

End Sub

Private Sub Poids_Enter()
    If Right(Me.Poids, 3) = " kg" Then
        Me.Poids = Left(Me.Poids, Me.Poids.TextLength - 3)
    End If
    Me.Poids.BackColor = -2147483629
End Sub

Private Sub Poids_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Me.Poids < 1 And Me.Poids <> "" Or Me.Poids > 8500 And Me.Poids <> "" Then
        MsgBox "Ce poids ne peux être calculé avec les tarifs !" & vbCr & "Veuillez corriger votre saisie.", vbInformation, "Erreur de saisie"
        Me.Poids = ""
        Cancel = True
    Else
        If Right(Me.Poids, 3) <> " kg" Then
            If Me.Poids <> "" Then
                Cells(20, 3) = Int(Me.Poids)
            End If
            Me.Poids = Me.Poids & " kg"
        End If
        Me.Poids.BackColor = -2147483629
        Call Me.Affiche
    End If
End Sub

Private Sub UserForm_Click()

End Sub

Auriez-vous une idée SVP?

Espérant avoir été clair dans ma demande, et vous remerciant par avance de votre aide,

Bonne journée

Bonjour,

Une idée ? Oui.

Le formulaire met le département dans la cellule où tu le souhaites, et tu n'as plus à le faire toi-même.

Ou le formulaire récupère tout seul le département que tu as mis dans la cellule, et n'as plus à le faire.

Ça fait déjà 2 !

Bonne journée.

Ferrand

C'est l'idée 2 qui m'intéresse! que le formulaire récupère le dép renseigné dans la cellule. Que lorsque je renseigne le département dans la cellule tout le reste de la feuille se mette à jour.

Comment faire?

Apparemment le formulaire affecte déjà le numéro de département à la cellule C18 ?

Oui mais pas l'inverse et c'est ce que je souhaite.

tout comme pour le formulaire, je veux que lorsque je renseigne le département dans la cellule C18 cela mette à jour toute la feuille. Actuellement ce n'est pas le cas. Ce n'est que par le biais du formulaire que j'actualise la feuille.

J'ai un tarif de transport par département. Par le biais du formulaire cela charge le tarif en fonction du département. En passant par la cellule C18, cela ne charge rien. Il reste sur le département renseigné par le formulaire.

L'idée finale est de pouvoir associer ce formulaire de calcul à un listing comportant plusieurs département. J'ai réussi à l'associé mais pour un seul département, le dernier renseigné par le formulaire. Si je pouvais agir directement depuis la cellule C18 je pourrais alors faire un "copier avec liaison" avec le listing.

Si le département suffit à mettre à jour, tu peux en principe te passer du formulaire : des formules ou, si cela se révèle trop lourd, une simple macro peut opérer. Si tu souhaites alors le formulaire pour affichage, ce n'est plus la même fonction...

On ne peut pas modifier ça au jugé, sans support précis, si on veut éviter des catastrophes.

Tout à fait.

Donc, en fait, quelle fonction pourrait générer les tarifs transport en fonction du département renseigné par la cellule C18. L'équivalent de la fonction appelé dans le code VBA?

A ce qu'on peut déduire : il faudrait que tu serves le département en C18 et le poids en C20.

A partir de là, une macro reprenant les vérifications et blocages éventuels opérés par le formulaire en cas de saisie non conforme ou non traitable, puis la partie récupération des tarifs opérés par le formulaire pour les insérer dans une feuille Transport.

Il semblerait donc que les calculs soient opérés sur la feuille (par formules), ce qui est à confirmer.

Il faut encore voir de près la procédure de récupération des tarifs : fonction INIGetSetting dans un module Fichier ? (récupération se faisant dans des fichiers texte)

Et je n'ai rien vu concernant le lancement du formulaire et le nettoyage de la feuille Transport ?

Pour l'instant, c'est encore très hasardeux...

Mais pourquoi vouloir modifier cette méthode qui fonctionne : saisir 2 valeurs dans un formulaire ou les saisir dans la feuille, c'est à peu près équivalent, cela ne fait rien gagner ?

La saisie est plus aisément controlable dans un formulaire, et j'avoue que j'aurais plutôt tendance à privilégier un formulaire en bloquant toute saisie dans la feuille !

En l'état actuel, il manque un certain nombre d'éléments, et surtout il faut pouvoir tester ce que l'on fait...

Tu devrais essayer ça ... c'est pas du VBA mais ça fonctionne très bien.

c'est gentil mais ce n'est pas ce que je recherche. Je cherche à gagner du temps en fait.

J'ai un client qui nous donne un listing:

50 départements pour des poids différents. Le prix varie énormément d'un département à l'autre.

Pour un devis classique (1 demande, 1 poids), le formulaire que je vous ai présenté est très pratique mais dès que l'on plusieurs ligne, faut se les taper une par une. D'où ma recherche de lier ce formulaire à un listing qui me sortirait mon prix de transport immédiatement pour tous les départements de mon listing.

Il s'agissait jusqu'ici de remplacer la saisie formulaire par la saisie feuille, ce qui n'influe pas sur le débouché de l'opération qui se serait déroulée après entrée des données de la même façon, dont on ne sait rien d'autre que le fait que les résultats d'un calcul apparaissent sur la feuille et affichés par le formulaire. Rien n'a été dit sur ce qui se passe en dehors de la phase allant de la saisie de 2 données à l'affichage de résultats liés à ces données.

Autrement dit tu poses une question sur laquelle tu ne fournis déjà pas les éléments pour la traiter et tu attends la réponse à une autre question non posée jusqu'ici sur laquelle aucune information n'a encore été donnée. On était sur une calculette, on tapote, on a un résultat ; maintenant la question c'est ce qui se passe avant et après... On ne va pas continuer à tourner en rond encore longtemps à faire de la divination : tu fournis le fichier, tu exposes comment tu souhaites l'utiliser selon les différents types de demande auxquels tu as à répondre, et ce qui doit être fourni à la sortie et sous quelle forme.

A ces conditions, on peut revoir les modalités d'entrée, qui ne sont sûrement pas de saisir en C18 et C20 pour répondre à ta demande implicite (on sait déjà au moins que ce que tu demandais de faire n'est pas la solution !!!) et redéfinir (ou définir ?) selon ce que tu exprimeras les modalités de sortie (dont on ne sait encore rien).

Cordialement,

Ferrand

Rechercher des sujets similaires à "calculateur transport"