Bonsoir ,

J'ai besoin de votre support la famille :

J'aimerai traduire ma macro de facturation excel dans un fichier Access.
Ma Macro actuelle presente plusieurs probleme dans mon fichier inital excel:
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.
J'aimerai que dans l'adaptation dans le fichier Access les memes erreurs ne soient pas repetée.
Facture Macro.xlsm
Voici ci-dessous ma macro je vous ajoute également mon fichier excel.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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