CSVファイルのすべての列を常にテキストとしてインポートするようにExcelを設定するにはどうすればよいですか?


68

私はそれを避けようとしますが、ときどきExcelでCSVファイルを開く必要があります。実行すると、数値を含む列がフォーマットされるため、目的には使用できなくなります。私の知る限り、インポート時にこれを防ぐ唯一の方法は、拡張子が.csvにならないようにファイル名を変更し、インポートウィザードを使用して各列の形式を個別に指定することです。50〜60列のファイルの場合、これは実用的ではありません。

インターネット上のこのよくある質問に対するすべての回答は、ファイルが開いたらフォーマットされた数値を元に戻す何らかの手段を示唆しているため(これは私にはうまくいきません-特定のケースではなく、一般的な問題を解決したいです)または各列のフォーマットタイプを手動で選択する(これはしたくない)、開いているすべてのCSVファイルのすべての列が常にテキストとしてフォーマットされるようにグローバルな設定またはスタイルを設定する方法を探しています。引用符で数字を「装甲」することも知っていますが、取得するファイルはそうではなく、Excelがそれらを台無しにしないようにファイルを前処理する必要を避けたいと思っていました。

具体的にこれを行う方法はありますか?インポート中に毎回手動で各列を選択することなく、開いているCSVファイルのすべての列を常にテキストとしてフォーマットしますか?

私はExcel 2003を使用していますが、それがあなたの知っていることなら、2007年の答えを取ります。


1
Hey Scripting Guyは、CSVをExcelにインポートするブログ記事を作成しました。powershell内でデータオブジェクトを操作すると、目的の操作ができる場合があります。それは本質的に単なるオフサイトリンクであるため、回答として投稿されていませんが、あなたにとって何か役に立つかもしれません。
マトリックスモール

回答:


7

これは動作します:

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」以外に変更する必要があります。申し訳ありません!その後、無料で家に帰ります。


1
動作しません。スペースを食べる、先行ゼロを食べるなど
GSerg


1
使用された方法にWorkbooks.OpenTextは、設計上の欠陥があります(以下の回答を参照)。QueryTables代わりに使用してください。
-nixda

71

ExcelでCSVを開く方法

良い方法

  • Excel→データ→外部データを取得→すべての列をShift選択し、テキストを選択

    利点:すべての値を例外なくテキストとして正しく処理します

    欠点:単純なダブルクリックよりも多くのステップ

間違った方法

  • ダブルクリックで CSVを開くか、Excelのダイアログで 開く

    欠点:Excelの内部CSVハンドラーは、値をテキストではなく式として先頭-または=記号で誤って解釈します

    欠点:0001Excelの自動検出列形式などにより、バイナリ値から先行ゼロが失われます

良い方法(VBAの場合)

  • QueryTables(に対応するVBA Get external data)を使用→ サンプルコード

    利点:すべての値を例外なくテキストとして正しく処理します

    欠点:OpenTextメソッドより少しコードが多い

悪い方法(VBAの場合)

  • Workbooks.OpenTextメソッドを使用→ コード例

    欠点:このメソッドは、Excelの内部CSVインポートハンドラーをすべての欠陥とともに使用しています

    欠点:さらに、拡張子がCSVの場合、fieldinfoパラメータOpenTextは無視されます。通常、このパラメーターを使用すると、すべての列形式を選択できますが、拡張子がCSVの場合はできません。この動作の詳細については、Stack Overflowをご覧ください。

    ソースファイルを完全に制御できる場合は、ソース拡張子をCSVからTXTに一時的に変更してからCSVに戻すことは有効な回避策です。

追加の方法

  • CSVを作成するソースにアクセスできる場合は、CSV構文を変更できます。
    すべての値を二重引用符で囲み、等号の前に接頭辞を付ける="00001"か、すべての値の先頭にタブを追加します。どちらの方法でも、Excelは値をテキストとして処理します

    元のCSVコンテンツ
    ここに画像の説明を入力してください

    ダブルクリックで開いたときのExcelでのCSV
    ここに画像の説明を入力してください

    行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に設定されます

設置

  1. アドインをダウンロードして、アドインフォルダーに保存します。%appdata%\Microsoft\AddIns
  2. Excelを開き、アドインをアクティブにし、File tab → Options → Add-Ins → Go To選択しますImportCSV.xla
  3. VBAマクロを有効にします。 File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Excelを再起動する

アドインと呼ばれる新しいメニューバーエントリがあり、このボタンを使用して、インポートダイアログの手間をかけずにCSVファイルをすばやく開くことができます。

ここに画像の説明を入力してください


WindowsエクスプローラーからCSVを直接開くPowerShellスクリプト

PowerShellスクリプトを使用してCSVファイルを開き、それらを自動的にExcelに渡すことができます。スクリプトは、値を常にテキストとして扱い、ボーナスとしてUTF-8エンコードを処理するExcelのテキストインポートメソッドをサイレントに使用します

  1. 新しいテキストファイルを作成し、以下のスクリプトを貼り付けます。コメント付きのバージョンはこちらにあります
$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()
    }
}
  1. のような場所に保存しますC:\my\folder\myScript.ps1。(拡張子に注意してください.ps1
    • WinR» shell:sendto»で sendtoフォルダーを開きますEnter
  2. 右クリック»新規»ショートカットで新しいショートカットを作成し、この行を貼り付けます。スクリプトを配置した独自のパスに変更することを忘れないでください。ショートカットに名前を付けます(例:Excel)

「%SystemRoot%\ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe」-NoProfile -NonInteractive -WindowStyle Hidden -File 「C:\ my \ folder \ myScript.ps1」

これで、(複数の)CSVを選択し、Excelで開くことができます Right-click » SendTo » Excel


1
アドインは、Office 2003および2013でテストされました
nixda

一番上の「最良の方法」は、1回限りのインポートに必要なものです。VBAをいじる必要はなく、日付/数値として使用される列を制御することもできます(残りはテキストとして使用されます)。CSVをダブルクリックすると、Excelがこのインポートウィザードを開くことを提案します。
ADTC

@Vadzimこんにちは、リンク切れを修正するための努力に感謝します。実際、ge.ttはここ数か月でいくつかの問題を起こします。しかし、私はすべての問題を修正し、古い元のリンクが再び機能するはずだと思います。Google Chromeがge.ttから何かをダウンロードする前に警告する理由はわかりません。しかし、他のすべてのブラウザは正常に動作し、それらがマルウェアではないことを保証できます
-nixda

@nixda、リンクを復活させ、素晴らしい答えを
ありがとう-Vadzim

@nixda ge.ttへのリンクが再び壊れています。ほとんどは、所有者がTOSに違反したため利用できないと言っています。ただし、OpenCSV.exe用のファイルには、「これらのファイルは利用規約に違反しているため、使用できなくなりました」と書かれています。ImportMyCSV Excel関数の作成者ですか?(ソースコードはまだペーストビンで利用可能です)これは素晴らしいツールです-私は仕事でそれを使用し、他の人にそれを推奨しています。しかし、私はコードの起源に興味があります。
グレンフロムアイオワ

5

最初に.xlsxを開いてから、データ接続を作成して.csvをインポートしてみてください。「カンマ」区切りを選択してから、「一般」ではなくすべての列をテキストとして扱うオプションを選択します。

編集:ああ、私は完全に質問を読んでいませんでした。インポートウィザードで、テキストとしてインポートする最初の列ヘッダーを選択し、最後の列ヘッダーまでスクロールして、Shiftキーを押しながらヘッダーをクリックします。次に、「テキスト」放射状オプションを選択します。


2
ええ、これはうまく機能します-ファイルの拡張子が「.csv」でない限り。+1
ジャン=フランソワコルベット

4

以下を行うと、Wetmelonの提案は(.CSVでも)動作します。

  1. 空のワークブックまたはワークシートでExcelを開く
  2. クリックしてデータ> [外部データを取得]テキストから
  3. Wetmelonの説明に従って「テキストインポートウィザード」を使用します(カンマ区切り、最初の列を選択し、最後の列をShift +クリックし、すべてをテキストに設定します)。

それはより多くのステップであることを知っていますが、少なくとも拡張子を変更せずにこの方法でCSVを開くことができます


2

気を付けて!

手動の方法「Excel→データ→外部データの取得→すべての列を選択して、テキストを選択」を使用する場合......

これは、「最初の行にデータがある」テキスト(通常はヘッダー行)にのみ列を設定します。このウィザードでは、最初の行ではなく、さらに下にデータがある可能性のある列が右側に表示されません。例えば:

Row1Col1、Row1Col2、Row1Col3

Row2Col1、Row2Col2、Row2Col3、Row2Col4

インポートウィザードにCol 4は表示されないため、インポートする前に一般形式からテキスト形式に変更するオプションは表示されません!!!!


1
良い警告です。99.9999%の確率で、人々はインポートウィザードを下にスクロールせず、それでもすべての列をキャッチするのは困難です。ただし、技術的には、インポートウィザードを使用しているときに下にスクロールして、最初の行にデータがない追加の列をキャッチできます。
-GlennFromIowa

1

以下は、Jean-FrançoisCorbettが上記で投稿したコードの代替手順です。

この手順では、すべての列をテキストとしてフォーマットして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

SuperUserへようこそ。新しい回答を追加する代わりに、Corbettの回答を編集して改善する必要があります。あなたはまだそれをするのに十分な評判を持っていないことを理解していますが、コメントであなたの変更をリンクして、彼にそれを読むように頼むことができます。
VlastimilOvčáčík15年

0

常に同じデータ(定数レコード形式、レイアウトなど)をインポートする場合は、インポート仕様を使用してAccessマクロを記述し、データをExcelにダンプして戻すことができます。これは何度も行われます。私がそれを行ったもう1つの方法は、VBAを使用して、一度に1レコードずつワークシートにデータを読み取り、読み取ったデータを解析することです。私の知る限り、Excelでのインポート中にデフォルトの形式を設定する方法はなく、たとえそれが解析しようとする次のファイルタイプで問題を引き起こす可能性があるとしてもです。


1
ここに問題があります-インポートするときに、コンマの間にあるテキスト文字列を列に入れることを除いて、解析をしようとはしていません。特定の方法でフォーマットする必要がある場合は、それを行うことができます(日付文字列を日付にするなど)が、最初はデータをそのままにしておく必要があります。なぜそんなに難しいのでしょうか?
ウィリアムガン

0

リクエストとして、回答として私のコメントを送信します(もう少し情報を追加します):

Hey Scripting Guyは、CSVをExcelにインポートするブログ記事を作成しました。powershell内でデータオブジェクトを操作すると、目的の操作ができる場合があります。

記事では、数値形式を残す可能性のあるセルへのデータのインポートについて具体的に説明していますが、Excel ComObjectの一部のプロパティとメソッドを操作して、代わりに生のテキストとしてセルにデータを入力することもできます(またはforceインポートの前または後にセルをテキストにフォーマットする)。


0

理由は不明ですが、すべての列の形式を明示的に指定しても、ファイル拡張子がCSVの場合、Excelはそれを無視します。

いくつかのオプション:

  • Wetmelonが提案するように、データをインポートするクエリを作成します。
    欠点:64ビットマシンでCSVデータベースドライバーが欠落している可能性があります。

  • Jeanのコードを使用しますが、ファイルを一時フォルダーにコピーし、コピーの拡張子を変更します。
    欠点:元のファイルへのリンクがありません(保存するとコピーが上書きされます)。その後、コピーを手動で削除する必要があります。それでも、元のCSVに手動で名前を付けて保存できます。

  • メモ帳でCSVを開いて、Ctrl+ACtrl+C、データ、その後、Excelに貼り付ける- 、それはあなたが一度にテキストにすべての列を設定することができ、通常、ウィザードの列へのテキストです。これは、貴重な拡張機能をExcelから隠すため、前のオプションとは異なります。
    欠点:手動。

  • ファイル全体をメモリに読み取り、セルごとにシートに配置する非常に単純なVBAループを使用します。
    欠点:遅く、ugい。


「元の[CSV]ファイルへのリンクなし」は、これらすべての方法の欠点ではありませんか?一時フォルダにコピーし、そこで拡張子を変更するというアイデアが好きです...コピーが開いたらすぐに元のファイルを(CSVとして)上書きすることさえできます。
ジャンフランソワコルベット

@Jean-FrançoisCorbett、インポートウィザードを常に使用して、csvの拡張子を持つ .csvファイル Excel 2010にインポートします。列の形式をテキストとして明示的に指定し、セル形式をテキストとして保持します。おそらくこれは古いバージョンのExcelの問題でしたか?
グレンフロムアイオワ

-2

質問を正しく理解していれば、ここで説明されているように、Paste-SpecialのTransposeオプションを使用して簡単に解決できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.