- ベストアンサー
エクセルVBAでテキストファイルにして保存する方法
エクセル「Sheet2」のA列、C列、D列にそれぞれ100個の文字列が入力されています。 B列は空欄になっています。 (作業内容) C列とD列のデータを結合して、B列に入力 A1~B100のデータを1つのテキストファイルとして保存する。 ファイル名はその都度指定する。 よろしくお願い申し上げます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
回答No.1、追記です。 書き忘れたことが2点ありました。 > C列とD列のデータを結合して、B列に入力 ●「C列とD列のデータ」を連結する際に、 セル内区切り文字が必要な場合は、 Const DLMinCELL = "-" ' 区切り文字 "-" の場合 Const DLMinCELL = vbLf ' 区切り文字 セル内改行 の場合 等の様に指定を書き直してください。 現状は、 Const DLMinCELL = "" ' 区切り文字 なし の場合 セル内区切り文字が必要ない場合、になっています。 [名前を付けて保存] ダイアログにてオペレーターが、 [キャンセル]を選択した場合の処理、を添えておくのが一般的なのですが、 うっかり忘れてしまっていましたので、書き加えて再掲載しておきます。 [名前を付けて保存] ダイアログで、 不適切なファイル名(使うことの許されていない文字とか)を指定される 可能性もありますが、これについてのエラートラップは省略します。 また、既存のファイル名を指定してしまった場合には、 上書きすることになりますが、 そういう仕様を求めているので構わない、とか、 これを回避する必要がある、とか、 詳しく示されていない点については現時点で対策しようがありませんので 留意しておいてください。 以下、回答No.1のコードに1行加筆したものですが、差換えてください。 ' ' /// specA.ver0.01 [名前を付けて保存] ダイアログ / タブ区切りテキスト出力 Sub ReW9070410A() Const DLMinCELL = "" ' 「C列とD列のデータを結合」する場合セル内に区切り文字が必要なら要指定 With Sheets("Sheet2") ' ' 「C列とD列のデータを結合して、B列に入力」 .Range("B1:B100").Value = .Evaluate("C1:C100&""" & DLMinCELL & """&D1:D100") ' .Columns("B").AutoFit ' B列の列幅を調整(オプション)必要なら、、、 .Range("A1:B100").Copy ' 「A1~B100のデータを」コピー End With Dim sBuf As String With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' New DataObject ' ' 「A1~B100のデータを1つのテキスト」としてDataObjectに取得 .GetFromClipboard ' ' 「A1~B100のデータを1つのテキスト」としてDataObjectから文字列変数に取得 sBuf = .GetText End With Application.CutCopyMode = 0 ' コピーモードを解除 ' ' (オプション)★ダイアログ初期表示のフォルダを指定する場合(既存のフォルダ) ' Dim sFdr As String ' ★ ' sFdr = CurDir ' ★ 現在の(元の)フォルダパスを確保 ' ChDir "D:\Work" ' ★ フォルダの変更 初期表示のフォルダを指定 ' ' 「ファイル名はその都度指定する。」→ユーザーがファイル名を指定する目的で、[名前を付けて保存] ダイアログ ボックスを表示。 Dim sFile sFile = Application.GetSaveAsFilename( _ InitialFileName:="*.txt", _ FileFilter:="テキスト (タブ区切り) (*.txt), *.txt") If VarType(sFile) = vbBoolean Then MsgBox "キャンセル": Exit Sub ' ver0.01 追加 [名前を付けて保存] [キャンセル] Dim nFree As Integer nFree = FreeFile ' 空きナンバー取得 Open sFile For Output As #nFree ' 開く Print #nFree, sBuf ' テキスト出力 Close #nFree ' 閉じる ' ChDir sFdr ' ★ 元に戻す End Sub
その他の回答 (1)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 お求めの仕様に関する確認が必要な点もありますが、 とりあえずの一例でお応えします。 > C列とD列のデータを結合して、B列に入力 ●「C列とD列」がどちらも文字列値である等、 セルの'値'と'表示文字列'が同値である、というケースでお応えします。 ●「B列」に得られる結果は、幾つかある'目的"の内のひとつであって、 便宜的な'手段'ではない、という解釈でお応えします。 (テキスト出力だけが目的なら、この処理は必ずしも要らない、という意味です) > A1~B100のデータを1つのテキストファイルとして保存する。 ●スプレッドシートのデータをテキスト保存するには、 列を表す'区切り文字'が必要ですが、今回は仮に、 標準的な'タブ区切り'という設定でお応えします。 > ファイル名はその都度指定する。 ●指定の方法は、'ユーザー操作'に依るものなのか、 'プログラムで取得'した値に依るものなのか、 とりあえず、仮に、[名前を付けて保存] ダイアログで オペレーターが直接書き込んで指定できるような仕様でお応えします。 そちらでの実際の必要に合わせて自由に書き換えることが 容易な内容にすることを意図して書いてみました。 もし、応用が難しかったり、不足があった場合には、補足欄にでも書いてみて下さい。 もし、期待しているものと違うようでしたら、上述の解釈に幅がある要件について、 お求めの仕様を詳らかにしてください。 必要があれば、再度レスします。 ' ' /// specA. [名前を付けて保存] ダイアログ / タブ区切りテキスト出力 Sub ReW9070410A() Const DLMinCELL = "" ' 「C列とD列のデータを結合」する場合セル内に区切り文字が必要なら要指定 With Sheets("Sheet2") ' ' 「C列とD列のデータを結合して、B列に入力」 .Range("B1:B100").Value = .Evaluate("C1:C100&""" & DLMinCELL & """&D1:D100") ' .Columns("B").AutoFit ' B列の列幅を調整(オプション)必要なら、、、 .Range("A1:B100").Copy ' 「A1~B100のデータを」コピー End With Dim sBuf As String With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' New DataObject ' ' 「A1~B100のデータを1つのテキスト」としてDataObjectに取得 .GetFromClipboard ' ' 「A1~B100のデータを1つのテキスト」としてDataObjectから文字列変数に取得 sBuf = .GetText End With Application.CutCopyMode = 0 ' コピーモードを解除 ' ' (オプション)★ダイアログ初期表示のフォルダを指定する場合(既存のフォルダ) ' Dim sFdr As String ' ★ ' sFdr = CurDir ' ★ 現在の(元の)フォルダパスを確保 ' ChDir "D:\Work" ' ★ フォルダの変更 初期表示のフォルダを指定 ' ' 「ファイル名はその都度指定する。」→ユーザーがファイル名を指定する目的で、[名前を付けて保存] ダイアログ ボックスを表示。 Dim sFile sFile = Application.GetSaveAsFilename( _ InitialFileName:="*.txt", _ FileFilter:="テキスト (タブ区切り) (*.txt), *.txt") Dim nFree As Integer nFree = FreeFile ' 空きナンバー取得 Open sFile For Output As #nFree ' 開く Print #nFree, sBuf ' テキスト出力 Close #nFree ' 閉じる ' ChDir sFdr ' ★ 元に戻す End Sub
お礼
早々にご回答いただきましてありがとうございます。
お礼
早速試用させていただきました。 申し分なく動作しております。 当方の足りない説明であったにも関わらず、 いろいろなケースまで想定していただいて、 大変お手数お掛けいたしました。 区切り文字の挿入、列幅の調整、フォルダの指定など、 大変感謝いたしております。 ありがとうございました。