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 SubPour 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
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
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.CloseMerci 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
Bonjour,
Pour déterminer la ligne de la première cellule vide d'une colonne, l'instruction est :
MaxLig = Cells(1, NumColonne).End(xlDown).RowCopier 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 WithBonjour 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 !
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 !