web-dev-qa-db-ja.com

CSVファイルのすべての列を常にテキストとしてインポートするようにExcelを設定する方法を教えてください。

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

インターネット上のこのよくある質問に対するすべての回答は、ファイルが開いたらフォーマットされた数字を変換する方法のいずれかを示唆しています(これは私にとってはうまくいきません。一般的な問題を解決したいのです。あるいは、各列のフォーマットタイプを手動で選択して(私はしたくない)、開いているすべてのCSVファイルのすべての列が常にテキストとしてフォーマットされるように、グローバル設定またはスタイルを設定する方法を探しています。私は数字を引用符で囲むことについても知っていますが、私が手に入れたファイルはそのようにはならず、ファイルを前処理してExcelがそれらを台無しにしないようにしたいと思いました。

特に thisを行う方法はありますか:インポート中に毎回手動で各列を選択せず​​に、常に開いているCSVファイル内のすべての列をテキストとしてフォーマットしますか?

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

66
William Gunn

これは動作します:

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でCSVを開く方法

良い方法

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

    逆:すべての値を例外なくテキストとして正しく扱います。

    欠点:単純なよりも手順が多いダブルクリック

間違った方法

  • ダブルクリックまたはExcelのダイアログで開くダイアログ

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

    欠点:Excelの自動検出列フォーマットにより、0001のようなバイナリ値から先行ゼロが失われます。

良い方法(VBAの場合)

  • QueryTables(Get external dataのVBA版)を使用してください。→ コード例

    逆:すべての値を例外なくテキストとして正しく扱います。

    欠点:OpenTextメソッドよりもわずかに多いコード

悪い方法(VBAの場合)

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

    欠点:この方法では、まだExcelの内部CSVインポートハンドラを使用しています。

    欠点:さらに、拡張子がCSVの場合、fieldinfoOpenText パラメーターは無視されます。通常、このパラメータですべての列フォーマットを選択できますが、拡張子がCSVの場合はそうではありません。この動作の詳細については、 Stack Overflow を参照してください。

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

追加の方法

  • CSVを作成したソースにアクセスできる場合は、CSVの構文を変更できます。
    すべての値を二重引用符で囲み、="00001"のように等号を付けるか、すべての値の前にタブを付けます。どちらの方法でも、Excelは値をテキストとして扱うように強制されます。

    オリジナルのCSVコンテンツ
    enter image description here

    ExcelでCSVをダブルクリックで開くと
    enter image description here

    2行目(二重引用符)と3行目(タブ)がExcelによって変更されないことに注意してください。

  • Notepad でCSVを開き、すべての値をExcelにコピーして貼り付けます。次に、データ - テキストから列を使用します。
    欠点:列内のテキストを一般形式からテキスト形式に変更すると、矛盾した結果になります。値に文字で囲まれた-が含まれている場合( "= E1-S1"など)、Excelはその値を複数の列に分割しようとします。そのセルの右にある値は上書きされる可能性があります。

    テキストから列への動作がExcel 2007と2013の間で変更されたため、動作しなくなりました)


CSVを開いてテキストとしてすべての値をインポートするExcelアドイン

これはCSVインポート操作を単純化するためのExcelプラグインです。
主な利点:これはワンクリックのソリューションで、QueryTablesを使用しています。これは背後にある同じ防弾方法です外部データの取得

  • それはあなたがCSVとTXTファイルをインポートすることを可能にするExcelに新しいメニューコマンドを追加します。現在選択されているセルからすべての値がアクティブシートにインポートされます。
  • Excelアドインは、WindowsおよびMac上のすべてのOfficeバージョンで利用できます。
  • アドイン全体には35行のコードしかありません。あなたが興味を持っているならコメント--- source code をチェックしてください
  • 使用されているCSVリストの区切り文字(コンマまたはセミコロン)は、ローカルのExcel設定から取得されます。
  • エンコードはUTF-8に設定されています

Installation

  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を再起動

Add-Insという新しいメニューバーのエントリがあります。このボタンを使用すると、[インポート]ダイアログの手間をかけずにCSVファイルを素早く開くことができます。

enter image description here


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に注意してください)
    • 経由であなたのsendtoフォルダを開く WinR "Shell:sendtoEnter
  2. 右クリック→新規→ショートカットから新しいショートカットを作成し、この行を貼り付けます。スクリプトを配置した場所にパスを変更することを忘れないでください。ショートカットに名前を付けます。たとえば、Excel

"%SystemRoot%\ system32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NonInteractive -WindowStyle隠しファイル "C:\ my\folder\myScript.ps1"

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

69
nixda

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

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

5
Wetmelon

次のようにすれば、Wetmelonの提案は(.CSVでも)うまくいきます。

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

私はそれがより多くのステップであることを知っています、しかし少なくともそれは私が拡張子を変更する必要なしでこのようにCSVを開くことを可能にします

4
Colorado Techie

気を付けて!

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

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

Row1Col1、Row1Col2、Row1Col3

Row2Col1、Row2Col2、Row2Col3、Row2Col4

インポートウィザードにCol 4が表示されることはないので、インポート前に一般的な形式からテキスト形式に変更することはできません。

2
PeterV

これは、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
1
shivraj

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

いくつかのオプション:

  • Wetmelon 示唆 のように、データをインポートするためのクエリを作成します。
    デメリット:64ビットマシンでCSVデータベースドライバが見つからない可能性があります。

  • Jeanのコード を使用してください。ただし、ファイルを一時フォルダーにコピーし、そのコピーの拡張子を変更してください。
    デメリット:元のファイルへのリンクがない(保存するとコピーが上書きされる)。後で手動でコピーを削除する必要があります。それでも、元のCSVに上書き保存することができます。

  • メモ帳でCSVを開きます。 Ctrl+A、 Ctrl+CExcelに貼り付けて、次にData - Text to Columnsの順に貼り付けると、通常のウィザードで、すべての列を一度にTextに設定できます。それはまたExcelからの貴重な拡張機能を隠すので、それは前のオプションの異なる風味です。
    デメリット:手動。

  • ファイル全体をメモリに読み込み、それをセルごとにシートに書き込む非常に単純なVBAループを作成します。
    デメリット:遅く、醜い。

0
GSerg

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

0
user88859

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

Hey Scripting Guyが、 ExcelへのCSVのインポート についてのブログ記事を作成しました。 PowerShell内でデータオブジェクトを操作すると、必要なことを実行できるようになります。

この記事では、数値形式のままにすることができるセルへのデータのインポートについて具体的に説明していますが、ExcelのComObjectプロパティとメソッドを使ってデータをセルに生テキストとして入力することもできますインポート前後のセルのテキストへの書式設定).

0
Matrix Mole