• ベストアンサー

エクセルVBAでテキストファイルにして保存する方法

エクセル「Sheet2」のA列、C列、D列にそれぞれ100個の文字列が入力されています。 B列は空欄になっています。 (作業内容) C列とD列のデータを結合して、B列に入力 A1~B100のデータを1つのテキストファイルとして保存する。 ファイル名はその都度指定する。 よろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

value100100
質問者

お礼

早速試用させていただきました。 申し分なく動作しております。 当方の足りない説明であったにも関わらず、 いろいろなケースまで想定していただいて、 大変お手数お掛けいたしました。 区切り文字の挿入、列幅の調整、フォルダの指定など、 大変感謝いたしております。 ありがとうございました。

その他の回答 (1)

回答No.1

こんにちは。 お求めの仕様に関する確認が必要な点もありますが、 とりあえずの一例でお応えします。 > 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

value100100
質問者

お礼

早々にご回答いただきましてありがとうございます。

関連するQ&A

  • Excel VBAで列ごとのデータをテキストファイルへ書くには?

    エクセルのシート(たとえばSheet1)が以下のようになっているとします。 A B C D E F 1 商品A 11111111 あいうえお 3 1000 2 商品B 22222222 かくくけこ 1 2500 3 商品C 33333333 さしすせそ 2 3500 ・ ・ これを決まった列ごとにテキストファイル(固定ファイル名)に書き出すということは、エクセルのVBAで可能でしょうか? テキストファイルの内容は以下のようにしたいのです。 E列を数量として、その分だけのテキスト行を書き出したいのですが… <<bbb.txt>> 商品A 商品A 商品A 商品B 商品C 商品C ・ ・ <<ccc.txt>> 11111111 11111111 11111111 22222222 33333333 33333333 ・ ・ <<fff.txt>> 1000 1000 1000 2500 3500 3500 ・ ・ また、このようなことが参考になるHPがあればお教え願いたいのですが。 以上よろしくお願いします。

  • VBA,二つのExcelのsheetにデータ保存

    VBA初心者です。 皆様のお力をお貸し頂きたく質問させて頂きます。よろしくお願いいたします。 質問内容は、下記になります。 Excelのsheet1には、縦列A,B,C・・・とデータが入っております。 sheet1の例 A B C sheet2は、入力するsheetです。 今回はA列の3行目からとします。 問題は、sheet1の縦の列をA,B,C,Dとすればデータの更新は、出来るのですが sheet1のデータのA,B,C一つ飛んでEまた一つ飛んでGという感じでsheet1のデータを 飛ばしてsheet2に表示、更新(保存)をしたいと思います。 ですので、sheet2のA列の3行目からA,B,C,飛んでE飛んでGとsheet1からデータを 表示させ、さらにsheet2の入力値が変更されると、sheet1のデータが入っている A,B,C,E,Gに更新される仕様です。 sheet1(データが入っています) A , B , C , E , G , 値1 , 値2 , 値3   , 値4 , 値5 sheet2(入力する、入力したデータは、sheet1へ更新される) A列 3行目 、sheet1の値1(A列)が入ります。 4行目 、sheet1の値2(B列)が入ります。 5行目 、sheet1の値3(C列)が入ります。 6行目 、sheet1の値4(E列)が入ります。 7行目 、sheet1の値5(G列)が入ります。 以上です。申し訳ございませんが、ご教授よろしくお願いいたします。

  • Excelで複数のテキストファイルを1枚のシートに

    Excelで複数のテキストファイルを1枚のシートに追加したいのですが可能でしょうか? VBAや別ソフトを複数使ってもかまいません。 2列のテキストファイルが複数ありA列目は共通でB列目がそれぞれ異なります。 data01.txt、data02.txt…と50ぐらいのファイルがあり、それぞれ A  B 10 1.24 20 2.56 30 2.46 :  : となっています。これをひとまとめにして A      B     C ・・・ data01  data02   data03・・・ data50 10     1.24    1.35 ・・・ 2.24 20     2.56    2.22 ・・・ 1.34 30     2.46    3.23 ・・・ 5.45 :       :      : といった表にしたいのです。 お願いします。

  • テキストデータを開いて指定したエクセルシートに貼り付ける方法

    質問です。テキスト形式で保存したデータが約500あります。 以後 ・テキストデータをテキスト1~テキスト500と呼びます ・貼り付けたいエクセルシートをシートと呼びます 1.まずテキスト1をエクセルで開きます 2.そしてエクセルで開いた、例えばB12~B18までのデータを   シートのA1~A7に貼り付けます 3.次にテキスト2をエクセルで開き、今度はB12~B18までのデータを   シートのB1~B7に貼り付けます 4.この作業を続けてテキストデータ500個を1つのエクセルシートに  順々に貼り付けていくにはどうすればいいでしょうか? 上記の操作において、エクセルで開いたテキストデータから抽出するデータの位置(アドレス?)はすべて同じです。上記の場合はB12~B18です。問題はエクセルシートに、テキストデータ1はA列に、2はB列に、3はC列にという様に貼り付けていく方法が知りたいです。 一つ一つやっているのですが、気が遠くなります。何かいい方法があればよろしくお願いします。

  • EXCELのデータベース利用について(VBA)

    VBA初心者の者です。 下記の様なEXCELファイルを作りたいのですが、どのようにすれば良いのか まったくわかりません。 ACCESSでの構築が簡単なのかもしれませんが、データ量がそれほど多くないことと 職場にACCESSがないため、可能であればEXCELで構築したいと考えています。 私自身、プログラムの知識がなく、EXCEL VBAのサイトを確認するのですが、いまいち どうすれば良いのかわかりません。 ぜひご教授の程よろしくお願いします。 3つのシートの構成は以下になります。 【入力シート】 A1セルに文字列(A~Z)入力欄 【○○データシート】 A列に A~Z の文字列 B列に 001~100までの数値 C列に 001~100までの数値 D列に 001~100までの数値 E列に 001~100までの数値 例)    A列   B列   C列   D列   E列 1   A   001 2   B   001    002    003   004 3   C   003 4   D   002    003 【▽コマンドシート】 A列に 001~100までの一意の数字 B列に 文字列(コマンド) C列に 文字列(コマンド詳細) 例)    A列    B列    C列 1   001   xx     blank 2   002   xxx△   xxx 3   003   xxxx    x○ 4   004   xxxxx   xxx 【欲しいVBA】 1、入力シートのA1セルに○○データシートのA列に該当するA~Zの 文字列を入力。 2、○○データシートのB列~F列までの数値を参照 3、2の数値において▽コマンドシートのA列に記載ある番号と紐づけを行い、 ▽コマンドシートのB列、C列に記載がある文字列を入力シートのB列、C列にコピー ※コピー時は▽コマンドシートの書式や体裁情報も含めてコピー。 例としては以下になります。 入力シートの A1セルにDを入力した場合は 入力シート    A列    B列    C列 1   D    xxx△  xxx 2        xxxx    x○ 3 以上、ご教授よろしくお願いします。

  • エクセルVBA テキストに出力、名前を付けて保存

    エクセルVBA テキストに出力、名前を付けて保存    A  B   C   D 1  aa  bb  cc  =A1&B1&C1 2  dd  ee  ff  =A2&B2&C2 3  gg  hh  ii  =A3&B3&C3 上記エクセルのD列の内容(セルA1~C3が連続したもの)を1行毎にテキストに出力し、 B列の内容をファイル名にしてテキストファイルを多量に自動生成したいのです。 上記エクセルのように3行なら下記の3つのファイルが生成されるといったVBAがほしいのです。 ファイル名がbb.txtで、テキストの内容はaabbcc。 ファイル名がee.txtで、テキストの内容はddeeff。 ファイル名がhh.txtで、テキストの内容はgghhii。 実際は数千行あるので、数千ファイルを一気に生成させたいのです。 どうぞよろしくお願いいたします。

  • excel vba データリストからの抽出

    excel vbaで、以下のような事をしたいと思っています。 【sheet1】データ   A  B C D E  1 あ い う え お 2 か き く け こ 3 あ き く せ そ 4 さ  し す せ そ 5 あ し す け こ 【sheet2】検索 A1を検索条件セルにする ※検索キーはsheet1のA列に登場するテキストのみです。   A  B  C  D  E 1 あ い う え お 2   き く せ そ 3    し す け こ 4 5 ※A2、A3に"あ"と表示されてしまってもよいのですが、  出来れば表示なしが望ましいです。 sheet2のA1は、sheet3に、sheet1のA列に登場したテキストをデータとしてリストしておき、 「データの入力規則」でリストから選択できるようにしようと考えています。 説明が下手でうまく伝わらないかも知れませんが、うまいやり方があれば どうかご教示下さい。 宜しくお願い致します。

  • Excel VBAでのプログラム作成方法

    次のようなことができるプログラムをVBAで作りたいと考えています.概略どのような考え方で作ったらいいか初心者向きに教えてください. ・Excelのシート上にA1~A100,B1~B100,C1~C100までの表を用意し,A,Bにはいずれも予めデータ(文字列)が入っています.Cは空欄です. ・フォーム上にボタンBT1,BT2,BT3を設けます. ・フォーム上にテキストボックスC,D,Eを設けます. 操作は,最初は,表の先頭のデータA1,B1,C1をテキストボックスC,D,Eにそれぞれ表示します.表示された内容に従って,BT1,BT2,BT3のいずれか一つのボタンを押す.どのボタンを押したかの記号をC1の欄に書き込みます.ボタンを押した時点で,次のデータA2,B2,C2が表示されます.これを繰り返し,データが100になった時点で,最初に戻ります. このような機能をもつプログラムを作りたいのですが,どのような作り方をすればいいでしょうか.

  • エクセルのオートフィルで教えてください

    sheet1のA列、B列、C列にデータが入っています。 Sheet2の表に参照でデータを入れたいと思っています。 Sheet2のB2に=Sheet1!A3 B3に=Sheet1!B3 B4に=Sheet1!C3 B5~B7は空欄にして B8に=Sheet1!A4 B9に=Sheet1!B4 B10に=Sheet1!C4 と連続して入力していきたいです。 B2~B7を選択してオートフィルを使ってみたのですが B8,B9,B10には、=Sheet1!A9、=Sheet1!B9、=Sheet1!C9が入ってしまいます。 B13まで手作業で入力して、そこからオートフィルをやってみましたが 空欄部分がカウントされてしまうのか上手くいきません。 エクセル初心者です。 よろしくお願いいたします。

  • エクセルVBAで行うVLOOKUPについて

    エクセル2000を使用しています。 いまいろいろVBAを使用してますが、わからないことがあります。 シート1に入力データ、シート2に参照のデータ USERFORM を使用し たとえばテキストBOX1にコードAと入れるとテキストBOX2に東京支店と表示し確認をできるようにしたいのです。東京支店は、シート2の参照データから引用してきます。 BOX1にAと入れてエンターを押した時点でVLOOKUPを実施させたいのですがいまいちわかりません。 シート2は A列にコード A,B,C,D,.... B列に東京支店、千葉支店... よろしくお願いいたします

専門家に質問してみよう