Macro incrementation / sauvegarde

GRAR

XLDnaute Nouveau
Bonjour à tous,

Tout nouveau sur le site et débutant en matière de macro VBA sur excel, je vous demande de l'aide sur mon problème SVP.

Explication :

Je suis en Logistique, nous établissons des fiches réclamations (quand la marchandise est non conforme pour X raisons (états marchandises, écarts quantité, absence de documents...))

Process de base : Ses fiches sont rempli à la main par les caristes et sont ensuite scanné aux fournisseurs par l'agent administratives...
Constat : process long, risque d'erreur de saisie important et aucun suivi historique n'est possible (car fichier PDF...)

J'ai, alors, crée un formulaire avec un USERFORM (afin de rendre la tâche plus facile et d'éviter toutes erreur de saisie et de lecture).
En remplissant ce formulaire, tout se met dans un tableau (Onglet 1 / BD_RECLAMATION) (ma base de données) et en même temps complète ma fiche réclamation (Onglet 2 / TRAME_RECLAMATION)

Donc cela permet déjà d'avoir un suivi et d'envoyer un document propre et lisible.

Ma 1ere demande : Incrémentation

J'aimerai pouvoir incrémenter un numéro de réclamation automatiquement SELON le fournisseur qui s'affichera dans ma base de donnée, j'explique :

Fournisseur A : réclamation n°001
Fournisseur A : réclamation n°002
Fournisseurs B : réclamation n°001
Fournisseurs B : réclamation n°002
Fournisseurs B : réclamation n°003
Fournisseur A : réclamation n°003
Fournisseur A : réclamation n°004
Fournisseur C : réclamation n°001
etc...

En gros, selon mon fournisseur qui s'affichera , le numéro de réclamation s'incrémentera automatiquement dans l'ordre, en suivant le dernier numéro de réclamation de ce fournisseur.

Ainsi dans ma base de données j'aurai toutes mes réclamations avec tous mes fournisseurs et mes recherches seront fait grâce à des filtres, voire avec un tableau croisé dynamique.

Et j'aurai aucun risque de doublons au niveau des fiches de réclamation.

Ma 2eme demande : Enregistrement

Lorsque la fiche de réclamation est fini de compléter, j'aimerai enregistrer dans un répertoire dédiée à ces fiches avec un nom spécifique qui ne changera jamais + Numéro réclamation + Nom Fournisseur + date
Exemple : Reclamation_001_A_03/02/2016

Petit plus si possible : lors de l'enregistrement, est-ce possible d'enregistrer automatiquement le fichier dans le dossier concerné selon le nom du fournisseur. Exemple :
J:\Reclamations Fournisseurs\A\
J:\Reclamations Fournisseurs\B\

Ai-je été clair ?

Je demande surement BEAUCOUP trop mais je bloque depuis plusieurs jours.

MERCI PAR AVANCE DE VOTRE AIDE !!

Gérard
 

Pièces jointes

  • Exemple_BD Reclamation.xlsm
    52.5 KB · Affichages: 73

Modeste

XLDnaute Barbatruc
Re : Macro incrementation / sauvegarde

Bonsoir GRAR,

Faire des hypothèses, c'est bien ... mais il faudrait faire des recherches et/ou des tests pour t'assurer que ces hypothèses se vérifient :eek:

Le SaveAs avec une extension '.pdf' enregistre bien un ficher MAIS c'est en réalité un fichier Excel, dont tu modifies l'extension (comme si tu renommais le fichier, en "bousillant" l'extension originale et en la remplaçant par une autre). C'est ce qui explique que tu ne peux pas ouvrir le "faux" fichier pdf que tu viens de créer.
En clair, tu peux conserver cette instruction pour enregistrer ton fichier Excel, mais PAS pour créer ton pdf

Ce qui permet de créer un (vrai) fichier pdf, c'est le ExportAsFixedFormat. L'enregistreur de macro t'avait donc fourni la bonne syntaxe!
Pour enregistrer ton pdf, il faudrait donc utiliser (sauf erreur de ma part):
VB:
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"D:\RECLAMATION\" & Fournisseur & "\Fiche de réclamation " & Range("B9") & " n° " & Range("C4") & ".pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, OpenAfterPublish:=True

Quant à "ThisWorkbook.Path", il donne le chemin d'accès à l'emplacement où le fichier qui contient la macro est enregistré et non le "dernier dossier annoncé" :confused:

Quant à cette histoire de lecture seule, oublie-la (dans le cas présent, c'est juste un message "standardisé" qui en évoque la possibilité en tant que cause plausible -parmi d'autres- de l'échec d'ouverture de ton fichier pdf)

Comme précédemment, pour le reste, je ne m'engage pas. Si tu as encore une question sur un autre sujet, pense à créer une nouvelle discussion (après avoir vérifié qu'elle n'a pas déjà fait l'objet d'un autre échange).

N'oublie tout de même pas de nous dire ici, si ça a fini par fonctionner?
 

GRAR

XLDnaute Nouveau
Re : Macro incrementation / sauvegarde

Bonjour Modeste,

J'avais mis les deux codes suivant :

Code:
ActiveWorkbook.SaveAs "D:\Gérard NGUYEN\TEST RECLAMATION\" & Fournisseur & "\" & "Fiche de réclamation" & " " & Fournisseur & " " & "n°" & Numéro & ".pdf"

et

Code:
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"D:\RECLAMATION\" & Fournisseur & "\Fiche de réclamation " & Range("B9") & " n° " & Range("C4") & ".pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, OpenAfterPublish:=True

D'où mon problème du fichier PDF qui ne fonctionnais pas car doublon de code.
Du coup grâce à ton explication sur le changement d'extension, j'ai juste supprimer le 1er code et cela est impeccable pour l'enregistrement d'un fichier PDF.

Le problème qui suivait était de faire un code qui permettais de préparer le mail avec le fichier PDF en PJ automatiquement, par défaut il me mettait en PJ le fichier .XLS et non le .PDF.

Et maintenant tout fonctionne correctement, voici mon code :

Code:
Dim MaDate As String
    Dim stFileName As String
    Dim vaRecipients As Variant
    Dim noSession As Object
    Dim noDatabase As Object
    Dim noDocument As Object
    Dim noEmbedObject As Object
    Dim noAttachment As Object
    Dim stAttachment As String
    Dim vaMsg As Variant
    Dim StrSignature As Variant
    Dim stSubject As String
  
  On Error GoTo TraiteErreur
 
    'L'objet du mail
  stSubject = "Fiche de réclamation" & " " & Fournisseur & " " & "n°" & Numéro & " " & "Réf. " & Référence & " du " & Format(Date, "dd") & "-" & Format(Date, "mm") & "-" & Format(Date, "yyyy") & ".pdf"
  'MaDate = Date
    
    'Le message type dans le corps du mail
  vaMsg = "Bonjour, " & vbCrLf & vbCrLf & "Veuillez trouver ci-joint une réclamation concernant la livraison de ce jour. " & vbCrLf & vbCrLf & "Bonne réception." & vbCrLf & vbCrLf & "Cordialement."
 
    'Le fichier qu'on veut joindre au mail
  stFileName = "test"
  stAttachment = ActiveWorkbook.Path & "\" & "Fiche de réclamation" & " " & Fournisseur & " " & "n°" & Numéro & " " & "Réf. " & Référence & " du " & Format(Date, "dd") & "-" & Format(Date, "mm") & "-" & Format(Date, "yyyy") & ".pdf"
  
  'Test de l'existance de la PJ
 If Dir(stAttachment) = "" Then GoTo TraitePJ

  vaRecipients = ""
  Set noSession = CreateObject("Notes.NotesSession")
  Set noDatabase = noSession.GETDATABASE("", "")
 
  'Si Lotus Notes n'est pas ouvert alors ouvrir le mail
 If noDatabase.IsOpen = False Then noDatabase.OPENMAIL
 
  'Créer le mail avec PJ
  Set noDocument = noDatabase.CREATEDOCUMENT
  Set noAttachment = noDocument.CREATERICHTEXTITEM("stAttachment")
  Set noEmbedObject = noAttachment.EmbedObject(EMBED_ATTACHMENT, "", stAttachment)
  
  'Ajouter des valeurs aux principales propriétés du mail crée.
   With noDocument
        .Form = "Memo"
        .sendto = vaRecipients
        .Subject = stSubject
        .body = vaMsg
        .SaveMessageOnSend = True
        .PostedDate = Now()
    End With
    
    'Affichage du mail dans Lotus Notes.
    Dim Workspace
    Set Workspace = CreateObject("Notes.NotesUIWorkspace")
    Call Workspace.EditDocument(True, noDocument).FieldSetText("Body", vaMsg)
        
    'Release objects from memory.
    Set noEmbedObject = Nothing
    Set noAttachment = Nothing
    Set noDocument = Nothing
    Set noDatabase = Nothing
    Set noSession = Nothing
 
  Exit Sub
   
TraitePJ:
    
    MsgBox "Un problème est survenu lors de l'insertion de la pièce jointe", vbCritical, "Error"
 
    Set noEmbedObject = Nothing
    Set noAttachment = Nothing
    Set noDocument = Nothing
    Set noDatabase = Nothing
    Set noSession = Nothing

    Exit Sub
 
TraiteErreur:
 
    MsgBox "Un problème est survenu lors de la création du mail", vbCritical, "Error"
 
    Set noEmbedObject = Nothing
    Set noAttachment = Nothing
    Set noDocument = Nothing
    Set noDatabase = Nothing
    Set noSession = Nothing

'Application.Dialogs(xlDialogSendMail).Show

'Unload.Réclamation

Pour explication de mon process, lorsque mon fichier type de réclamation est renseigné (via un formulaire en amont), on clique sur bouton de controle qui permet à la fois d'enregistrer 2 fichiers, un XLS et un PDF, et prépare le mail (avec l'insertion de la PJ, l'objet, le corps du mail automatiquement)

Voilà !

Merci Modeste de ton aide et de tes explications parce qu'au final j'avais réussi à trouver les codes sans vraiment comprendre.
 

Discussions similaires

Réponses
9
Affichages
742

Statistiques des forums

Discussions
314 653
Messages
2 111 578
Membres
111 205
dernier inscrit
Adrien25