none
Utiliser "FileExists" pour sauvegarder des fichiers Excel RRS feed

  • Question

  • Bonjour j'essaye via un bouton d'un classeur Excel 2016 de sauvegarder des fichiers dans un répertoire défini à partir d'une trame.

    Les fichiers enregistrer se nomment "C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy" )& ".xlsx").

    Je peux en enregistrer plusieurs par jour donc

    Dans mon code j'aimerais qu'il détecte si le fichier est existant dans le répertoire ou non.Si oui il l'enregistre comme suit :

    ("c:\......& Date.Now.ToString("dd.MM.yyyy" ) & "_1" & ".xlsx").

    Puis _2

    puis _3

    ect...

    j'ai tester ce code mais il ne fonctionne pas comme je voudrais :

    si aucun fichiers n'existent, tous va bien : 26.11.15.xlsx

    si un existe (dest) il me créer bien : 26/11/15_1.xlsx

    si (source2) existe , il ne me créer pas : 26/11/15_3 mais me demande si je veux remplacer 26/11/15_1

    Il doit y avoir un problème avec mon code

    Imports Microsoft.Office.Interop.Excel
    Imports System.IO
    Public Class Feuil1
        Dim source = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\Trame.xlsx")
        Dim source2 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_1" & ".xlsx")
        Dim dest = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & ".xlsx")
        Dim source3 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_2" & ".xlsx")
    
        Private Sub Save_Click(sender As Object, e As EventArgs) Handles Save.Click
            Copy.Copy()
            Dim NewTrans As Workbook = Application.Workbooks.Open(source)
            Dim TransSheet As Worksheet = NewTrans.Sheets(1)
            TransSheet.Range("A1").Select()
            TransSheet.Paste()
            TransSheet.Range("A1").Select()
            Dim sourcefilename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles), dest)
            Dim sourcefilename1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles), source2)
    
            If Not File.Exists(sourcefilename) Then
                NewTrans.SaveAs(dest)
            End If
            If File.Exists(sourcefilename) Then
                NewTrans.SaveAs(source2)
            End If
            If File.Exists(sourcefilename1) Then
                        NewTrans.SaveAs(source3)
                    End If
            NewTrans.Close()
            Copy.ClearContents()
            MsgBox("Données sauvegardées", MsgBoxStyle.Information, "1er Transfert")
        End Sub
    End Class


    JF Collombet ® CreateSpecificCulture

    jeudi 26 novembre 2015 16:40

Réponses

  • Bonjour,

    Supprimez les alertes juste avant de sauvegarder via

    Application.DisplayAlerts = False

    et ensuite réactiver les (par précaution)

    jeudi 26 novembre 2015 17:50
  • Bonjour,

    Si vous voulez enregistrer plusieurs fichiers par jour,
    je vous conseillerais de rajouter l' heure dans le fichier dans le
    format heure minutes secondes au lieu d'utiliser un index _1, _2, _3.

    Si vous êtes sûr de ne pas enregistrer le même fichier en
    moins d'une seconde, vous n' aurez jamais le message

    Cordialement. Joël


    vendredi 27 novembre 2015 08:03
  • C'est à cause du caractère ":". Ce n'est effectivement pas autorisé sous Windows.

    Vous pourriez faire ceci :

    ...Date.Now.ToString("dd.MM.yyyy_HH.mm.ss") & (".xlsx"))

    Vous auriez alors : 27.11.2015_17.11.52.xlsx

    Personnellement, je ne suis pas fan des "." dans les noms des fichiers.

    vendredi 27 novembre 2015 16:13
  • Bonjour,

    C'est normal.

    Comme votre Premier fichier existe 'fileexists' que se soit la deuxieme ou troiseme fois que vous passez dans votre fonction, vous passerez toujours par le else,  donc la creation de fileexists1.

      If Not File.Exists(fileexists) Then
                NewTrans.SaveAs(fileexists)
            Else
                NewTrans.SaveAs(fileexists1)
            End If
            NewTrans.SaveAs(fileexists2)

    Vous pouvez modifier comme ceci, mais encore un fois il est préférable de sauvegarder dans un tableau.

    If Not File.Exists(fileexists) Then
                NewTrans.SaveAs(fileexists)
            Else

                    If Not File.Exists(fileexists1) Then

                      NewTrans.SaveAs(fileexists1)

                   Else

                     NewTrans.SaveAs(fileexists2)

                    End if
            End If

     

    mercredi 2 décembre 2015 11:52
  • Juste un commentaire sur l'utilisation de la date et heure pour tamponner un fichier: il est préférable d'utiliser yyyyMMdd_HHmmSS

    Avec ce format "inversé" le tri des fichiers est naturel.

    Sinon le tri est fait par numéro du jour d'abord ce qui n'aide probablement pas...


    Cyrille Precetti

    mercredi 2 décembre 2015 14:25

Toutes les réponses

  • Bonjour,

    Supprimez les alertes juste avant de sauvegarder via

    Application.DisplayAlerts = False

    et ensuite réactiver les (par précaution)

    jeudi 26 novembre 2015 17:50
  • Bonjour,

    Si vous voulez enregistrer plusieurs fichiers par jour,
    je vous conseillerais de rajouter l' heure dans le fichier dans le
    format heure minutes secondes au lieu d'utiliser un index _1, _2, _3.

    Si vous êtes sûr de ne pas enregistrer le même fichier en
    moins d'une seconde, vous n' aurez jamais le message

    Cordialement. Joël


    vendredi 27 novembre 2015 08:03
  • Merci pour cette réponse, je viens de tester en rajoutant l'heure dans mon nom de fichier comme suit :

     Dim dest = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy ") & TimeOfDay.ToLongTimeString & (".xlsx"))

    Mais j'obtient une erreur sur l'écriture de l'heure :

    Le format 00/00/00 n'est pas permis pour un nom de fichier


    JF Collombet ® CreateSpecificCulture

    vendredi 27 novembre 2015 16:04
  • C'est à cause du caractère ":". Ce n'est effectivement pas autorisé sous Windows.

    Vous pourriez faire ceci :

    ...Date.Now.ToString("dd.MM.yyyy_HH.mm.ss") & (".xlsx"))

    Vous auriez alors : 27.11.2015_17.11.52.xlsx

    Personnellement, je ne suis pas fan des "." dans les noms des fichiers.

    vendredi 27 novembre 2015 16:13
  • Cela fonctionne parfaitement pour ce qui est de l'enregistrement à répétition. Mais une chose à laquelle je n'avait pas réfléchis, c'est que j'envois  ensuite des fichiers par un mail par programmation et que donc il va chercher la pièce jointe automatiquement via

    Dimdata2 AsNewAttachment("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\"& Date.Now.ToString("dd.MM.yyyy") & "_1"& ".xlsx")

    Trans2Mail.Attachments.Add(data2)

    Donc la avec mon systeme de _1 c'est facil à coder par contre si j'opte pour la date et l'heure, comment je fais pour récupérer la bonne pièce jointe?


    JF Collombet ® CreateSpecificCulture

    vendredi 27 novembre 2015 16:38
  • En sauvant le nom du fichier dans une variable string. Par conséquent, vous devez changer votre exemple en prévoyant la création du nom de fichier en dehors du constructeur de Attachment.
    vendredi 27 novembre 2015 17:10
  • Désolé je ne comprend pas trop votre réponse, comme je l'ai déjà mentionné, mon niveau n'est pas très élevé.

    Si vous pouviez m'éclairer un peu; je vous en serait reconnaissant

    Merci bcp


    JF Collombet ® CreateSpecificCulture

    vendredi 27 novembre 2015 17:29
  • J'ai tester une autre méthode qui sauvegarde bien avec _1 puis _2 puis _3 mais pas à chaque fois que je clique sur mon button; mais en une fois!

    voici les détails:

        Dim source = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\Trame.xlsx")
        Dim fileexists1 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_1" & ".xlsx")
        Dim fileexists As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & ".xlsx")
        Dim fileexists2 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_2" & ".xlsx")   
    
     Private Sub Sauver_Click(sender As Object, e As EventArgs) Handles Sauver.Click
            Plage.Copy()
            Dim NewTrans As Workbook = Application.Workbooks.Open(source)
            Dim TransSheet As Worksheet = NewTrans.Sheets(1)
            TransSheet.Range("A1").Select()
            TransSheet.Paste()
            TransSheet.Range("A1").Select()
            If File.Exists(fileexists) = False Then
                NewTrans.SaveAs(fileexists)
                If File.Exists(fileexists) = True Then
                    NewTrans.SaveAs(fileexists1)
                    If File.Exists(fileexists) = True AndAlso File.Exists(fileexists1) = True Then
                        NewTrans.SaveAs(fileexists2)
                    End If
                End If
            End If
    
            NewTrans.Close()
            Plage.ClearContents()
            MsgBox("Données sauvegardées", MsgBoxStyle.Information, "1er Transfert")
        End Sub


    JF Collombet ® CreateSpecificCulture

    samedi 28 novembre 2015 04:20
  • J'ai encore modifier mon code.

    Cette fois au premier click j'ai bien 28.1.2015 d'enregistrer

    et 28.11.2015_1 au 2eme click

    par contre lorque je click une 3eme fois,je n'ai pas 28.11.2015_2 mais un message qui me dit que 28.11.2015_1 existe déjà...

     
        Dim source As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\Trame.xlsx")
        Dim fileexists1 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_1" & ".xlsx")
        Dim fileexists = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & ".xlsx")
        Dim fileexists2 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_2" & ".xlsx")
        Private Sub Sauver_Click(sender As Object, e As EventArgs) Handles Sauver.Click
            Plage.Copy()
            Dim NewTrans As Workbook = Application.Workbooks.Open(source)
            Dim TransSheet As Worksheet = NewTrans.Sheets(1)
            TransSheet.Range("A1").Select()
            TransSheet.Paste()
            TransSheet.Range("A1").Select()
            If Not File.Exists(fileexists) Then
                NewTrans.SaveAs(fileexists)
            Else
                NewTrans.SaveAs(fileexists1)
            End If
            NewTrans.SaveAs(fileexists2)
    
            NewTrans.Close()
            Plage.ClearContents()
            MsgBox("Données sauvegardées", MsgBoxStyle.Information, "1er Transfert")
        End Sub
    


    JF Collombet ® CreateSpecificCulture

    samedi 28 novembre 2015 07:30
  • Bonjour,

    C'est normal.

    Comme votre Premier fichier existe 'fileexists' que se soit la deuxieme ou troiseme fois que vous passez dans votre fonction, vous passerez toujours par le else,  donc la creation de fileexists1.

      If Not File.Exists(fileexists) Then
                NewTrans.SaveAs(fileexists)
            Else
                NewTrans.SaveAs(fileexists1)
            End If
            NewTrans.SaveAs(fileexists2)

    Vous pouvez modifier comme ceci, mais encore un fois il est préférable de sauvegarder dans un tableau.

    If Not File.Exists(fileexists) Then
                NewTrans.SaveAs(fileexists)
            Else

                    If Not File.Exists(fileexists1) Then

                      NewTrans.SaveAs(fileexists1)

                   Else

                     NewTrans.SaveAs(fileexists2)

                    End if
            End If

     

    mercredi 2 décembre 2015 11:52
  • Juste un commentaire sur l'utilisation de la date et heure pour tamponner un fichier: il est préférable d'utiliser yyyyMMdd_HHmmSS

    Avec ce format "inversé" le tri des fichiers est naturel.

    Sinon le tri est fait par numéro du jour d'abord ce qui n'aide probablement pas...


    Cyrille Precetti

    mercredi 2 décembre 2015 14:25