ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

初心者のためのExcel VBAコミュのcsvデータを開いてシートをコピーしてくる方法について 教えてください。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
みなさん、こんばんは。
少し上達してきた(とは、いってもまだまだ初心者の)イヒローです。

ちょっとご質問ありまして、ご教授頂きたく、トピを作成させて頂きました。
どうぞ、宜しくお願い致します。


え〜と、まず同じフォルダ内にcsvデータがあるとします。
基本的には12個なんですが、場合によっては10個だったりすることもあるかと思います。
csvを抽出した時間によって名前が違いますので、csv名を手打ちで「1〜12」とそれぞれ打ちかえします。(これによって、sheetの名前も1〜12になります。)


で、コピー先は"集計ブック.xls"が同じフォルダ内にあります。


で、私はコピーしてくるプログラムとしては・・・


sub test()
Workbooks.Open Filename:="G:\マクロ作成資料\1.csv"
Sheets("1").Select
Cells.Copy
Workbooks("集計ブック.xls").Activate
Worksheets("sheet1").Select
Worksheets("sheet1").Range("a1").PasteSpecial Paste:=xlPasteAll
Application.DisplayAlerts = False
Workbooks("1.csv").Close
Application.DisplayAlerts = True

Workbooks.Open Filename:="G:\マクロ作成資料\2.csv"
Sheets("2").Select
Cells.Copy
Workbooks("集計ブック.xls").Activate
Worksheets("sheet2").Select
Worksheets("sheet2").Range("a1").PasteSpecial Paste:=xlPasteAll
Application.DisplayAlerts = False
Workbooks("2.csv").Close
Application.DisplayAlerts = True

’ますこれを延々と12回繰り返そうかと思っていますがスッキリするプログラムはありますか?


それと、今の方法では、もし12までcsvがなかった場合エラーで出るかと思います。
そのエラー回避方法もわかれば、伝授頂けますでしょうか?

どうぞ、よろしくお願い致します。


コメント(18)

補足です。
カウンタ変数組んで1.csvを12回繰り返す動作はできませんでした。
私のやり方が悪いかも知れないんですが・・・・


すみません。宜しくお願い致します。


FileSystemObject と For Each In ... Next で出来るような。。

取りあえずヒントだけですがww
>魔流さん
ありがとうございます。
多分、For Eachは使うと思っていましたが、まだアマチャンですんで、活用方法が…



Filesystem object?

ヒントありがとうございます。頑張ってみますね。
因みに一つずつをコードダイエットするとこうなる。

Workbooks.Open Filename:="G:\マクロ作成資料\1.csv"
Workbooks("1.csv").Sheets("1").Cells.Copy _
Destination:=Workbooks("集計ブック.xls").Sheets("Sheet1").Range("A1")
Application.DisplayAlerts = False
Workbooks("1.csv").Close
Application.DisplayAlerts = True
うお〜。魔流さん、色々試してみましたが、今の自分の知識では少々難しすぎました・・・。


試したみたことは、カレントフォルダ内のすべてのcsvを開くことから実践してみました。
で、考えたのが・・・

sub test()
Dim s As wookbook
For Each s In Workbooks
workbooks.open filename:=s.index & ".csv"
next s
end sub

これやると実行時エラーが出ます。
私としては、発想自体間違っていないとは思いますが、何かが違うのでしょうね。
とりあえず、今原始的な方法にて作成中です。

目的があって作成している書類なのですが、完成したら、一度見てください。
出来れば、LifeHackerさんにも。。。

よろしくお願いします。
出来た!!

sub test()
dim i as integer
for i = 1 to 12
workbooks.open filename:="G:\マクロ作成資料\" & i & ".csv"
next i
end sub

これでまず開く動作が出来ました。
と、いうことは・・・。

良かった。


またまたがんばります。

for ~ next 使える〜〜♪
おーいww

FileSystemObject が無いぞぃwww
ファイルを開くところで使うww

ヒント追加。。(半分以上が答えww)

Set objFSO = CreateObject("Scripting.FileSystemObject")

For Each CSV In objFSO.GetFolder("G:\マクロ作成資料").Files
If LCase(objFSO.GetExtensionName(CSV)) = "csv" Then
Workbooks.Open Filename:=CSV
Debug.Print "OPEN FILE NAME : # " & CSV.Name & " #"
Workbooks(CSV.Name).Close SaveChanges:=False
Else
Debug.Print "!! SKIP FILE NAME : # " & CSV.Name & " #"
End If
Next CSV


自環境ではテスト済み。
実行してイミディエイトウィンドウに表示されたら成功!!
すみません。
ヘルプお願い致します。
Option Explicit


Sub 集計業務開始()
Dim i As Integer
For i = 1 To 12
If Workbooks("G:\マクロ作成資料\" & i & ".csv") = True Then
Workbooks.Open Filename:="G:\マクロ作成資料\" & i & ".csv"
Workbooks(i & ".csv").Sheets(1).Cells.Copy
Workbooks("集計ブック.xls").Worksheets("sheet" & i).Range("a1").PasteSpecial _
Paste:=xlPasteAll
Application.DisplayAlerts = False
Workbooks(i & ".csv").Close
Application.DisplayAlerts = True
Else
Exit For
End If
Next i
End Sub

で、基本的な構文はOKのようなのですが、ifを噛ませて、12以下の場合抜けるようにしたかったのです。
そうしたところ・・・

If Workbooks("G:\マクロ作成資料\" & i & ".csv") = True Then
にデバックがありました。


自分が書いたつもりなのは、、、
i = カウンタ変数
(もし、"G:\マクロ作成資料\" & i & ".csv"が存在したら・・・)
(〜〜〜〜処理〜〜〜〜)
(なかったら抜ける)


ってのを作ったつもりでした。


すみません、知恵お借りしたくお願い致します。


あらら??
魔流さんとかぶっちゃった!


大ヒントありがとうございます。


覚えるとこんなにも語句を並べられるんだね。感動!!

今日のところは寝て、明日試してみます。


色々、本当にありがとうございます。
>>10
ぶっちゃけると それは 大間違いだ!!!

>If Workbooks("G:\マクロ作成資料\" & i & ".csv") = True Then
翻訳すると
Workbooks("G:\マクロ作成資料\1.csv")
いつからブック名がフルパスになったwww

ブック名はファイル名だから
Workbooks("1.csv")
でしょwww


それが遣りたいなら>>9の↓が似た処理
If LCase(objFSO.GetExtensionName(CSV)) = "csv" Then

意味は調べて見て解らなかった場合に質問してくれたら答えますよ〜〜♪

俺ちょっと砕けすぎ?
今、寝床で魔流さんのコードを見ましたが、、、これ、独学で覚えたの?

独学でこんなに覚えるなんて…
凄すぎます。


またまた感動。




>>13
独学ですよ〜〜

といっても、職場で使ってる他人が作ったマクロを覗いて
知らないコードをみたらググるを繰り返してるだけですけどww
頭使ったせいか眠れない。

魔流さんすげ〜!
LifeHackerさんも尊敬してるけど魔流さんも尊敬しちゃうなぁ。


ググッてそこまでいったか。オレググッてるけどまだまだ基本がしっかりしてないんだなぁ。


まぁ魔流さんレベルまで行ったらかっこいいね。
オレも頑張るぞ!
>>15
ググる ⇒ 試す ⇒ NG ⇒ 原因を追究 ⇒ ググる ⇒ ・・・

Plan Do Check Act Cycle ですよ〜〜

PDCA Cycle Wiki
http://ja.wikipedia.org/wiki/PDCA%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB
>12
魔流さんに返答してなかったー。

あらら。御恥ずかしい。
フルパスにする必要がない訳ですね。
またまた勉強不足かぁ…。
砕けすぎてないですよわーい(嬉しい顔)

年は下かもしれないけど、先生であることには変わりはない!
むしろそうして下さい。

これからもズバズバお願いします。

でも、あまりいじめないでねハート
魔流さん!出来ました!ありがとうございます。
すごいね。イミディエイトウィンドウに結果を出す方法があるんだ〜。。。
debug.printか。これ面白いハート

すごいなぁ〜。

createobject("scripting.filesystemobject")これがよくわからないんですが、ヘルプ見ても、なんかイマイチでした。
魔流さん、どうか教えてください!


ちなみに、90%は教えてもらったものを引用しました(^−^)

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Sub 魔流()
Dim objFSO As Object
Dim csv As Object

Set objFSO = CreateObject("Scripting.FileSystemObject")

For Each csv In objFSO.GetFolder("G:\マクロ作成資料").Files
If LCase(objFSO.GetExtensionName(csv)) = "csv" Then
Workbooks.Open Filename:=csv
Debug.Print "OPEN FILE NAME : # " & csv.Name & " #"
Workbooks(csv.Name).Close SaveChanges:=False
Else
Debug.Print "!! SKIP FILE NAME : # " & csv.Name & " #"
End If
Next csv
End Sub

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

初心者のためのExcel VBA 更新情報

初心者のためのExcel VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング