- ベストアンサー
VBAに関する質問
VBA初心者のものですが、エクセル形式で保存されているいくつかのブックのシートの中身をテキストエディタ(MIFESというもの)に.csv形式で上から順に貼り付けていき保存するということは可能でしょうか? 例えば workbooks("wb1").worksheets("data").range("a1:f1")が 1 2 3 4 5 6 7 workbooks("wb2").worksheets("data").range("a1:f1")が 8 9 10 11 12 13 14 という2つのブックが存在するなら 1,2,3,4,5,6,7, 8,9,10,11,12,13,14, とテキストエディタにコピーしていく感じです。 イメージとして恐らく非常におかしなコードだと思いますが、 Sub test() Dim wb As Workbook Dim i As Integer, v As Integer Dim OpenFilename As String, wc As String dim ap as double i = Application.InputBox("コピーしたいファイル数を記入してください", Type:=1) ap = shell("MIW.exe") For v = 1 To i OpenFilename = Application.GetOpenFilename("Microsoft Excelブック,*.xls") Workbooks.Open Filename:=OpenFilename Set wb = ActiveWorkbook wb.worksheets("data").range("a1:f1").copy appactivate ap sendkeys "^V", true appaplication,wait now+timevalue("0:00:05") appactivate application.caption application.cutcopymode = false next v end sub というような感じです。 最初、エクセルで一つのシートに対し貼り付け作業を行ったあと.csv形式で保存すればいいだろうと思っていたのですが、一つ一つのシートの容量が大きく、エクセルで処理できる容量をこえてしまいそのやり方では無理なようです。分かりにくいところなど多々あるとは思いますが、時間がございましたら、手助けとなるコードなり指摘なり示して頂ければと思います。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
はじめまして まず、 1.テキストエディタ(MIFESというもの)に 2..csv形式で の内、1番は必ずしも必要な条件ではないと思います。 エクセルでカンマ区切りのデータに加工して、指定のテキストファイルに追記するという形で実現できます。 使うのは「OPENステートメント」です。 「append」という追記のモードでファイルを開き、「Write # ステートメント」でファイルにデータを書き込みます。 詳細はVBAのヘルプで「open」と「write」で検索してください。 http://officetanaka.net/excel/vba/file/file08.htm http://home.att.ne.jp/zeta/gen/excel/c04p45.htm http://eprostation.jpn.org/vba/vafile.html http://www.google.co.jp/search?num=100&hl=ja&safe=off&q=VBA+open%E3%80%80append&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
その他の回答 (1)
- argument
- ベストアンサー率63% (21/33)
はじめまして from_ahuro さん 締め切っていないので投稿します。もしも貴方が暇でまだ正解を得られてなければきっと役に立つでしょう。 これは1番さんの言う通りまったくもってエディタを開く必要はありません。そんな難しいことをしなくてもVBAEだけで処理は事足ります。 式中にも少し触れていますが「wb.worksheets("data").range("a1:f1").copy」では残念ながら最初の1,2,3,4,5,6,7の7番目の要素を取得できませんでした。もしかしたら私がこの掲示板からの例構文をどうにかして間違ってコピーしたのかも知れません(きっと後者なのでしょう)。 まぁそれは良いでしょう大した問題ではありません。 軽く問題視したのはそのデータの膨大さです。 「>一つ一つのシートの容量が大きく」と言われるとおり1シート読み込むだけで数分掛かりました。きちんとデバッグもしていたので私はどれだけ時間を使ったかわかりません(私がミスをしないで一度で正確なソースが書けないのがいかないのですが)。 まぁ愚痴はどうでも良いのです。前提・仕様が曖昧だと回答者がへりますよという話をしたかっただけなので(それにデバッグ含め一時間ほどで完成しましたので)。 けれど安心してください。回答できる問題ならば私は誰も見捨てません その条件にあった回答を作成するだけです。 其れでは以下が回答となります。 Sub csvwrite() Dim wb As Workbook Dim i As Integer, v As Integer Dim OpenFilename As String, wc As String Dim ap As Double i = Application.InputBox("コピーしたいファイル数を記入してください", Type:=1) For v = 1 To i OpenFilename = Application.GetOpenFilename("Microsoft Excelブック,*.xls") Workbooks.Open Filename:=OpenFilename Set wb = ActiveWorkbook 'シートの65536行のデータを取得します。データが多い?まさかそう思いました? '「>一つ一つのシートの容量が大きく」と書いてありますし '行の最大指定もなく空白が対象にならないとも書いてなく値が最後にあるセルが最後とも書いていません 'なら私はできる限りのデータを取得せざる得ません For k = 1 To 65536 '指定ラインはFまでの6ラインでしたね? 'え?データは1~7まである?ですが貴方の例文ではコピーはrange("a1:f1").copyでした 'これは貴方を尊重しているのです。私の間違いではありません。 myline = Array("a", "b", "c", "d", "e", "f") linedata = "" For j = 0 To UBound(myline) linedata = linedata & Range(myline(j) & k).Value & "," Next linedata = Left(linedata, Len(linedata) - 1) bookdatas = bookdatas & linedata & vbCrLf Range("A" & k).Select Next csvalldata = csvalldata & bookdatas Next v CreateObject("Scripting.FileSystemObject").CreateTextFile("c:\data.csv").write csvalldata MsgBox "c:\にデータを出力しました。" End Sub 実行してみましたか?正確に貴方のだした「条件」にお答えできていると思います。もしも間違えていたらいつでも言ってください。答えられる問題ならばいつでも修正した回答を出しましょう。
お礼
すみません、どう説明してよいものか分からずなんとなくで書いてしまいましたが、ご指摘の通り自分がかいたコードの例も前提条件も書いた本人でも意味が分からなくなるぐらい非常にずさんなものでした。以後気を付けます。もうすこし詳しく書くとある一つのブックの一つのシートに60*100くらいで空白なく全てのセルに数値が代入されているというものです。ただ、それを最終的には何百と重ねていくので1ギガをこえるものができてしまい、最初にエクセルで重ねる作業を行うのは無理だったという趣旨のものでした。
お礼
返信おくれて申し訳ございません。このような機能がVBAにあるとは知りませんでした。この機能を利用してがんばってみます。