2009-07-28 11 views
1

J'essaye de produire plusieurs tables pour exceler des dossiers. Chaque fois que je lance la macro, il me demande d'écraser l'ancien fichier. Je suis à la recherche d'une méthode qui n'implique pas les clés d'envoi car elle verrouille le clavier et la souris jusqu'à ce que la macro se termine.Comment remplacer des fichiers sans invite dans Access 2007?

Quelle serait la meilleure solution?

Répondre

1

Avoir une autre macro qui s'exécute en premier et supprime le fichier s'il existe déjà.

+0

Il n'y a pas une option pour supprimer un fichier externe. –

+0

'Kill [PathToFile]' supprimera les fichiers externes, mais vous devrez gérer l'erreur générée si le fichier n'est pas là. –

0

Vous ne savez pas sur Access, mais la plupart des autres applications Office ont une propriété DisplayAlerts ou quelque chose de similaire, vous pouvez donc faire Application.DisplayAlerts = False avant d'effectuer des opérations qui provoquent normalement l'apparition d'une boîte de dialogue.

+0

J'ai essayé ça. Il supprime uniquement les invites internes. Cela ne fonctionne pas lors de l'exportation. –

4

Utilisez-vous DoCmd.OutputTo?

DoCmd.OutputTo acOutputTable, "Table1", acFormatXLS, "c:\temp\test.xls" 

Cette invite ne semble pas remplacer les fichiers existants.

+0

J'aime cette réponse, sauf que je souhaite que OutputTo vous permette de définir la version d'Excel qu'il exportait aussi. – BIBD

3

Vous pouvez faire quelque chose comme ça, mais c'est cludgy et pas très robuste.

DoCmd.SetWarnings False 
'do stuff 
DoCmd.SetWarnings true 

Ce que vous pouvez aussi faire est de voir d'abord si le fichier est là, et si elle est, supprimez-le (bien sûr cela détruit toutes les autorisations de fichiers spéciaux que vous aviez mis là-dessus).

If Dir(strPath) <> "" Then 
    Kill (strPath) 'Delete (strPath) 
End If 
DoCmd.TransferSpreadsheet acExport, _ 
          acSpreadsheetTypeExcel8, _ 
          "MyTableQueryName", _ 
          strPath, _ 
          True 
+0

+1 pour le second jeu de code – KevenDenen

+1

La désactivation de Setwarnings est toujours une très mauvaise idée. C'est essentiellement une façon d'ignorer les rapports d'erreurs d'Access, et vous ne savez pas avec certitude quels sont les problèmes particuliers que vous finissez par ignorer. –

+0

DWF, d'accord. Comme je l'ai dit, il est cludgy – BIBD

0

Je vous suggère de ne plus utiliser de macros dès que possible. Ils ne sont pas robustes (pas de gestion des erreurs) et ne sont pas gérables (comment pouvez-vous savoir où une macro est censée être utilisée?).

DoCmd.OutputTo ou l'une des commandes DoCmd.TransferXXX va être beaucoup plus facile à gérer à long terme.

0

Pour éviter les fichiers en double, j'ajoute généralement la date et l'heure au nom de fichier. Cela a également l'avantage de permettre à l'utilisateur de conserver plusieurs versions du même rapport.

Public Sub ExportToExcel(objectToExport As Variant, _ 
         outPutType As AcOutputObjectType, _ 
         filename As String, _ 
         Optional outputFormat = acFormatXLS) 
    ' Construct the filename using the date and time ' 
    Dim fnamebase As String 
    Dim ext As String 
    ext = Mid$(filename, InStrRev(filename, ".")) 
    fnamebase = Left$(filename, Len(filename) - Len(ext)) _ 
       & Format(Now, "-yyyymmdd-hh\hmm") 

    ' check if there is another file with the same name ' 
    ' append (1), (2) until we find a free slot ' 
    Dim fname As String 
    Dim count As Integer 
    fname = fnamebase & ext 
    Do While Len(Dir(fname)) > 0 
     count = count + 1 
     fname = fnamebase & "(" & count & ")" & ext 
    Loop 

    ' Now we're fairly sure no identical filename exists ' 
    DoCmd.OutputTo objectType:=outPutType, _ 
        ObjectName:=objectToExport, _ 
        outputFormat:=outputFormat, _ 
        OutputFile:=fname, _ 
        Encoding:=vbUnicode 

End Sub 

Vous pouvez désormais exporter les requêtes et les tables:

  • requêtes au format Excel 2007/2010 (format XLXS disponible uniquement en Access2007/2010):
    ExportToExcel "qrySupplierList", acOutputQuery, "D:\suppliers.xlsx", acFormatXLSX

  • Une table dans un fichier texte:
    ExportToExcel "Suppliers", acOutputTable, "D:\suppliers.txt", acFormatTXT

Maintenant, TransferSpreadSheet est mieux à des tables transférer vers Excel, vous pouvez préférer utiliser que l'on place:

Public Sub ExportTableToExcel(tableName As String, _ 
           filename As String, _ 
           Optional spreadSheetType = acSpreadsheetTypeExcel8) 
    ' Construct the filename using the date and time ' 
    Dim fnamebase As String 
    Dim ext As String 
    ext = Mid$(filename, InStrRev(filename, ".")) 
    fnamebase = Left$(filename, Len(filename) - Len(ext)) _ 
       & Format(Now, "-yyyymmdd-hh\hmm") 

    ' check if there is another file with the same name ' 
    ' append (1), (2) until we find a free slot ' 
    Dim fname As String 
    Dim count As Integer 
    fname = fnamebase & ext 
    Do While Len(Dir(fname)) > 0 
     count = count + 1 
     fname = fnamebase & "(" & count & ")" & ext 
    Loop 

    ' Now we're fairly sure no identical filename exists ' 
    DoCmd.TransferSpreadsheet TransferType:=acExport, _ 
           spreadSheetType:=spreadSheetType, _ 
           tableName:=tableName, _ 
           filename:=fname, _ 
           HasFieldNames:=True 
End Sub 

Une que vous utilisez comme ceci:

  • Pour exporter une table au format Excel97:
    ExportTableToExcel "Supplier", "D:\Suppliers.xlx"

  • Pour exporter au format XLSX (à partir d'Access 2007/2010 uniquement): ExportTableToExcel "Supplier", "D:\Suppliers.xlsx", acSpreadsheetTypeExcel12Xml

Questions connexes