Bonjour à tous,
Je suis débutant en VBA et j'aimerai créer une sorte de facturier avec des macros. Mon fichier est composé de plusieurs feuilles : les deux premières sont des requêtes SQL qui vont extraire des données dans une base. La 3eme est une juxtaposition des deux tableaux. La 4eme est quant à elle un template de facture qui va se remplir grâce à une macro.
Dans les deux requêtes, je vais avoir plusieurs types de statuts possibles (colonne C et D). Je souhaiterai que toutes les lignes de chaque requêtes qui ont pour statut "A" (au choix de l'utilisateur avec plusieurs choix possibles) aillent dans le 3eme onglet. Le but serait de créer une facture prévisionnelle avec toutes lignes ayant un statut "X" par exemple et une facture réelle ayant en statut "Y". La facture réelle sera basée sur le critère de "GO/NOGO" (liste déroulante). Une 5eme feuille pourrait etre ajoutée pour créer un historique des lignes "passées" dans la facture réelle afin de suivre ce qui a été réellement facturé.
Enfin je souhaiterai sauvegarder ces factures sous pdf (les deux factures possibles). J'avais dans l'idée de créer 4 boutons :
• Le premier serait l'actualisation des requêtes
• Le deuxième serait un bouton « actualiser » qui viendrait ajouter toute nouvelle ligne non présente dans le tableau de bord mais présente dans un deux premiers onglets. (Fonctionnalité déjà présente)
• Le troisième serait un bouton qui présenterait une facturation prévisionnelle suivant un critère de statut (au choix de l'utilisateur). (Fonctionnalité déjà présente)
• Le quatrième serait une facturation réelle qui se ferait critère « GO » ou « NOGO ».
Dans la facture, les colonnes à remplir sont en vert et remplies de la façon suivante :
• La premiere serait remplie avec AB pour chaque ligne
• La deuxième la date issue de la requête SQL
• La troisième avec une série de chiffres issus de la requête SQL (colonnes D et E)
• La quatrième avec une série de chiffres (issus de la requête colonnes C et K)
• La cinquième avec la description (issu de la requête aussi colonnes B)
J'ai dejà une partie des codes mais je bloque pour terminer. Toute aide même minime est la bienvenue.
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 Dim dico As Object, tablo, tabloR(), f As Worksheet, fe As Worksheet Dim i&, j&, k& Private Sub CommandButton1_Click() 'Bouton Valider If ComboBox1 = "" Or ComboBox2 = "" Then MsgBox "Saisie incomplète." Exit Sub End If k = 0 'initialisation de la variable For i = 1 To UBound(tablo, 1) - 1 'On va passer toutes les lignes du tablo de la feuille ''Invoice Follow-up'' If (tablo(i, 11) = ComboBox1 Or ComboBox1 = "SBB ou BTPI") _ And (tablo(i, 13) = ComboBox2 Or ComboBox2 = "GO ou NOGO") Then 'et ne s'intéresser qu'aux lignes qui répondent aux critéres choisis ReDim Preserve tabloR(1 To UBound(tablo, 2), 1 To k + 1) 'on initialise le tablo de résultats On Error Resume Next 'pour le cas de cellules vides contenant une date tabloR(1, k + 1) = "BT" tabloR(3, k + 1) = Date tabloR(4, k + 1) = tablo(i, 5) tabloR(9, k + 1) = tablo(i, 3) tabloR(10, k + 1) = tablo(i, 2) tabloR(21, k + 1) = tablo(i, 14) k = k + 1 'on incrémente k End If Next i Sheets("Extraction").Range("A4").CurrentRegion.Offset(1, 0).ClearContents On Error Resume Next Range("A8:U8").Select Range(Selection, Selection.End(xlDown)).Select Selection.Delete Shift:=xlToLeft Sheets("Extraction").Range("A8").Resize(UBound(tabloR, 2), UBound(tablo, 2)) = Application.Transpose(tabloR) Sheets("Extraction").Activate fe.Range("U4") = Date & " " & Time Unload Me End Sub Private Sub UserForm_initialize() Set f = Sheets("Invoice Follow-up") Set fe = Sheets("Extraction") tablo = f.Range("A5").CurrentRegion.Offset(1, 0) 'Mise en mémoire-tableau des données du tableau de la feuille ''Invoice Follow-up'' ComboBox1.List = Sheets("Données").Range("B2:B4").Value ComboBox1.AddItem "SBB ou BTPI" ComboBox2.List = Sheets("Données").Range("C2:C4").Value ComboBox2.AddItem "GO ou NOGO" End Sub
et
et
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 Option Explicit Dim f, sh As Worksheet, dico As Object, tablo, wb_WMATL As Workbook, sh_dashboard As Worksheet Dim i&, j&, k&, lgn& Sub MettreAjour() f = Array(Sheets("Maximo VAN + GAR"), Sheets("Maximo Betrieb")) 'On met la liste des feuilles sources dans un ''Array'' For i = 0 To 1 'On passe les 2 feuilles lgn = Range("A" & Rows.Count).End(xlUp)(2).Row 'Première ligne vide du tableau de la feuille de destination f(i).Range("A2:J" & f(i).Range("A" & Rows.Count).End(xlUp).Row).Copy _ Range("A" & lgn) 'On copie le tableau de la feuille source à la suite du tableau existant sur la feuille de destination Next i Range("A4:J" & Range("A" & Rows.Count).End(xlUp).Row).RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7 _ , 8, 9, 10), Header:=xlYes 'on élimine les lignes en doublon dans la feuille de destination For i = 5 To Range("A" & Rows.Count).End(xlUp).Row 'If Range("K" & i) = "" Then 'On met ou remet les listes de choix dans toutes les cellules de la colonne K With Range("K" & i).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=Données!$B$2:$B$4" End With 'End If 'If Range("M" & i) = "" Then 'On met ou remet les listes de choix dans toutes les cellules de la colonne M With Range("M" & i).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=Données!$C$2:$C$4" End With 'End If Next i End Sub Sub Extraire() UserForm1.Show End Sub Sub requêtes() Dim wb_WMATL As Workbook, sh_dashboard As Worksheet Set wb_WMATL = Workbooks("Copie de OPS Center Facturation v2pa.xlsm") Set sh_dashboard = wb_WMATL.Sheets("Invoice Follow-up") Sheets("Maximo VAN + GAR").Activate Sheets("Maximo VAN + GAR").Range("A2").Select Selection.ListObject.QueryTable.Refresh Sheets("Maximo Betrieb").Activate Sheets("Maximo Betrieb").Range("A2").Select Selection.ListObject.QueryTable.Refresh End Sub
Merci
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 Sub EnregistrerFacture() 'déclaration des variables Dim NomDossier As String Dim CheminDossier As String On Error GoTo 1 'Nom de dossier NomDossier = Application.InputBox("Dossier Enregistrement :", "Dossier") CheminDossier = "D:\Mes Docuements\Excel\Facture\" & NomDossier & "\" If NomDossier = "" Then Exit Sub 'Enregistrement au format PDF ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ CheminDossier & "Facture_" & Range("U4").Value & ".PDF", quality:= _ xlQualityStandard, includedocproperties:=True, ignoreprintareas:=False, _ from:=1, to:=1, openafterpublish:=False 1 End Sub
Cordialement
Pierro26
Partager