私はそれを避けようとしますが、私は時々ExcelでCSVファイルを開かなければなりません。これを実行すると、数字を含む列がフォーマットされるので、私の目的には使えません。私が言うことができる限り、これが起こらないようにするための唯一の方法は インポート時 で拡張子を.csvにしないようにファイルの名前を変更し、各列のフォーマットを個別に指定するインポートウィザードを使うことです。 50〜60列のファイルの場合、これは実用的ではありません。
インターネット上のこのよくある質問に対するすべての回答は、ファイルが開いたらフォーマットされた数字を変換する方法のいずれかを示唆しています(これは私にとってはうまくいきません。一般的な問題を解決したいのです。あるいは、各列のフォーマットタイプを手動で選択して(私はしたくない)、開いているすべてのCSVファイルのすべての列が常にテキストとしてフォーマットされるように、グローバル設定またはスタイルを設定する方法を探しています。私は数字を引用符で囲むことについても知っていますが、私が手に入れたファイルはそのようにはならず、ファイルを前処理してExcelがそれらを台無しにしないようにしたいと思いました。
特に thisを行う方法はありますか:インポート中に毎回手動で各列を選択せずに、常に開いているCSVファイル内のすべての列をテキストとしてフォーマットしますか?
私はExcel 2003を使用していますが、それがあなたが知っていることであれば私は2007年に答えを取ります。
これは動作します:
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
使用法:
OpenCsvAsText "C:\MyDir\MyFile.txt"
カンマ区切りファイルは、すべての列がテキストとしてフォーマットされたExcelシートとして開くようになりました。
@ Wetmelonのウィザードソリューションはうまく機能しますが、たくさんのファイルを開いている場合は、Shiftキーを押しながらクリックするために、毎回60列目にスクロールすることに飽きるかもしれません。
EDIT@GSergは、この「機能しない」および「スペースと先行ゼロを食べる」とコメントしています。質問へのコメントを引用します。
理由は不明ですが、VBAのすべての列に明示的に形式を指定しても、ファイル拡張子がCSVの場合、Excelはそれを無視します。拡張子を変更するとすぐに、同じコードで正しい結果が得られます。
そのため、上記のコードは "動作"しますが、このばかげたExcelの動作によって強制終了されます。どちらにしても、拡張子を ".csv"以外に変更する必要があります。その後は無料です。
Excel→データ→外部データを取得→すべての列を選択 Shift テキストを選択
逆:すべての値を例外なくテキストとして正しく扱います。
欠点:単純なよりも手順が多いダブルクリック
ダブルクリックまたはExcelのダイアログで開くダイアログ
欠点:Excelの内部CSVハンドラが、テキストではなく式として先頭の-
または=
記号を使用して値を誤って解釈する
欠点:Excelの自動検出列フォーマットにより、0001
のようなバイナリ値から先行ゼロが失われます。
良い方法(VBAの場合)
QueryTables(Get external data
のVBA版)を使用してください。→ コード例
逆:すべての値を例外なくテキストとして正しく扱います。
欠点:OpenText
メソッドよりもわずかに多いコード
悪い方法(VBAの場合)
Workbooks.OpenText
メソッドを使う→ コード例
欠点:この方法では、まだExcelの内部CSVインポートハンドラを使用しています。
欠点:さらに、拡張子がCSVの場合、fieldinfo
の OpenText
パラメーターは無視されます。通常、このパラメータですべての列フォーマットを選択できますが、拡張子がCSVの場合はそうではありません。この動作の詳細については、 Stack Overflow を参照してください。
ソースファイルを完全に制御できる場合は、一時的にソース拡張子をCSVからTXTに変更してからCSVに戻すことが有効な回避策です。
CSVを作成したソースにアクセスできる場合は、CSVの構文を変更できます。
すべての値を二重引用符で囲み、="00001"
のように等号を付けるか、すべての値の前にタブを付けます。どちらの方法でも、Excelは値をテキストとして扱うように強制されます。
2行目(二重引用符)と3行目(タブ)がExcelによって変更されないことに注意してください。
Notepad でCSVを開き、すべての値をExcelにコピーして貼り付けます。次に、データ - テキストから列を使用します。
欠点:列内のテキストを一般形式からテキスト形式に変更すると、矛盾した結果になります。値に文字で囲まれた-
が含まれている場合( "= E1-S1"など)、Excelはその値を複数の列に分割しようとします。そのセルの右にある値は上書きされる可能性があります。
(テキストから列への動作がExcel 2007と2013の間で変更されたため、動作しなくなりました)
これはCSVインポート操作を単純化するためのExcelプラグインです。
主な利点:これはワンクリックのソリューションで、QueryTables
を使用しています。これは背後にある同じ防弾方法です外部データの取得
%appdata%\Microsoft\AddIns
File tab → Options → Add-Ins → Go To
をアクティブにしてImportCSV.xla
を選択します。File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
Add-Insという新しいメニューバーのエントリがあります。このボタンを使用すると、[インポート]ダイアログの手間をかけずにCSVファイルを素早く開くことができます。
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
に注意してください)Shell:sendto
" Enter"%SystemRoot%\ system32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NonInteractive -WindowStyle隠しファイル "C:\ my\folder\myScript.ps1"
これで、(複数の)CSVを選択してRight-click » SendTo » Excel
経由でExcelで開くことができます
最初に.xlsxを開き、次にデータ接続を作成して.csvをインポートすることで試すことができます。 「カンマ」で区切って選択してから、「一般」ではなくすべての列をテキストとして扱うオプションを選択します。
編集:ああ、私は完全に質問を読んでいませんでした。インポートウィザードで、テキストとしてインポートする最初の列ヘッダーを選択し、最後の列ヘッダーまでスクロールして、Shiftキーを押しながらヘッダーをクリックします。次に「テキスト」放射状オプションを選択します。
次のようにすれば、Wetmelonの提案は(.CSVでも)うまくいきます。
私はそれがより多くのステップであることを知っています、しかし少なくともそれは私が拡張子を変更する必要なしでこのようにCSVを開くことを可能にします
気を付けて!
手動の方法を使用する場合 "Excel→データ→外部データを取得→すべての列を選択してテキストを選択" ......
これは、列を「最初の行にデータがある」テキスト(通常はヘッダー行)に設定するだけです。このウィザードでは、データがさらに下にあるが最初の行にはない可能性がある、右側の列は表示されません。例えば:
Row1Col1、Row1Col2、Row1Col3
Row2Col1、Row2Col2、Row2Col3、Row2Col4
インポートウィザードにCol 4が表示されることはないので、インポート前に一般的な形式からテキスト形式に変更することはできません。
これは、Jean-FrançoisCorbettによる上記のコードの代替手順です。
このプロシージャは、テキストとしてフォーマットされたすべての列とともにExcelにcsvファイルをインポートします
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
理由は不明ですが、すべての列に形式を明示的に指定しても、ファイル拡張子がCSVの場合、Excelはそれを無視します。
いくつかのオプション:
Wetmelon 示唆 のように、データをインポートするためのクエリを作成します。
デメリット:64ビットマシンでCSVデータベースドライバが見つからない可能性があります。
Jeanのコード を使用してください。ただし、ファイルを一時フォルダーにコピーし、そのコピーの拡張子を変更してください。
デメリット:元のファイルへのリンクがない(保存するとコピーが上書きされる)。後で手動でコピーを削除する必要があります。それでも、元のCSVに上書き保存することができます。
メモ帳でCSVを開きます。 Ctrl+A、 Ctrl+CExcelに貼り付けて、次にData - Text to Columnsの順に貼り付けると、通常のウィザードで、すべての列を一度にTextに設定できます。それはまたExcelからの貴重な拡張機能を隠すので、それは前のオプションの異なる風味です。
デメリット:手動。
ファイル全体をメモリに読み込み、それをセルごとにシートに書き込む非常に単純なVBAループを作成します。
デメリット:遅く、醜い。
常に同じデータ(定数レコード形式、レイアウトなど)をインポートしている場合は、インポート仕様を使用してAccessマクロを作成してから、そのデータをExcelにダンプすることができます。これは何度もやりました。もう1つの方法は、VBAを使用して一度に1レコードずつワークシートにデータを読み込み、読み込むときにそれを解析することです。私が知っている限りでは、Excelでのインポート中にデフォルトのフォーマットを設定する方法はありません。たとえ可能であれば、解析しようとする次のファイルタイプで問題を引き起こす可能性があります。
リクエストとして、私のコメントを回答として送信する(もう少し情報を追加して)。
Hey Scripting Guyが、 ExcelへのCSVのインポート についてのブログ記事を作成しました。 PowerShell内でデータオブジェクトを操作すると、必要なことを実行できるようになります。
この記事では、数値形式のままにすることができるセルへのデータのインポートについて具体的に説明していますが、ExcelのComObjectプロパティとメソッドを使ってデータをセルに生テキストとして入力することもできますインポート前後のセルのテキストへの書式設定).