IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Besoin d'une Correction de la MACRO de mon fichier de facturation


Sujet :

Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2018
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2018
    Messages : 110
    Par défaut Besoin d'une Correction de la MACRO de mon fichier de facturation
    Bonsoir ,

    J'ai besoin de votre support la famille :

    J'aimerai automatiser mon fichier de facturation excel avec une macro mais je rencontre plusieurs problemes:
    La cellule C11 ne se met pas a jour automatiquement lorsque la cellule C9 est modifié, donc en resumé nous avons trois problèmes à resoudre avec cette macro :
    Mettre les données de la cellule C11 à jour automaiquement quand C9 est modifié
    deuxiement généré le poids total arrondi dans la cellule E102 lorsque le resultat du poids total s'affiche dans la cellule D102
    Troisiemementgénérer automatiquement le tarif unitaire selon les conditions enumérées dans la macro.
    Quatrième pouvoir mettre la date automatique lorsque le fichier est renseigné via une macro.
    [ATTACH]639021[/ATTACHFacture Macro.xlsm]
    Voici ci-dessous ma macro je vous ajoute également mon fichier excel.

    Sub numeroFacture()

    Dim numeroFacture As Long

    ' Remplacer "Mise à Fob" par le nom de votre feuille de travail
    With ThisWorkbook.Sheets("Mise à Fob")
    lastRow = .Cells(.Rows.Count, "C").End(xlUp).Row

    If lastRow > 1 Then
    numeroFacture = 1
    Else
    numeroFacture = 0
    End If

    .Cells(2, "C").Value = numeroFacture
    End With
    MiseAJourInfos
    CalculerMontantFacture

    End Sub
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Mise à Fob") ' Remplacez "Mise à Fob" par le nom de votre feuille de travail

    ' Vérifier si le changement a eu lieu dans la plage des poids des marchandises (colonne D)
    If Not Intersect(Target, ws.Range("D20:D100")) Is Nothing Then
    ' Mise à jour du poids total arrondi (cellule E102) avec la somme des poids des marchandises arrondie à la tonne supérieure
    ws.Range("E102").Value = Application.WorksheetFunction.Ceiling(Application.WorksheetFunction.Sum(ws.Range("D20:D100")), 1)
    CalculerMontantFacture ' Recalculer le montant de la facture après la mise à jour du poids total
    End If

    ' Vérifier si le changement a eu lieu dans la cellule C9
    If Target.Address = "$C$9" Then
    MiseAJourInfos
    CalculerMontantFacture ' Recalculer le montant de la facture après la mise à jour du type d'opération
    End If
    End Sub

    Sub MiseAJourInfos()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Mise à Fob")

    Dim nomSite As String
    nomSite = ws.Cells(2, "C").Value

    Select Case nomSite
    Case "MAERSK SP0"
    ws.Cells(4, "C").Value = "CI01MLOP64"
    ws.Cells(5, "C").Value = "CI010110"
    Case "GMCI"
    ws.Cells(4, "C").Value = "CI01MLOP69"
    ws.Cells(5, "C").Value = "CI010115"
    Case "SACC/ETMD"
    ws.Cells(4, "C").Value = "CI01MLOPLS"
    ws.Cells(5, "C").Value = "CI010116"
    Case "SITAPA"
    ws.Cells(4, "C").Value = "CI01MLOP68"
    ws.Cells(5, "C").Value = "CI010114"
    Case "IROKOTARASNCI"
    ws.Cells(4, "C").Value = "CI01MLOPL2"
    ws.Cells(5, "C").Value = "CI010119"
    End Select

    Dim nbMarchandises As Double
    nbMarchandises = Application.WorksheetFunction.CountA(ws.Range("C20:C100"))
    ws.Cells(10, "C").Value = nbMarchandises

    Dim typeOperation As String
    typeOperation = ws.Cells(9, "C").Value

    Select Case typeOperation
    Case "Vrac"
    ws.Cells(11, "C").Value = "20'"
    Case "Sac"
    ws.Cells(11, "C").Value = "40'"
    Case "Conventionnel"
    ws.Cells(11, "C").Value = "0"
    End Select
    End Sub

    Sub CalculerMontantFacture()
    ' Remplacer "Mise à Fob" par le nom de votre feuille de travail
    With ThisWorkbook.Sheets("Mise à Fob")
    ' Récupérer le poids total à facturer (cellule D102)
    Dim poidsTotal As Double
    poidsTotal = Application.WorksheetFunction.Sum(.Range("D20:D101")) / 1000
    .Cells(102, "D").Value = poidsTotal

    ' Récupérer le nom du client sélectionné
    Dim nomClient As String
    nomClient = .Cells(6, "C").Value

    ' Récupérer le type de prestation (cellule C13)
    Dim typePrestation As String
    typePrestation = .Cells(13, "C").Value

    ' Générer le tarif unitaire en fonction du nom du client et de sa prestation
    Dim tarifUnitaire As Double
    tarifUnitaire = ObtenirTarifUnitaire(nomClient, typePrestation)

    ' Placer le tarif unitaire dans la cellule F102
    .Cells(102, "F").Value = tarifUnitaire

    ' Calculer le montant total à facturer (cellule G102)
    Dim montantTotal As Double
    montantTotal = poidsTotal * tarifUnitaire
    .Cells(102, "G").Value = montantTotal
    End With
    End Sub

    Function ObtenirTarifUnitaire(ByVal nomClient As String, ByVal typePrestation As String) As Double
    ' Insérez ici votre logique pour obtenir le tarif unitaire en fonction du nom du client et de sa prestation
    ' Par exemple, vous pouvez utiliser une table de correspondance ou une requête à une base de données
    ' Pour cet exemple, je vais simplement renvoyer un tarif unitaire fixe pour illustrer le concept

    Select Case nomClient
    Case "AFRICA SOURCING"
    Select Case typePrestation
    Case "Vrac"
    ObtenirTarifUnitaire = 33000 ' Tarif unitaire pour le client 1 en cas de prestation Vrac
    Case "Sac"
    ObtenirTarifUnitaire = 31500 ' Tarif unitaire pour le client 1 en cas de prestation Sac
    Case "Conventionnel"
    ObtenirTarifUnitaire = 20500 ' Tarif unitaire pour le client 1 en cas de prestation Conventionnel
    End Select
    Case "SOCAGC"
    Select Case typePrestation
    Case "Vrac"
    ObtenirTarifUnitaire = 31500 ' Tarif unitaire pour le client 2 en cas de prestation Vrac
    Case "Sac"
    ObtenirTarifUnitaire = 30000 ' Tarif unitaire pour le client 2 en cas de prestation Sac
    Case "Conventionnel"
    ObtenirTarifUnitaire = 19500 ' Tarif unitaire pour le client 2 en cas de prestation Conventionnel
    End Select
    Case Else
    ObtenirTarifUnitaire = 0#
    End Select
    End Function

  2. #2
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour,

    Beaucoup à dire...

    Déjà supprime module1 qui fait doublon avec le code déjà présent dans la feuille "Mise à Fob" (c'est le bon endroit pour un worksheet_change)

    Ensuite... ça marche à peu près - en ce sens que le code démarre et fait des choses - mais difficile d'aller au bout sans rentrer dans le détail et j'ai la flemme à cause de ce qui suit.

    Mais surtout, ce qui me choque - et je pèse mes mots - c'est l'utilisation du VBA pour faire des calculs, qui seraient plus simples, plus maintenables etc. avec des formules (style recherchex()...)

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Dim typeOperation As String
        typeOperation = ws.Cells(9, "C").Value
     
        Select Case typeOperation
            Case "Vrac"
                ws.Cells(11, "C").Value = "20'"
            Case "Sac"
                ws.Cells(11, "C").Value = "40'"
            Case "Conventionnel"
                ws.Cells(11, "C").Value = "0"
        End Select
    Pourrait avantageuse être remplacé par la formule en C11 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEX(C9;Donnée!F15:F17;Donnée!G15:G17;0)
    Puisque les données sont déjà présentes en Donnée!F15:G17, avec une meilleure facilité de maintenance et la garantie de cohérence avec la saisie contrôlée en C9.

    Ensuite il t'a sans doute échappé que le sub Worksheet_Change va démarrer à chaque mise à jour de la feuille "Mise à Fob", y compris celles que sont faites dedans. Donc on assiste à des tas d'appels en cascade probablement non souhaités peut-être à l'origine de tes problèmes.

    Après, accessoirement, ajoute dans ton module un "Option Explicit" au début pour forcer la déclaration des variables (protection contre l'oubli d'un Dim...)

    Et très accessoirement ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim ws As Worksheet
        Set ws = ThisWorkbook.Sheets("Mise à Fob") ' Remplacez "Mise à Fob" par le nom de votre feuille de travail
        nomSite = ws.Cells(2, "C").Value
    Est inutile puisqu'on est dans un module de classe (celui de la feuille) . Il existe donc un objet : Me qui représente le parent, en l'occurrence la feuille.
    On peut donc écrire plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        nomSite = me.Cells(2, "C").Value
    Mais la priorité à ce stade est de remplacer le code par des formules. S'il y a des impératifs non dits (protection contre la modification, livraison d'une feuille sans formule...) on regardera d'autres méthodes mais là,le VBA me semble hors sujet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2018
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2018
    Messages : 110
    Par défaut
    A l'initiative j'utilisais les formules mais afin de proteger le fichier contre les modification en livrant le fichier sans formule j'ai opté pour la creation des code VBA.
    Est il possible de resumer cette macro afin d'avoir les resultats voulu.

    Bilson

  4. #4
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Re,

    tu as déjà regardé du côté de la protection de la feuille ?

    Nom : _Capture d’écran 2023-05-22 171341.png
Affichages : 96
Taille : 29,6 Ko

    Auparavant il faut passer sur les cellules que tu veux laisser en saisie, et par "Format de cellule", onglet "Protection" tu enlève la coche "Verrouillée". Donc ensuite tu actives la protection de la feuille et les utilisateurs ne peuvent modifier que les cellules déverrouillées.

    Il te restera peut-être un peu de VBA pour incrémenter le n° et figer la date.

Discussions similaires

  1. Creation d'un fichier XML avec ASP encoder en UTF-8
    Par freeze_land dans le forum ASP
    Réponses: 6
    Dernier message: 14/02/2007, 11h59
  2. [CSV] Creation d'un fichier csv côté client
    Par Taz_8626 dans le forum Langage
    Réponses: 6
    Dernier message: 31/03/2006, 10h48
  3. Creation d'un fichier commun !!
    Par Shandler dans le forum C++
    Réponses: 2
    Dernier message: 24/02/2005, 13h00
  4. Date de création d'un fichier
    Par cap38 dans le forum Linux
    Réponses: 14
    Dernier message: 28/04/2004, 15h06
  5. creation d un fichier jar ou .exe en java
    Par sadjia dans le forum JBuilder
    Réponses: 13
    Dernier message: 13/12/2002, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo