私はそれを避けるようにしていますが、私は時々ExcelでCSVファイルを開かなければならないことがあります。その際、数値を含む列がフォーマットされてしまい、私の目的には役に立たなくなってしまいます。私の知る限り、インポート時にこれを防ぐ唯一の方法は、ファイル名を変更して拡張子を.csvではなく、インポートウィザードを使用して各列の形式を個別に指定することです。50~60 カラムのファイルでは、これは現実的ではありません
インターネット上でよく聞かれるこの質問に対する回答はすべて、ファイルを開いた後にフォーマットされた数字を変換する方法(これは私にとってはうまくいきません – 私は一般的な問題を解決したいのであって、いくつかの特定のケースを解決したいのではありません)、または各列のフォーマットタイプを手動で選択する方法(これは私はしたくありません)のいずれかを示唆しているので、私は開いたすべてのCSVファイルのすべての列が常にテキストとしてフォーマットされているようなグローバルな環境設定またはスタイルを設定する方法を探しています。数値を引用符で「アーマリング」する方法も知っていますが、私が受け取るファイルはそのようなものではないので、Excelがファイルを台無しにしないようにファイルを前処理する必要がないようにしたいと思っていました
これを具体的に行う方法はありますか?インポート中に毎回手動で各列を選択しなくても、開いているCSVファイルのすべての列を常にテキストとしてフォーマットする方法はありますか?
私はエクセル2003を使っていますが、それがわかっているのであれば、2007年の答えを出します
74 William Gunn 2011-07-05
This works:
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"
カンマで区切られたファイルが、すべての列がテキストとしてフォーマットされたExcelシートとして開かれるようになりました
Wetmelonのウィザードソリューションは、ちょうどうまく動作することに注意してください, しかし、あなたが多くのファイルを開いている場合、あなたは、私のように、あなたは、毎回、それをShift-Clickするために列60にスクロールして、の倦怠感を育つかもしれません
EDIT @GSergさんは下のコメントで、これは「うまくいかない」「スペースと先頭のゼロを食べる」と述べています。質問に対するコメントを引用します
理由は不明ですが、VBAですべての列のフォーマットを明示的に指定しても、ファイルの拡張子がCSVの場合、Excelはそれを無視します。拡張子を変更するとすぐに、同じコードで正しい結果が得られます
上のコードは “動作する “のですが、この馬鹿げたExcelの挙動に殺されてしまいます。どちらにしても、拡張子を”.csv “以外のものに変更する必要があります。その後は自由の身です
8 Jean-François Corbett 2011-07-06
エクセルでCSVを開く方法
Good way
Excel → データ → 外部データを取得 → Shiftですべての列を選択し、テキストを選択します
上向き。すべての値を例外なくテキストとして正しく扱います
ダウンサイド。単純なダブルクリックよりも手順が多い
Bad way
ダブルクリックやExcelの「開く」ダイアログでCSVを開きます
マイナス面。Excelの内部CSVハンドラは、先頭に
-
または=
記号を持つ値をテキストではなく数式として誤認しますマイナス面。Excelの自動検出された列形式のため、
0001
のようなバイナリ値から先頭のゼロが失われます
良い方法(VBAの場合
QueryTablesを使用する (
Get external data
のVBA対応) → コード例上向き。すべての値を例外なくテキストとして正しく扱います
デメリット。
OpenText
メソッドよりも若干コードが多い
悪い方法(VBAの場合
Workbooks.OpenText
メソッドを使う → サンプルコードを使うマイナス面。この方法は、すべての欠陥を持つExcelの内部CSVインポートハンドラをまだ使用しています
デメリット。また、拡張子がCSVの場合、
OpenText
のfieldinfo
パラメータは無視されます。通常はこのパラメータですべてのカラムフォーマットを選択できますが、拡張子がCSVの場合はそうはいきません。この動作については、Stack Overflowを参照してください一時的に拡張子をCSVからTXTに変更してからCSVに戻すことは、ソースファイルを完全に制御している場合には有効な回避策です
Additional methods
CSVを作成するソースにアクセスできる場合は、CSVの構文を変更することができます。 すべての値を二重引用符で囲み、
="00001"
のように等号を前置するか、すべての値にタブを付けます。どちらの方法でも、Excelは値をテキストとして扱うようになります2行目(ダブルクォート方式)と3行目(タブ方式)がExcelで変更されていないことに注意してください
メモ帳でCSVを開き、すべての値をExcelにコピー&ペーストします。その後、データ – テキストを列の下側に使用します。列のフォーマットを一般的なものからテキストに戻すために列のテキストを変更すると、一貫性のない結果が得られます。値が文字で囲まれた
-
を含む場合(例: “=E1-S1”)、Excelはその値を複数の列に分割しようとします。そのセルの右側に位置する値は上書きされる可能性があります (列へのテキストの動作は、Excel 2007 と 2013 の間でどこかで変更されたので、現在は動作しません)
CSVを開き、すべての値をテキストとしてインポートするExcelアドイン
これはCSVインポートのアクションを簡素化するためのExcelプラグインです。 主な利点:ワンクリックで解決でき、外部データの取得の背後にあるのと同じ防弾方法であるQueryTables
を使用します
- それは、CSVとTXTファイルをインポートすることができますExcelに新しいメニューコマンドを追加します。すべての値は、現在選択されているセルから始まるアクティブなシートにインポートされます
- Excelアドインは、WindowsとMacのすべてのOfficeバージョンに対応しています
- アドイン全体のコードはわずか35行です。興味があれば、ソースコードのコメントをチェックしてください
- 使用するCSVリストの区切り文字(カンマまたはセミコロン)は、ローカルのExcelの設定から取得します
- エンコードはUTF-8に設定されています
Installation
- アドインをダウンロードして、アドインフォルダに保存してください。
%appdata%\Microsoft\AddIns
- Excelを開き、アドインを有効にします。
File tab → Options → Add-Ins → Go To
とImportCSV.xla
を選択します - VBAマクロを有効にします。
File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
- Restart Excel
あなたは、「アドイン」という新しいメニューバーのエントリに気づくでしょう、あなたはこのボタンを使用して、インポートのダイアログを経由することなく、迅速にCSVファイルを開くために使用します
Windowsエクスプローラから直接CSVを開くためのPowerShellスクリプト
PowerShellスクリプトを使ってCSVファイルを開き、自動的にExcelに渡すことができます。このスクリプトは、値を常にテキストとして扱い、ボーナスとしてUTF-8エンコーディングを処理するExcelのテキストインポートメソッドを黙って使用します
- 新しいテキストファイルを作成し、以下のスクリプトを貼り付けてください。コメント付きのバージョンはここにあります
$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
のようにどこかに保存してください。(拡張子.ps1
に注意)- WinR ”
shell:sendto
” Enterでsendtoフォルダを開きます
- WinR ”
- 右クリックして新しいショートカットを作成し、この行を貼り付けます。スクリプトを置いたパスを自分のものに変更することを忘れないでください。ショートカットの名前は、例えば Excel とします
” %SystemRoot%system32\WindowsPowerShell\v1.0powershell.exe ” -NoProfile -NonInteractive -WindowStyle Hidden -File “C:C:my\foldermyScript.ps1”
これで、(複数の)CSVを選択して、Right-click » SendTo » Excel
でExcelで開くことができるようになりました
75 nixda 2013-01-04
最初に .xlsx を開き、データ接続を作成して .csv をインポートすることで試すことができます。カンマ区切りを選択し、すべての列を “一般 “ではなくテキストとして扱うオプションを選択します
編集:あ、質問を完全に読んでいませんでした。インポートウィザードで、テキストとしてインポートしたい最初の列のヘッダーを選択し、最後の列のヘッダーまでスクロールして、Shift+クリックします。そして、「テキスト」放射状オプションを選択します
5 None 2011-07-06
Wetmelonさんの提案は、以下のようにすれば(.csvでも)動作します
- エクセルを開いて、空白のワークブックやワークシートを作成します
- データ」→「テキストから外部データを取得」をクリックします
- Wetmelonが説明している「テキストインポートウィザード」を使用します(コンマ区切り、最初の列を選択、最後の列をSHIFT+CLICK、すべてをTextに設定)
私はそれがより多くのステップであることを知っているが、少なくともそれは私が拡張子を変更することなく、この方法でCSVを開くことができます
4 Colorado Techie 2013-01-03
Watch Out!
手動方法「Excel→データ→外部データ取得→全ての列を選択してテキストを選択」を使用した場合
これは、「最初の行にデータがある列」(通常はヘッダー行)のテキストにのみ設定されます。 このウィザードでは、右よりも下にデータがあり、最初の行にデータがない可能性のある列は表示されません。 例えば、以下のようになります
Row1Col1、Row1Col2、Row1Col3
Row2Col1、Row2Col2、Row2Col3、Row2Col4
インポートウィザードではCol 4が表示されないので、!!!!をインポートする前にCol 4を一般的なフォーマットからテキストフォーマットに変更するオプションを得ることができません
2 PeterV 2015-12-02
ここでは、ジャン・フランソワ・コルベットが上記に投稿したコードの代替手順を紹介します
この手順は、すべての列がテキスト形式でフォーマットされたcsvファイルをExcelにインポートします
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
1 shivraj 2015-12-04
いつも同じデータをインポートしている場合(レコード形式、レイアウトなどが一定)は、インポート仕様を使用してAccessのマクロを書き、データをExcelにダンプして戻すことができます。これは何度かやったことがあります。私が行った他の方法は、VBAを使用して、ワークシートに1レコードずつデータを読み込み、読み込んだデータを解析することです。私の知る限りでは、Excelでインポート中にデフォルトのフォーマットを設定する方法はありませんし、もし設定できたとしても、解析しようとする次のファイルタイプで問題が発生するでしょう
0 user88859 2011-07-05
リクエスト通り、私のコメントを回答として提出します(もう少し情報を追加して)
Hey Scripting GuyがCSVをExcelにインポートするについてのブログ記事を書いてくれました。powershell内のデータオブジェクトを弄ることで、あなたが望むことができるかもしれません
記事では数値フォーマットを残したままセルにデータをインポートすることに言及していますが、Excel ComObjectのプロパティやメソッドを使って、データを強制的に生のテキストとしてセルに入力させることができるかもしれません(インポートの前後にセルのフォーマットをテキストにすることも可能です)
0 Matrix Mole 2011-07-05
理由は不明ですが、すべての列に明示的にフォーマットを指定しても、ファイルの拡張子がCSVであればExcelは無視します
Some options:
Wetmelon が提案するように、データをインポートするクエリを作成します デメリット:64ビットマシンではCSVデータベースのドライバが不足している可能性があります
ジャンのコードを使用しますが、一時フォルダにコピーしてコピーの拡張子を変更することを組み込んでください。 デメリット。元のファイルへのリンクがない(保存するとコピーが上書きされる); 後から手動でコピーを削除する必要があります。それでも、元のCSVの上に手動で名前を付けて保存することができます
メモ帳でCSVを開き、Ctrl+A, Ctrl+C, Excelに貼り付けて、データ-列にテキストを設定すると、一発ですべての列をテキストに設定できるいつものウィザードです。貴重な拡張子もExcelから非表示にしてくれるので、先ほどのオプションとはまた違った味わいがあります。 デメリット:手動
メモリにファイル全体を読み込んでシートに配置する非常にシンプルなVBAループを持っています。 デメリット:遅い、醜い
0 GSerg 2011-07-06
私が質問を正しく理解していれば、こちらで説明されているように、これは貼り付けスペシャルの Transpose オプションを使って簡単に解決できます
-2 Rodger 2013-03-12