XL 2016 MACRO VBA - export CSV décalé

schyzo

XLDnaute Nouveau
Bonjour,

J'ai un fichier de données au format Excel que j'aimerais exporter en CSV à l'aide d'une macro.
Mon export fonctionne, mais je ne comprend pas pourquoi Excel saute des lignes à l'export...

Description du fichier de données :
un seul onglet
les intitulés des colonnes sont en ligne 9
Mes données à exporter sont donc sur la plage A9:AM3000

La macro crée bien le CSV mais il comporte les intitulés de colonnes en ligne 1
puis il saute 9 lignes blanches, et les données commencent à la ligne 10 (comme dans le fichier de données d'origine).

Voici le code de la macro que j'utilise :

Sub Export_DATA()
' Import des données de production
'Box de validation
Rep = MsgBox("Voulez-vous continuer ?", vbYesNo + vbQuestion, "création du CSV ?")
If Rep = vbYes Then
GoTo SUITE
Else
GoTo FIN
End If


SUITE:
' Selection et enregistrement CSV
ActiveSheet.Range("A9:AM3000").Select
Selection.Copy

'EnregistrerClasseur()

Dim strFichier As String

strFichier = ActiveWorkbook.Name & "-import_prod" & ".csv"

Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
Application.DisplayAlerts = False

ActiveWorkbook.SaveAs Filename:=strFichier, FileFormat:=xlCSV, CreateBackup:=False, Local:=True

FIN:
ActiveWindow.Close
End Sub


Pouvez-vous me dire comment me débarrasser des lignes blanches dans le fichier CSV exporté ?
Merci :eek:)
 

Lone-wolf

XLDnaute Barbatruc
Bonjour schyzo
Tu supprime tout ça
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
Application.DisplayAlerts = False

VB:
Option Explicit

Sub Export_DATA()
Dim strFichier As String, Rep


    strFichier = ThisWorkbook.Path & "\import_prod.csv"
    ' Import des données de production
    'Box de validation
    Rep = MsgBox("Voulez-vous continuer ?", vbYesNo + vbQuestion, "création du CSV ?")
    If Rep = vbYes Then
        ActiveSheet.Copy
        ActiveSheet.SaveAs Filename:=strFichier, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    Else
        Exit Sub
    End If
    Application.DisplayAlerts = False
    ActiveWorkbook.Close True
End Sub

Pour supprimer les lignes

With ActiveWorkbook.Sheets(1)
For i = 1 to 8
.Rows(i).EntireRow.delete
next i
End with
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re,

Avec la macro ci-dessus, toutes les données se retrouvent en une seule colonne dans le fichier CSV. Si tu veux les avoir dans des colonnes séparées

VB:
Option Explicit

Sub Export_DATA()
Dim strFichier As String, Chemin As String, derlig As Long
Dim plage As Range, sep As String, Rep

    derlig = ActiveSheet.Range("a" & Rows.Count).End(xlUp).Row
    Set plage = ActiveSheet.Range("a9:m" & derlig)
    strFichier = ThisWorkbook.Path & "\import_prod.csv"
    sep = ";"    ' séparateur de ton choix
    ' Import des données de production
    'Box de validation
    Rep = MsgBox("Voulez-vous continuer ?", vbYesNo + vbQuestion, "création du CSV ?")
    If Rep = vbYes Then
        SaveAsCSV plage, sep, strFichier
    Else
        Exit Sub
    End If
       Application.DisplayAlerts = False
       ActiveWorkbook.Save
       Application.Quit
End Sub

Sub SaveAsCSV(plage As Range, sep As String, _
strFichier As String)
Dim Temp As String, r As Range, c As Range

    Open strFichier For Output As #1
    For Each r In plage.Rows
        Temp = ""
        For Each c In r.Cells
            Temp = Temp & c & sep
        Next
        Temp = Left(Temp, Len(Temp) - 1)
        Print #1, Temp
    Next
    Close
    Set plage = Nothing: Set c = Nothing: Set r = Nothing
End Sub
 
Dernière édition:

schyzo

XLDnaute Nouveau
AH et une dernière question !
mon fichier de données contient une colonne avec des numéros de série (de type : 11330099887378784)
Du coup, Excel me les affiche systématiquement au format scientifique...et donc, ors de l'export en CSV, ce format scientifique s'applique aussi.
J'ai besoin que dans le fichier CSV exporté, les numéros de séries ne soient pas "1,992E+13" mais bien mon nombre entier.
J'ai donc rajouté ça :
Sheets("IMPORT_PROD").Columns("Z:Z").NumberFormat = "0"
(import_prod = nom de la feuille depuis laquelle je fais l'export / les numéros de série sont en colonne Z)

Mais Excel me répond : "Erreur de compilation: Sub ou Function non définie".
Je sais pas où insérer cette ligne en fait...

Merci encore ;o)
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Merci beaucoup Lone-wolf !
Mais juste pour ma culture, qu'est-ce qui n'allait pas dans la sélection sur ma macro d'origine ?
@schyzo
Avec cette syntaxe, l'export se fait correctement (sans boucle et les données séparées dans chaque colonne)
VB:
Sub Export_CSV()
Dim fCSV As Workbook, strFichier$
With ThisWorkbook
strFichier = .Path & "\" & Split(.Name, ".")(0) & "-import_prod.csv"
End With
ActiveSheet.Copy
Set fCSV = ActiveWorkbook: fCSV.Sheets(1).Rows("1:8").Delete
Application.DisplayAlerts = False
With fCSV
    .SaveAs Filename:=strFichier, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    .Close False
End With
End Sub
Je te laisse remettre ton MsgBox et tes Goto ;)

Ci-dessous (pour le fun) une version légérement "allégée" ;)
VB:
Sub Export_CSV_light()
Dim fCSV As Workbook, strFichier$
With ThisWorkbook
strFichier = .Path & "\" & Split(.Name, ".")(0) & "-import_prod.csv"
End With
Application.ScreenUpdating = 0: Application.DisplayAlerts = 0
ActiveSheet.Copy: Set fCSV = ActiveWorkbook: fCSV.Sheets(1).Rows("1:8").Delete
With fCSV
.SaveAs Filename:=strFichier, FileFormat:=6, Local:=-1: .Close 0
End With
End Sub
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Bonjour schyzo, Jean Marie, le Forum :)

@schyzo
qu'est-ce qui n'allait pas dans la sélection sur ma macro d'origine ?

Mise à part le SELECT; strFichier = ActiveWorkbook.Name & "-import_prod" & ".csv"
ActiveWorkbook.Name n'est pas le chemin du répertoire, mais le nom du classeur actif.

Mes données à exporter sont donc sur la plage A9:AM3000
Et maintenant tu parle de la colonne Z?? o_O

Pas trop sûr :rolleyes:
Set plage = ActiveSheet.Range("a9:m, z9:z" & derlig)

For Each r In plage.Rows
Temp = ""
For Each c In r.Cells
c.Offset(0, 25) = Cstr(r.Offset(0, 25)
Temp = Temp & c & sep
Next
 

schyzo

XLDnaute Nouveau
Merci pour ton aide Lone-wolf.
Effectivement, mes données à exporter sont entre la colonne A et la colonne AM (donc la colonne Z est bien au milieu).
Cette colonne contient donc des numéros de séries qui doivent être exportés sous format nombre dans le CSV et pas avec l'écriture scientifique qu'Excel converti tout seul.

Le bout de code que tu m'as fait rajouter semble poser des problèmes (syntaxe au niveau du c.Offset).
Voilà ma macro en entier :

VB:
Option Explicit
Sub Export_DATA()
Dim strFichier As String, Chemin As String, derlig As Long, Besoin As String, r As Object, c As Object, Temp As String
Dim plage As Range, sep As String, Rep
  
    derlig = ActiveSheet.Range("a" & Rows.Count).End(xlUp).Row
    Set plage = ActiveSheet.Range("A9:AM" & derlig)
    Besoin = Worksheets("DATA_1").Range("C2").Value
    strFichier = ThisWorkbook.Path & "\APRR-NUMA - " & Besoin & "_import_prod.csv"
  
    'formatage des SERIAL
        Set plage = ActiveSheet.Range("a9:m, z9:z" & derlig)
        For Each r In plage.Rows
        Temp = ""
        For Each c In r.Cells
        c.Offset(0, 25) = Cstr(r.Offset(0, 25)
        Temp = Temp & c & sep
        Next
      
  
    sep = ";"    ' choix du séparateur
    ' Import des données de production
    'Box de validation
    Rep = MsgBox("Voulez-vous continuer ?", vbYesNo + vbQuestion, "création du CSV ?")
    If Rep = vbYes Then
        SaveAsCSV plage, sep, strFichier
    Else
        Exit Sub
    End If
       Application.DisplayAlerts = False
       ActiveWorkbook.Save
       'Application.Quit
End Sub

Sub SaveAsCSV(plage As Range, sep As String, _
strFichier As String)
Dim Temp As String, r As Range, c As Range

    Open strFichier For Output As #1
    For Each r In plage.Rows
        Temp = ""
        For Each c In r.Cells
            Temp = Temp & c & sep
        Next
        Temp = Left(Temp, Len(Temp) - 1)
        Print #1, Temp
    Next
    Close
    Set plage = Nothing: Set c = Nothing: Set r = Nothing
End Sub
 

Lone-wolf

XLDnaute Barbatruc
Re

Mais j'ai bien dit que je n'était pas sûr. Il Faut mettre la colonne Z au format texte comme ceci '11330099887378784.
Tu as mis 2 fois Set plage, une fois ça suffit. Remplace Set plage = ActiveSheet.Range("a9:m, z9:z" & derlig) par
Set plage = ActiveSheet.Range("a9:m" & derlig, "z9:z" & derlig)

Supprime c.Offset(0, 25) = Cstr(r.Offset(0, 25)

Dans le CSV, tu sélectionne la colonne Z, format personnalisé et tu met 0.
 

schyzo

XLDnaute Nouveau
L'objectif, c'est qu'une fois le fichier CSV généré, on n'ait pas besoin de l'ouvrir pour modifier les formats (ça limite les risques d'erreur de manip).
J'ai bien remplacé ma ligne Set plage = ActiveSheet.Range("a9:m" & derlig, "z9:z" & derlig).
 

job75

XLDnaute Barbatruc
Bonjour schyzo, Lone-wolf, JM,

Si la colonne Z a bien été mise au format Texte on peut y concaténer autant de chiffres que l'on veut.

Et le fichier CSV créé les récupère tous correctement.

Mais ne pas ouvrir ensuite le fichier CSV avec Excel car la colonne Z serait alors convertie en nombres au format scientifique.

Il faut ouvrir le fichier CSV avec le Bloc-notes ou avec la commande Workbooks.OpenText (renseignez-vous).

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 147
Messages
2 085 765
Membres
102 968
dernier inscrit
Tmarti