Excel: macro pour exporter la feuille de calcul en tant que fichier CSV sans quitter ma feuille Excel
Il y a beaucoup de questions ici pour créer une macro pour enregistrer une feuille de travail comme un fichier CSV. Toutes les réponses utilisez le SaveAs, comme celui-ci à partir de super-Utilisateur. Ils disent en gros de créer une fonction VBA comme ceci:
Sub SaveAsCSV()
ActiveWorkbook.SaveAs FileFormat:=clCSV, CreateBackup:=False
End Sub
C'est une grande réponse, mais je veux faire un exporter au lieu de sauver comme. Quand la Savée est exécutée, elle me cause deux ennuis:
- mon fichier de travail actuel devient un fichier CSV. J'aimerais continuer je travaille dans mon original .XLSM, mais pour exporter le contenu de la feuille de travail courante vers un fichier CSV avec le même nom.
- une boîte de dialogue s'affiche me demandant de confirmer que j'aimerais réécrire le fichier CSV.
est-il possible de simplement exporter la feuille de travail actuelle en tant que Fichier, mais de continuer à travailler dans mon fichier original?
4 réponses
@NathanClement était un peu plus rapide. Pourtant, voici le code complet (légèrement plus élaboré):
Option Explicit
Public Sub ExportWorksheetAndSaveAsCSV()
Dim wbkExport As Workbook
Dim shtToExport As Worksheet
Set shtToExport = ThisWorkbook.Worksheets("Sheet1") 'Sheet to export as CSV
Set wbkExport = Application.Workbooks.Add
shtToExport.Copy Before:=wbkExport.Worksheets(wbkExport.Worksheets.Count)
Application.DisplayAlerts = False 'Possibly overwrite without asking
wbkExport.SaveAs Filename:="C:\tmp\test.csv", FileFormat:=xlCSV
Application.DisplayAlerts = True
wbkExport.Close SaveChanges:=False
End Sub
presque ce que je voulais @Ralph. Votre code a quelques problèmes:
- il exporte seulement les codée en dur de la feuille nommée "Feuil1";
- il toujours d'exportation vers le même fichier temp, de l'écraser;
- il ignore le char de séparation locale.
pour résoudre ces problèmes, et répondre à toutes mes exigences, j'ai adapté le code d'ici. Je l'ai un peu nettoyé pour le rendre plus lisible.
Option Explicit
Sub ExportAsCSV()
Dim MyFileName As String
Dim CurrentWB As Workbook, TempWB As Workbook
Set CurrentWB = ActiveWorkbook
ActiveWorkbook.ActiveSheet.UsedRange.Copy
Set TempWB = Application.Workbooks.Add(1)
With TempWB.Sheets(1).Range("A1")
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
End With
Dim Change below to "- 4" to become compatible with .xls files
MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv"
Application.DisplayAlerts = False
TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
TempWB.Close SaveChanges:=False
Application.DisplayAlerts = True
End Sub
Il y a encore quelques petites chose avec le code ci-dessus que vous devriez remarquer:
.Close
etDisplayAlerts=True
devrait être dans une clause finale, mais je ne sais pas comment le faire en VBA- cela fonctionne Juste si le nom de fichier courant a 4 lettres, comme .xlsm. Ne pas travailler dans .xls excel fichiers. Pour les extensions de fichier de 3 caractères, vous devez changer le
- 5
- 4
lors de la configuration de MyFileName. - comme effet collatéral, votre bloc-notes sera remplacé par la feuille courante contenu.
Edit: mettre Local:=True
pour sauvegarder avec mon délimiteur CSV Local.
comme dans mon commentaire sur @neves post, j'ai légèrement amélioré ceci en ajoutant la partie xlPasteFormats ainsi que les valeurs pour que les dates apparaissent comme des dates - j'économise la plupart du temps comme CSV pour les relevés bancaires, donc des dates nécessaires.
Sub ExportAsCSV()
Dim MyFileName As String
Dim CurrentWB As Workbook, TempWB As Workbook
Set CurrentWB = ActiveWorkbook
ActiveWorkbook.ActiveSheet.UsedRange.Copy
Set TempWB = Application.Workbooks.Add(1)
With TempWB.Sheets(1).Range("A1")
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
End With
'Dim Change below to "- 4" to become compatible with .xls files
MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv"
Application.DisplayAlerts = False
TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
TempWB.Close SaveChanges:=False
Application.DisplayAlerts = True
End Sub
ci-dessous est ma version
- explicitement cherche "," à l'intérieur d'une cellule
- Il utilise aussi
UsedRange
- parce que vous voulez obtenir tout le contenu dans la feuille de travail - utilise un tableau pour boucler comme ceci est plus rapide que boucler à travers la feuille de travail les cellules
- Je n'ai pas utilisé de routines FSO, mais c'est une option
le code ...
Sub makeCSV(theSheet As Worksheet)
Dim iFile As Long, myPath As String
Dim myArr() As Variant, outStr As String
Dim iLoop As Long, jLoop As Long
myPath = Application.ActiveWorkbook.Path
iFile = FreeFile
Open myPath & "\myCSV.csv" For Output Lock Write As #iFile
myArr = theSheet.UsedRange
For iLoop = LBound(myArr, 1) To UBound(myArr, 1)
outStr = ""
For jLoop = LBound(myArr, 2) To UBound(myArr, 2) - 1
If InStr(1, myArr(iLoop, jLoop), ",") Then
outStr = outStr & """" & myArr(iLoop, jLoop) & """" & ","
Else
outStr = outStr & myArr(iLoop, jLoop) & ","
End If
Next jLoop
If InStr(1, myArr(iLoop, jLoop), ",") Then
outStr = outStr & """" & myArr(iLoop, UBound(myArr, 2)) & """"
Else
outStr = outStr & myArr(iLoop, UBound(myArr, 2))
End If
Print #iFile, outStr
Next iLoop
Close iFile
Erase myArr
End Sub