Exporter 5 Colonnes dans un autre fichier Excel

Bonjour à toutes et tous,

Je cherche comment faire en VBA pour exporter d'une de mes feuilles Excel 5 colonnes de x lignes, cela en cliquant sur un bouton.

J'ai réussi à créer un fichier .csv (avec ";" comme séparateur). Malheureusement j'ai besoin que le fichier exporter soit en .xlsx ou .xlsm et donc à l'heure actuelle j'ouvre le fichier .csv et j'enregistre sous la bonne extension.

D'avance un super grand merci de votre aide.

Je reste à votre disposition pour toutes autres questions ou précision à apporter.

Bonjour,

Peux tu transmettre ton code VBA actuel voire idéalement un fichier exemple complet ?

Autres questions :

  • -> Tes 5 colonnes sont elles contiguës ou séparées par d'autres que tu ne souhaites pas exporter ?
  • -> Qu'est ce qui défini le nombre de lignes à exporter ? Est-ce toutes les lignes contenant des données ? Un nombre défini par l'utilisateur ? Des lignes contenant une donnée spécifique ?

Merci pour la réponse rapide.

Voici la macro derrière le bouton sur le quelle je clique :

Dim sheetGenerate As Worksheet
Dim sheetData As Worksheet

Dim lastRow As Integer
Dim Line As Integer

Dim Repertoire As FileDialog
Dim szNomBaseDD As String
Dim nFile As Integer
Dim cr As String

Const cBarreCode As String = "A"
Const cPartNumber As String = "B"
Const cSinA As String = "C"
Const cSinB As String = "D"
Const cSinC As String = "E"
Const cModuleName As String = "F"
Const cLocationPath As String = "G"
Const cInOut As String = "H"
Const cNumber As String = "I"
Const cSignalName As String = "J"
Const cGenAdress As String = "L"

Const enteteBaseDD = "Barcode;PartNumber;SinA;SinB;SinC;ModuleName;Location path;;;Signal name;"

Function Setup()

    Set sheetGenerate = ThisWorkbook.Worksheets("GenerationCogitoFile")
    Set sheetData = ThisWorkbook.Worksheets("CarloGavazziProgramme")
    szNomBaseDD = sheetGenerate.Cells(3, 3)

    cr = Chr(13) & Chr(10)

End Function

Sub GenerateDataBaseCarloGavazzi()
Setup

    Const szScope As String = "SDB_CNF"
    Const szBandwidth As String = ""
    Const szLowPassFilter As String = ""
    Const szHighPassFilter As String = ""
    Const szWriteProtection As String = "0"

    Dim szType As String
    Dim szDataValue As String
    Dim sNewVarTmp As String

    szBaseDD = enteteBaseDD & cr
    lastRow = sheetData.UsedRange.Rows.Count

    '*********************** Parcourir toute la BD ***************************************************
    For Line = 2 To lastRow
        VarTmp = ""
        If (sheetData.Cells(Line, cSignalName) <> "") Then

            VarTmp = VarTmp & sheetData.Cells(Line, cBarreCode) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cPartNumber) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cSinA) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cSinB) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cSinC) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cModuleName) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cLocationPath) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cInOut) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cNumber) & ";"
            VarTmp = VarTmp & sheetData.Cells(Line, cSignalName) & ";"
            VarTmp = VarTmp & cr

            If (Not IsEmpty(sheetData.Cells(Line, cSignalName))) Then
                szBaseDD = szBaseDD & VarTmp
            End If
        End If
      Next
      szBaseDD = Left(szBaseDD, Len(szBaseDD) - 1)

      'Choix du répertoire
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Repertoire.Title = "Veuillez choisir un dossier dans lequel exporter le fichier"
    Repertoire.InitialFileName = "Desktop"
    Repertoire.Show
    szNomBaseDD = "Fichier CarloGavazzi"
    'Sauvegarde du fichier d'import pour la base de donnée
    If Repertoire.SelectedItems.Count > 0 Then

        nFile = FreeFile

        Open Repertoire.SelectedItems(1) & "\" & szNomBaseDD & sheetGenerate.Cells(3, 4) & ".csv" For Output As #nFile
            Print #nFile, (szBaseDD)
        Close #nFile

    Else
        MsgBox "Aucun fichier sélectionné"
        Exit Sub
    End If
End Sub

Pour répondre à tes autres questions :

  • Les 5 colonnes sont contiguë pour l'instant, je t'avoue cela pourrait changer du coup je préfère définir moi même les colonnes à exporter
  • Je défini le nombre de ligne en regardant dès qu'une ligne est complètement vide
  • Il y a bien des cellules vide qui sont importer

Cette macro convient-elle ?

Sub ExporterColonnes()

Dim NCol(5) As Byte, i As Byte, FSource As Worksheet, Destination As Workbook

'Numéro de colonne à exporter
NCol(0) = 1
NCol(1) = 2
NCol(2) = 3
NCol(3) = 5
NCol(4) = 7

'Définition des références
Set FSource = ActiveWorkbook.ActiveSheet
Set Destination = Workbooks.Add

'Copie des 5 colonnes choisies
For i = 0 To 4
    FSource.Columns(NCol(i)).Copy Destination.Sheets(1).Cells(1, i + 1) 'S'il faut laisser les colonnes à la même place, remplacer i + 1 par Ncol(i)
Next i

'Suppression des feuilles superflues
Application.DisplayAlerts = False
Destination.Sheets(3).Delete
Destination.Sheets(2).Delete
Application.DisplayAlerts = True

'Enregistrement et fermeture du fichier créé
Destination.SaveAs Filename:="C:\Bureau\Test" & Year(Date) & Month(Date) & Day(Date) & ".xlsx"
Destination.Close

End Sub
34monsieurgg.xlsm (19.77 Ko)

Super c'est au top.

Par contre as tu juste le code pour choisir le répertoire d'enregistrement ?

Actuellement tu as cette ligne :

Destination.SaveAs Filename:="C:\Users\Username\Desktop\CarloGav" & Year(Date) & Month(Date) & Day(Date) & ".xlsm"

Comme cela je peux enregistrer sur le réseau à partir de n'importe quelle machine mais c'est déjà vraiment top !

Un tout grand merci !

L'instruction "ActiveWorkbook.Path" permet de récupérer le chemin du dossier dans lequel se situe le classeur actif.

Tu peux aussi ajouter une instruction InputBox "Nom du chemin d'accès","Chemin ?", "C:\Users\Username\Desktop" mais il faut tout saisir et ça peut être fastidieux.

Je souhaiterai plutôt avoir un explorateur qui me permet de choisir le chemin ou l'enregistrer

J'ai un bug mais quelque chose dans ce style ci :

Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
Repertoire.Title = "Veuillez choisir un dossier dans lequel exporter le fichier"
Repertoire.InitialFileName = ActiveWorkbook.Path
Repertoire.Show
Destination.SaveAs Filename:=Chemin & "\CarloGav" & Year(Date) & Month(Date) & Day(Date) & ".xlsm"
Destination.Close

Merci beaucoup

Je ne maîtrise pas le code pour réaliser l'ouverture de l'explorateur, mais dans ton extrait de code, tu n'indiques nulle part à quoi correspond "chemin".

Bonjour,

Je me rend compte du temps que cela prend de copier/collé de colonne complète !

Serait il possible de faire la sélection uniquement des cases remplis ?

Je me réexplique du coup (je dirai même j'affine ma demande) !

Je dois copier une matrice de cellule (mais du coup plus les 5 colonnes complètes), Il faut uniquement X colonnes (à définir mais dans notre cas les colonne A à J) et du coup sur une longueur qui est définit par la dernière ligne complètement vide !

(Je vous joins un fichier exemple avec ma base de donnée )

Si vraiment c'est plus compliqué de faire des colonnes séparées on peut prendre X colonnes consécutive !

En question subsidiaire !!! (mais ça c'est du très (trop) haut vole pour moi ! ) Il faudrait que je copie colle dans des fichiers séparés les matrice ! En effet, la colonne N contient dans ce cas ci 2 valeurs différentes (mais cela pourrait être 3-4-...) il faudrait donc conditionner la copie de la cellule en fonction de la valeur de la colonne L. Et le fichier du coup prendrait le nom de la valeur de la colonne L.

14test.xlsm (730.68 Ko)

Bonjour,

Pour déterminer la ligne de la première cellule vide d'une colonne, l'instruction est :

MaxLig = Cells(1, NumColonne).End(xlDown).Row

Copier des colonnes contiguës est plus simple car il suffit juste de préciser la première et la dernière colonne, et la copie se fait en une fois et pas colonne par colonne.

Si tu souhaites ne reporter que des lignes respectant certaines conditions (par exemple contenant une même valeur), il faut contrôler et copier chaque ligne une par une.

Un exemple permettant de copier et coller à la suite en feuille "Destination" les cellules des colonnes A à J de la feuille active si la valeur en A est "BlaBla" :

LigDest = 1
With Sheets("Destination")
   For LigTest = 1 To MaxLig
      If Cells(LigTest, 1) = "BlaBla" Then 
         Range(Cells(LigTest, 1), Cells(LigTest, 10)).Copy .Range(.Cells(LigDest, 1), .Cells(LigDest, 10))
         LigDest = LigDest + 1
      End If
   Next LigTest
End With

Bonjour Pedro22,

Un grand merci pour ton aide ! J'ai créé un nouveau poste avec une explication plus complète pour faire au mieux !

je pense que c'est mieux pour les réponses et les recherche de sujet sur le forum !

Lien

Bonjour Monsieurgg !

N'hésite pas à découper tes différentes demandes pour avoir un post = un problème. Par ailleurs, si le problème posé à l'origine dans ce post est résolu : coche la petite case "résolu" pour faciliter le travail des gens qui rencontreront un problème similaire !

En effet désolé j'avais oublié de cocher la case résolu !

En tout cas un grand merci de ton aide !

Rechercher des sujets similaires à "exporter colonnes fichier"