こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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形式で保存すればいいだろうと思っていたのですが、一つ一つのシートの容量が大きく、エクセルで処理できる容量をこえてしまいそのやり方では無理なようです。分かりにくいところなど多々あるとは思いますが、時間がございましたら、手助けとなるコードなり指摘なり示して頂ければと思います。宜しくお願いします。

投稿日時 - 2008-09-06 16:57:17

QNo.4308274

暇なときに回答ください

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

はじめまして

まず、
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

投稿日時 - 2008-09-06 18:05:41

お礼

返信おくれて申し訳ございません。このような機能がVBAにあるとは知りませんでした。この機能を利用してがんばってみます。

投稿日時 - 2008-09-10 14:26:30

ANo.1

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

はじめまして 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



実行してみましたか?正確に貴方のだした「条件」にお答えできていると思います。もしも間違えていたらいつでも言ってください。答えられる問題ならばいつでも修正した回答を出しましょう。

投稿日時 - 2008-09-16 12:00:51

お礼

すみません、どう説明してよいものか分からずなんとなくで書いてしまいましたが、ご指摘の通り自分がかいたコードの例も前提条件も書いた本人でも意味が分からなくなるぐらい非常にずさんなものでした。以後気を付けます。もうすこし詳しく書くとある一つのブックの一つのシートに60*100くらいで空白なく全てのセルに数値が代入されているというものです。ただ、それを最終的には何百と重ねていくので1ギガをこえるものができてしまい、最初にエクセルで重ねる作業を行うのは無理だったという趣旨のものでした。

投稿日時 - 2008-09-16 21:35:34

あなたにオススメの質問