Bien que j'essaie de l'éviter, je dois parfois ouvrir un fichier CSV dans Excel. Lorsque je le fais, il formate les colonnes contenant des nombres, ce qui les rend inutiles pour mes besoins. Autant que je sache, le seul moyen d'empêcher cela de se produire lors de l'importation est de renommer le fichier afin que l'extension ne soit pas .csv et d'utiliser l'assistant d'importation pour spécifier le format de chaque colonne individuellement. Pour les fichiers de 50 à 60 colonnes, cela n’est pas pratique.
Puisque chaque réponse à cette question souvent posée sur Internet suggère soit un moyen de reconvertir les nombres formatés une fois le fichier ouvert (ce qui ne fonctionnera pas pour moi - je veux résoudre le problème général, pas quelques cas spécifiques) ou en sélectionnant manuellement le type de format de chaque colonne (ce que je ne veux pas faire), je cherche un moyen de définir une préférence globale ou un style tel que toutes les colonnes de tous les fichiers CSV ouverts soient toujours au format texte. Je connais aussi le fait de "protéger" les chiffres avec des guillemets, mais les fichiers que je reçois ne viennent pas comme cela et j'espérais éviter de les traiter à l'avance afin que Excel ne les gâche pas.
Existe-t-il un moyen de faire spécifiquement this: formatez toujours toutes les colonnes de fichiers CSV ouverts sous forme de texte, sans sélectionner manuellement chaque colonne à chaque fois lors de l'importation?
J'utilise Excel 2003, mais je vais prendre des réponses pour 2007 si c'est ce que vous savez.
Cela marche:
Sub OpenCsvAsText(ByVal strFilepath As String)
Dim intFileNo As Integer
Dim iCol As Long
Dim nCol As Long
Dim strLine As String
Dim varColumnFormat As Variant
Dim varTemp As Variant
'// Read first line of file to figure out how many columns there are
intFileNo = FreeFile()
Open strFilepath For Input As #intFileNo
Line Input #intFileNo, strLine
Close #intFileNo
varTemp = Split(strLine, ",")
nCol = UBound(varTemp) + 1
'// Prepare description of column format
ReDim varColumnFormat(0 To nCol - 1)
For iCol = 1 To nCol
varColumnFormat(iCol - 1) = Array(iCol, xlTextFormat)
' What's this? See VBA help for OpenText method (FieldInfo argument).
Next iCol
'// Open the file using the specified column formats
Workbooks.OpenText _
Filename:=strFilepath, _
DataType:=xlDelimited, _
ConsecutiveDelimiter:=False, Comma:=True, _
FieldInfo:=varColumnFormat
End Sub
Usage:
OpenCsvAsText "C:\MyDir\MyFile.txt"
Le fichier séparé par des virgules est maintenant ouvert en tant que feuille Excel avec toutes les colonnes au format texte.
Notez que la solution de l'assistant @ Wetmelon fonctionne très bien, mais si vous ouvrez de nombreux fichiers, vous pouvez, comme moi, vous lasser, à chaque fois, de faire défiler l'écran jusqu'à la colonne 60 afin de cliquer dessus en maintenant la touche Maj enfoncée.
EDIT@GSerg indique dans le commentaire ci-dessous que cela "ne fonctionne pas" et "mange des espaces et des zéros non significatifs". Je citerai simplement le commentaire à la question, qui est plus descriptif:
Pour des raisons inconnues, même si vous fournissez explicitement des formats pour toutes les colonnes de VBA, Excel l'ignorera si l'extension de fichier est CSV. Dès que vous modifiez l'extension, ce même code donnera les résultats corrects.
Donc, le code ci-dessus "fonctionne", mais est tué par ce comportement ridicule d'Excel. Quelle que soit la façon dont vous le coupez, vous êtes obligé de changer l'extension en quelque chose d'autre que ".csv", désolé! Après cela, vous êtes libre à la maison.
Excel → Données → Obtenir des données externes → Sélectionnez toutes les colonnes avec Shift et choisissez Texte
Upside: traite toutes les valeurs correctement en tant que texte sans exception
Inconvénient: plus d'étapes qu'un simple Double-cliquez sur
Ouvrir un CSV avec Double-cliquez sur ou avec Excel Ouvrez avec
Inconvénient: le gestionnaire CSV interne d'Excel interprète mal les valeurs avec le signe -
ou =
en tête sous la forme d'une formule plutôt que du texte
Inconvénient: vous perdrez des zéros non significatifs à partir de valeurs binaires telles que 0001
en raison du format de colonne détecté automatiquement par Excel.
Bon moyen (pour VBA)
Utilisez QueryTables (l'équivalent VBA de Get external data
) → Example code
Upside: traite toutes les valeurs correctement en tant que texte sans exception
Inconvénient: un peu plus de code que la méthode OpenText
Mauvaise manière (pour VBA)
Utiliser la méthode Workbooks.OpenText
→ Exemple de code
Inconvénient: cette méthode utilise toujours le gestionnaire d'importation CSV interne d'Excel avec tous ses défauts.
Inconvénient: en outre, le paramètre fieldinfo
de OpenText
est ignoré si l'extension est CSV. Normalement, ce paramètre vous permet de choisir chaque format de colonne, mais pas si l'extension est CSV. Vous pouvez en savoir plus sur ce comportement sur Stack Overflow
Renommer temporairement l'extension source de CSV en TXT, puis en CSV est une solution de contournement valide si vous avez le contrôle total sur le fichier source.
Si vous avez accès à la source qui crée votre fichier CSV, vous pouvez modifier la syntaxe de ce dernier.
Placez toutes les valeurs entre guillemets et préfixez un signe égal tel que ="00001"
ou ajoutez une tabulation à chaque valeur. Les deux méthodes obligeront Excel à traiter la valeur en tant que texte
CSV dans Excel lorsqu'il est ouvert via un double clic
Notez comment la ligne 2 (méthode des guillemets doubles) et la ligne 3 (méthode des tabulations) ne sont pas modifiées par Excel
Ouvrez le fichier CSV dans Notepad et copiez-collez toutes les valeurs dans Excel. Ensuite, utilisez Données - Texte en colonnes
Inconvénient: Le texte dans les colonnes permettant de modifier les formats de colonne du texte général au texte génère des résultats incohérents. Si une valeur contient un -
entouré de caractères (par exemple, "= E1-S1"), Excel tente de scinder cette valeur en plusieurs colonnes. Les valeurs situées directement dans cette cellule peuvent être écrasées
(Le comportement de Texte en colonnes a été modifié quelque part entre Excel 2007 et 2013 afin que cela ne fonctionne plus)
Ceci est un plug-in Excel destiné à simplifier les actions d'importation CSV.
L’avantage principal: c’est une solution en un clic qui utilise QueryTables
, la même méthode pare-balles derrière Obtenir des données externes
%appdata%\Microsoft\AddIns
File tab → Options → Add-Ins → Go To
et sélectionnez ImportCSV.xla
.File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
Vous remarquerez une nouvelle entrée de la barre de menus appelée Compléments et vous utiliserez ce bouton pour ouvrir rapidement vos fichiers CSV sans passer par les tracas de la boîte de dialogue Importer.
Vous pouvez utiliser un script PowerShell pour ouvrir des fichiers CSV et les transmettre automatiquement à Excel. Le script utilise en mode silencieux la méthode d'importation de texte d'Excel qui traite les valeurs toujours en tant que texte et, en prime, gère le codage UTF-8.
$CSVs = @()
$args.ForEach({
If ((Test-Path $_) -and ($_ -Match "\.csv$|\.txt$")) {
$CSVs += ,$_
}
})
if (-Not $null -eq $CSVs) {
$Excel = New-Object -ComObject Excel.application
$Excel.visible = $true
$Excel.SheetsInNewWorkbook = $CSVs.Count
$workbook = $Excel.Workbooks.Add()
for ($i=0; $i -lt $CSVs.Count; $i++){
$csv = Get-Item $CSVs[$i]
$worksheet = $workbook.worksheets.Item($i + 1)
$worksheet.Name = $csv.basename
$TxtConnector = ("TEXT;" + $csv.fullname)
$Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
$query = $worksheet.QueryTables.item($Connector.name)
$query.TextFilePlatform = 65001
$query.TextFileTextQualifier = 1
$query.TextFileOtherDelimiter = $Excel.Application.International(5)
$query.TextFileParseType = 1
$arrFormats = ,2 * $worksheet.Cells.Columns.Count
$query.TextFileColumnDataTypes = $arrFormats
$query.AdjustColumnWidth = 1
$query.Refresh()
$query.Delete()
}
}
C:\my\folder\myScript.ps1
. (Notez l'extension .ps1
) Shell:sendto
" Enter"% SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NonInteractive -WindowStyle Caché -Fichier "C:\mon\dossier\monScript.ps1"
Maintenant, vous pouvez sélectionner (plusieurs) CSV et les ouvrir dans Excel via Right-click » SendTo » Excel
Vous pouvez essayer d’ouvrir un fichier .xlsx, puis de créer une connexion de données et d’importer le fichier .csv. Sélectionnez "délimité par des virgules", puis sélectionnez l'option permettant de traiter toutes les colonnes en tant que texte plutôt que "Général".
Edit: Oh, je n'ai pas bien lu la question. Dans l'assistant d'importation, sélectionnez le premier en-tête de colonne à importer en tant que texte, faites défiler jusqu'au dernier en-tête de colonne, puis appuyez sur Maj + clic sur l'en-tête. Sélectionnez ensuite l'option radiale "Texte".
La suggestion de Wetmelon fonctionne (même avec le format .CSV) si vous procédez comme suit:
Je sais que ce sont davantage d’étapes, mais au moins, cela me permet d’ouvrir les fichiers CSV de cette façon sans avoir à changer l’extension.
Fais attention!
Lorsque vous utilisez la méthode manuelle "Excel → Données → Obtenir des données externes → Sélectionnez toutes les colonnes et choisissez Texte" ......
Cela définira uniquement les colonnes sur le texte "avec des données dans la première ligne" (généralement une ligne d'en-tête). Cet assistant ne vous montre pas les colonnes plus à droite qui pourraient contenir des données plus loin mais pas dans la première ligne. Par exemple:
Row1Col1, Row1Col2, Row1Col3
Row2Col1, Row2Col2, Row2Col3, Row2Col4
Vous ne verrez jamais la Col 4 dans l'assistant d'importation, vous n'aurez donc pas la possibilité de le changer du format général au format texte avant l'importation !!!
Voici la procédure alternative au code posté ci-dessus par Jean-François Corbett
Cette procédure importera un fichier csv dans Excel avec toutes les colonnes au format texte.
Public Sub ImportCSVAsText()
Dim TempWorkbook As Workbook
Dim TempWorksheet As Worksheet
Dim ColumnCount As Integer
Dim FileName As Variant
Dim ColumnArray() As Integer
'Get the file name
FileName = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", FilterIndex:=1, Title:="Select the CSV file", MultiSelect:=False)
If FileName = False Then Exit Sub
Application.ScreenUpdating = False
'Open the file temporarily to get the count of columns
Set TempWorkbook = Workbooks.Open(FileName)
ColumnCount = TempWorkbook.Sheets(1).Range("A1").SpecialCells(xlCellTypeLastCell).Column
TempWorkbook.Close SaveChanges:=False
'Resize the array to number of columns
ReDim ColumnArray(1 To ColumnCount)
For i = 1 To ColumnCount
ColumnArray(i) = xlTextFormat
Next i
Set TempWorkbook = Workbooks.Add
Set TempWorksheet = TempWorkbook.Sheets(1)
Application.DisplayAlerts = False
TempWorkbook.Sheets(2).Delete
TempWorkbook.Sheets(2).Delete
Application.DisplayAlerts = True
With TempWorksheet.QueryTables.Add("TEXT;" & FileName, TempWorksheet.Cells(1, 1))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1251
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = ColumnArray
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
Pour des raisons inconnues, même si vous fournissez explicitement des formats pour toutes les colonnes, Excel l'ignorera si l'extension de fichier est CSV.
Quelques options:
Créez une requête pour importer les données, comme Wetmelon suggère .
Inconvénient: il se peut que des pilotes de base de données CSV soient manquants sur un ordinateur 64 bits.
Utilisez code de Jean , mais intégrez la copie du fichier dans un dossier temporaire et la modification de l'extension de la copie.
Inconvénient: pas de lien vers le fichier d'origine (l'enregistrement écrasera la copie); vous devrez ensuite supprimer manuellement la copie. Néanmoins, vous pouvez enregistrer manuellement sous sur le fichier CSV d'origine.
Ouvrez le CSV dans le Bloc-notes, Ctrl+A, Ctrl+C, collez dans Excel, puis Données - Texte en colonnes, puis utilisez l’assistant habituel pour définir toutes les colonnes en texte en une seule fois. C'est une version différente de l'option précédente, car elle masque également l'extension précieuse d'Excel.
Inconvénient: manuel.
Ayez une boucle VBA très simple qui lit le fichier entier en mémoire et le met sur la feuille, cellule par cellule.
Inconvénient: plus lent, laid.
Si vous importez toujours les mêmes données (format d'enregistrement constant, mise en page, etc.), vous pouvez écrire une macro Access à l'aide d'une spécification d'importation, puis exporter les données dans Excel. Fait cela peut fois. L’autre méthode que j’ai utilisée consiste à utiliser VBA, à lire les données dans l’enregistrement de la feuille de calcul, un enregistrement à la fois, puis à les analyser au fur et à mesure de la lecture. Autant que je sache, il n’existe aucun moyen de définir un format par défaut lors de l’importation dans Excel et même si vous le pouviez, des problèmes se produiraient lors du prochain type de fichier que vous souhaitez analyser.
En tant que demande, soumettre mon commentaire comme réponse (avec un peu plus d’informations ajoutées):
Hey Scripting Guy a publié un article sur Importation de CSV dans Excel qui pourrait vous donner des informations utiles. Jouer avec l’objet de données dans PowerShell peut vous permettre de faire ce que vous voulez.
Bien que l'article mentionne spécifiquement l'importation de données dans les cellules pouvant laisser le format numérique, il est possible de jouer avec certaines des propriétés et méthodes d'Excel ComObject pour forcer les données à entrer les cellules en tant que texte brut (ou forcer). la mise en forme des cellules en texte avant ou après l'importation).