Excelスプレッドシートを固定幅のテキストファイルにエクスポートしますか?


24

Excelには、固定幅のテキストファイルをインポートする機能があり、ダイアログを表示して、列のどこにフィールドの開始と終了を配置するかを選択できます。

既存のスプレッドシートがあれば、固定幅のテキストファイルにエクスポートできる機能もありますか?

もしそうなら、どうすればこれにアクセスできますか?[名前を付けて保存]を使用して[テキストファイル]を選択しようとしましたが、タブ区切りでのみ保存されるようです。これは役に立ちません。

それが重要な場合、これはExcel 2003です。

回答:


24

ネイティブのExcel機能から最も近いものは、[ 名前を付けて保存]です。書式付きテキスト(スペース区切り)(* .PRN) 。自動的に幅を決定し、必要に応じてその幅にパディングするスペースを挿入します。

それ以上に、マクロや他のアドインが必要です。


3
わかりやすくするために、列に指定した幅に基づいて「自動的に」幅を決定します。通常、測定値はemsに近似しますが(覚えている限り)、固定幅prnにエクスポートする場合は、prnファイルの列の文字数に使用される整数値を得るために文字通りに切り捨てられます。セル内の配置に応じて、パディング用のスペースが左または右に追加されます(したがって、デフォルトでは、数値を左にパディングして右に強制し、右のテキストは左に強制しますが、配置を変更した場合は異なる)
-AdamV

これは私が探していたものです。ありがとう!
RationalGeek

1
注:書式付きテキスト(.prn)は、Excelで1行あたり240文字に制限されていますsupport.microsoft.com/kb/249885
iokevins

iokevinsが指すマクロを使用するには、CellTextが定義されている2つの場所から "&delimiter"を削除する必要があります。それ以外の場合、各セルに追加のスペースが追加されますが、prnとして保存することはできません。
-farrenthorpe

14

Office Professionalをお持ちの場合は、AccessでExcelファイルを開き、Accessからエクスポートできます。Accessでは、エクスポートされたファイルの固定幅レイアウトを指定でき、それらの幅を指定するための非常にきめ細かい制御が可能になります。


Accessがそれを行うかもしれませんが、Excelは要求されたものです。
AdamV

7
downvoteに感謝しますが、Accessにはこの機能の完全版があることに言及する価値があると思いました。Excelでは、列の幅を直接指定することはできませんが、Accessではできます。はい、Excelでワークシートの列幅をいじることで適切な列幅を取得できますが、それは苦痛であり、固定幅ファイルを定期的に作成する必要がある人にとっては価値がありません。Accessを持っている場合(多くの人がそうしています)、もっと良い方法があります。
davidcl

優れた; この代替手段に感謝:o)
iokevins

5

うわー、私は自分でこの質問をするつもりでしたが、すでに質問されていました。すべてのExcelクリップボード出力はtabデフォルトで区切られています。これは、固定幅のフォントを持っているがタブ区切り文字のサポートが必ずしも必要ではない場合の「実際の」プレーンテキスト出力にとってはやっかいです。

とにかく、現在選択されている領域を単純な固定幅の列ASCIIテーブルとしてコピーする小さなExcelマクロを見つけて変更しました。

187712 201 37 0.18   
2525 580 149 0.25   
136829 137 43 0.31   

これがマクロコードです。これを使用するには、Excel 2007以降を使用している場合は、Excelオプションの[開発]タブ有効にしてください。

Sub CopySelectionToClipboardAsText()

   ' requires a reference to "Windows Forms 2.0 Object Library"
   ' add it via Tools / References; if it does not appear in the list
   ' manually add it as the path C:\Windows\System32\FM20.dll

    Dim r As Long, c As Long
    Dim selectedrows As Integer, selectedcols As Integer

    Dim arr
    arr = ActiveSheet.UsedRange
    selectedrows = UBound(arr, 1)
    selectedcols = UBound(arr, 2)

    Dim temp As Integer
    Dim cellsize As Integer
    cellsize = 0
    For c = 1 To selectedcols
        temp = Len(CStr(Cells(1, c)))
        If temp > cellsize Then
            cellsize = temp
        End If
    Next c
    cellsize = cellsize + 1

    Dim line As String
    Dim output As String

    For r = 1 To selectedrows
        line = Space(selectedcols * cellsize)
        For c = 1 To selectedcols
            Mid(line, c * cellsize - cellsize + 1, cellsize) = Cells(r, c)
        Next c
        output = output + line + Chr(13) + Chr(10)
    Next r

    Dim MyData As MSForms.DataObject
    Set MyData = New DataObject
    MyData.SetText output
    MyData.PutInClipboard

    MsgBox "The current selection was formatted and copied to the clipboard"

End Sub

4

最初に、データをCourier New(またはその他の固定幅フォント)としてフォーマットします。次に.prnとして保存すると、真の固定幅が得られます。


これは私にとってはうまくいきました。これを行う前に、すべてをテキストとしてフォーマットすることも好きです。これにより、保存時にすべてのデータが左揃えになります。
ゲイリーブラントン

2

ジェフ・アトウッドの答えを拡張します。そこにコメントすることはできません。

彼のマクロを変更して、列幅をその列の最も広いセルに設定し、各列に独自の幅を持たせました。彼のマクロは、最初の行で最も幅の広いセルのみを見つけ、すべての列の幅をそれに設定しました。

Sub CopySelectionToClipboardAsText()

   ' requires a reference to "Windows Forms 2.0 Object Library"
   ' add it via Tools / References; if it does not appear in the list
   ' manually add it as the path C:\Windows\System32\FM20.dll

    Dim r As Long, c As Long, linesize As Long
    Dim selectedrows As Integer, selectedcols As Integer

    Dim arr
    arr = ActiveSheet.UsedRange
    selectedrows = UBound(arr, 1)
    selectedcols = UBound(arr, 2)
    ReDim CellSizes(1 To selectedcols, 2) As Integer

    Dim temp As Integer
    Dim cellsize As Integer
    linesize = 0
    For c = 1 To selectedcols
        cellsize = 0
        For r = 1 To selectedrows
            temp = Len(CStr(Cells(r, c)))
            If temp > cellsize Then
                cellsize = temp
            End If
        Next
        CellSizes(c, 0) = cellsize + 1
        CellSizes(c, 1) = linesize
        linesize = linesize + cellsize + 1
    Next c

    Dim line As String
    Dim output As String

    For r = 1 To selectedrows
        line = Space(linesize)
        For c = 1 To selectedcols
            Mid(line, CellSizes(c, 1) + 1, CellSizes(c, 0)) = Cells(r, c)
        Next c
        output = output + line + Chr(13) + Chr(10)
    Next r

    Dim MyData As MSForms.DataObject
    Set MyData = New DataObject
    MyData.SetText output
    MyData.PutInClipboard

    MsgBox "The current selection was formatted and copied to the clipboard"

End Sub

0

これは私にとってキラーです。いくつかのオプションもあります。

http://www.sensefulsolutions.com/2010/10/format-text-as-table.html


このリンクは質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供する方が良いでしょう。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
ラムハウンド

2
@Ramhound-一般的に、私は同意します。しかし、この場合、ここにコピーできるものはありません。そのWebサイトは、入力データを貼り付けて「Excel形式の」出力を取得する場所です。リンクが無効になると、サービスはなくなります。
sancho.sモニカーの復活

:サービスは、移動したsenseful.github.io/web-tools/text-table、ソースが入手可能です:github.com/senseful/web-tools
NGM

再び移動しました:senseful.github.io/text-table
Chris

0

すぐにアクセスできるAccess:https : //support.office.com/en-ie/article/export-data-to-a-text-file-f72dfc38-a8a0-4c5b-8c2c-bf2950814140#bmsteps with this Excelを使用するよりもはるかに簡単かつ迅速に管理できました。私の場合、それはテーブルの変換でした。


間違った質問に答えを投稿したように見えます;-)この質問はExcelについて尋ねていますが、あなたの答えはAccessについて語っています。また、今後の回答のために:参照用のリンクを提供すると便利ですが、重要な情報も投稿に含める必要があります。
robinCTS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.