Boucle VBA création de devis depuis une BDD
Bonjour à tous,
je débute en VBA et j'aurais besoin d'automatiser la création de devis depuis une base de données.
Pour que vous compreniez mieux mon problème, j'ai joint deux fichiers exemples 1 et 2.
En gros, je voudrais si possible avoir un bouton qui me permette de copier les données de ma base de données (fichier 1) vers mon modèle de devis (fichier 2), sauvegarder le devis en fichier excel, puis de l'exporter en pdf et de l'enregistrer.
En cherchant sur le net, j'ai réussi à créer ce code :
Sub Bouton1_Cliquer()
Range("A2").Select
Selection.Copy
Workbooks.Open ("C:\Users\user\Desktop\2.xlsx")
Range("B9:E12").Select
ActiveSheet.Paste
Windows("1.xlsx").Activate
Range("B2").Select
Application.CutCopyMode = False
Selection.Copy
Application.WindowState = xlNormal
Windows("2.xlsx").Activate
Range("D16").Select
ActiveSheet.Paste
Dim fichier As String
Dim Nom_f As String
Dim APH As String
Nom_f = "S1"
APH = Environ("UserName")
fichier = "C:\Users\" & APH & "\Desktop\" & Nom_f & ".xlsx"
Application.ScreenUpdating = False
ActiveWorkbook.SaveAs Filename:="C:\Users\" & APH & "\Desktop\" & Nom_f & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\user\Desktop\2.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
True
Windows("S1.xlsx").Activate
ActiveWorkbook.Close True
Application.ScreenUpdating = True
End Sub
Il fonctionne plutôt bien pour une ligne du tableau, mais j'aimerais que le bouton crée un fichier excel et un pdf par ligne de mon tableau.
En sachant que pour simplifier les choses, je vais être amené à utiliser cette macro sur plusieurs feuilles, et que le nombre de lignes par feuilles n'est pas forcement le même sur chaque feuilles.
Merci à vous pour l'aide que vous pourriez m'apporter.
Bonjour,
Si j'étais vous, je ne créerais pas de fichiers excel supplémentaires. Je me contenterais des pdfs. L'avantage de partir de la base, c'est qu'on peut modifier dessus directement et qu'on peut générer à volonté un même devis sans difficulté. Il faut juste considérer la feuille "Devis" comme une interface de mise en forme des informations.
Ca simplifierait beaucoup le travail...
Cdlt,
Bonjour,
Merci pour votre réponse.
En fait les données sont déjà sur Excel et on parle de 2500 devis à faire do'c c'est compliqué de les faire manuellement.
Merci quand même.
Bonne soirée.
Et bien justement ! A moins que j'ai mal compris...
Mais vous avez une base où vous saisissez les infos propres au devis et elles viennent alimenter une feuille devis par formules (à coups de recherchev ou index equiv principalement), ou si vous voulez via VBA. Il faut juste un clé (numéro de devis par exemple) qui s'incrémente de 1. Sur votre feuille "Devis", vous avez une cellule "N° Devis" qui vaudra =MAX(BASE[N°]). Et tout le reste est du recherchev (date, client, ...).
Vous pouvez aussi forcer le numéro pour ne pas avoir le max mais le numéro saisi (plus facile depuis la base car on peut filtrer ...) : =si(XX="";max(BASE[N°]);XX)
Ensuite, quand votre saisie est prête, vous appuyez sur un bouton qui édite le pdf.
Cdlt,
Je comprends ce que vous voulez dire mais le but de la démarche était de pouvoir éditer un grand nombre de devis en un seul clic.
Cependant il est tout à fait possible que j'inclue le devis dans la BDD, par contre je ne suis pas sûr que des formules permettent d'éditer beaucoup de devis à l suite comme on pourrait le faire avec une boucle (mais peut être que je me trompe).
Merci.
Et bien encore mieux ! Si si, avec formules ça marche. On boucle sur cette fameuse cellule qui force le numéro de devis. A chaque itération, la cellule change de numéro (incrémentation), les formules sont mises à jour, l'édition du pdf est lancée, ...
ok pourriez vous me faire un exemple de fichier éventuellement pour que je vois quelles formules utiliser pour la boucle ?
Alors, un fichier exemple, non, parce que ça me demanderait de partir de rien...
Mais il vous faut une feuille "Devis" avec des cellules classiques : date, numéro, client, adresse, ....
La cellule numéro est capitale puisqu'elle contient la formule :
=si(forcer="";max(BASE[Num]);forcer)où Base est la base (tableau structuré), Num la colonne des numéros et forcer la cellule nommée (sur feuille "devis" de préférence, mais hors champ) qui force le numéro de devis. Cette sur cette cellule qu'on bouclera.
Sur la feuille Base, il faut toutes les infos nécessaires à l'établissement du devis.
Il faut une feuille Client qui liste les noms de clients avec leurs coordonnées.
Donc sur "Devis", les formules sont des recherchev (sur Base) à partir du numéro de devis, sauf pour les coordonnées du client qui sont des recherchev (sur la feuille CLient) à partir de nom de client.
Au niveau des formules, c'est normalement correct.
Pour la partie VBA :
Sub Rafale()
dim imois%, nbl%, i%
dim dossier$, fichier$, chemin$
dossier = "C:\Users\user\Desktop\Devis\" 'dossier destination
imois = range("Mois").value 'autre cellule nommée mois PERMETTANT DE CHOISIR LE MOIS SUR LEQUEL PORTENT LES EDITIONS (1 à 12)
nbl = range("Base").rows.count 'nb lignes tableau (avoir tableau structuré ! éviter vides)
for i = 1 to nbl 'pour chaque ligne tableau
if month(range("Base[Date]")(i)) = imois and range("Base[Edition]")(i) <> "OK" then 'si la date appartient au mois choisi et pièce pas encore éditée
range("forcer") = range("Base[Num]")(i) 'cellule forcer (donc indirectement numero devis) vaut numéro devis lié à la date en cours
fichier = "D-" & range("Base[Num]")(i) & " " & range("Base[Client]")(i) & " " & format(Date, "YYMMDD") & ".pdf" 'nom fichier
chemin = dossier & fichier 'chemin
Sheets("Devis").exportasfixedformat type:=xltypepdf, filename:=chemin, ignoreprintareas:=false 'édition
'range("Base[Edition]")(i) = "OK" 'pour pointer l'édition
end if
next i
msgbox "éditions terminées"
end subCdlt,