- 締切済み
【2003】VBA 別ファイル特定シートへのコピペ
下に書いてあるようなことをしたいのですが、勉強するのも初めてで 現段階の自分の知識ではどうにもなりません。 一応、自力でできたのはフォルダ内の.xlsファイルがなくなるまですべて開くというとこだけでしょうか・・・ お手数かけますが、ご教授お願いします。 参照するシートやファイルは既に存在しているものとします。 <固定値> C:\blue\red\ 'ここをカレントディレクトリと呼ぶ C:\yellow '集計ファイルはこのディレクトリに置いてある' C:\yellow\集計_2011.xls <ファイル配置> カレントディレクトリ配下にはデータファイルがn個入っている。 1_data.xls 2_data.xls 3_data.xls ・ ・ <数字>_data.xls ◆マクロの動作内容 (1)C:\yellow\集計_2011.xlsが開かれていない場合はファイルを開き 既に開いている場合は(2)へ進む。 (2)カレントディレクトリ配下の*_data.xlsファイルを開く (3)開いたファイルのシート名「Second」を開き、セルC5を参照する (4)下記の通り分岐する((3)の結果) C5=one ならば yellow\集計_2011.xlsのシート名「English」を選択 C5=eins ならば yellow\集計_2011.xlsのシート名「German」を選択 C5=un ならば yellow\集計_2011.xlsのシート名「French」を選択 (5)dataファイルのA6を起点とし、下記の範囲をコピーする 行:A6~(上から数えて最後に空白でないセルA*) 列:A列からZ列まで →A6:Z*の範囲をコピー(これを#とする) (6) #をyellow\集計_2011.xlsに追記形式でコピペする →(4)で選択したシートに貼り付ける →貼り付けるセルは、B10を上から数えて最初に空白のセルを起点として、#を貼り付ける (7)開いていたdataファイルを閉じる (8) カレントディレクトリのdataファイルがすべてに(2)から(7)を繰り返す
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
質問が整理されているのは良いが、どういうコード技術が要るかの観点に踏み込んでいない。 それは質問者の書いた文章にある。エクセルで手操作でやる場合のことを思い浮かべ、順を追って文章箇条書きすることにヒントがある。1つのサイクルの場合を極めて、それから繰り返しに持っていくのが鉄則。 エクセルは最終的にはシート(とそのセルかセル範囲)の「学」(学習)なので、このシートオブジェクトをコードで捕まえる技術を学ぶ必要がある。 今回はコピペする段階では (1)<数字>_data.xlsの1シート(このブックのシート1つSecondだけをたいしょうにするのだな) (2)yellow\集計_2011.xlsのシート(En,Gr,Frの3つ) これをどうコードで捕まえるか Set (オブジェクトの変数名)=ワークシート とするか ブックから連ねて記述する方法(ブック名).(シート名).Range(・・)にするか ーー (処理の流れ・繰り返し) yellow\集計_2011.xls のブックは開いておく。 フォルダの中のエクセルブックすべてについて下記繰り返し エクセルブックを開く(Workbooks.Open) シートSecondを選択(Select) Secondシートの有効データ行の範囲指定ーーX C5セルの値で処理分岐(IFステートメントやCase文)=>集積するシートを別にする 集計シートの最終行の次からXの有効データ行を貼り付ける。 ブックを閉じてつぎの繰り返しへ ーー 下記のようなことをやってみたら 初心者はマクロの記録を思い出せ WEB照会を有効に使え (1)「VBA エクセル ブック 開く 」Google照会かマクロの記録 (2)フォルダのファイルをずつ捕まえる 「VBA フォルダ ファイル すべて」 http://homepage2.nifty.com/kasayan/vba/dir.htm (3) シートのデータの最終行の補足 「VBA 最終行を捕まえる」 http://www.niji.or.jp/home/toru/notes/8.html (4)処理の場合を分ける 「VBA 処理 分岐」 「VBA 場合分け」 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_if_select.html (5)コピペ 「VBA コピペ」 http://excelvba.pc-users.net/fol2/2_8.html (6)ファイルのクローズ 「VBA ファイル クローズ」 ちょっと毛色が違うのは、ブックが既に開いて居るか、だが 「vba ブック 開いているか 判定」で照会 http://officetanaka.net/excel/vba/tips/tips108.htm 初心者は、この条件を省いて、はじめは考えては。開いていたら閉じてテストする。 ーー 3つのシートに分けるなども、はじめは分けないでコードを作り、うまく行っているような段階になって、3つに分けるとよいのでは。 コードに修正するなど、やさしい内容に(仕様を省略)して、まず全体が一応終わるように漕ぎ着けることだ。 ーーー 丸投げしないで、上記ぐらいWEBで照会して、勉強してから、疑問点を絞って、ここへ質問するもんだ。 質問コーナーに聞けば誰かが全面回答してくれるというのはよくない。
- keithin
- ベストアンサー率66% (5278/7941)
単なる慣れの問題です。やるべき事を淡々とマクロに書き起こしてください。 丸投げじゃなくピンポイントに「こういう事をするマクロは?」と質問できるよう,頑張ってください。 sub macro1() dim myPath as string dim myFile as string dim w as workbook dim s as worksheet mypath = "C:\blue\red\" ’開いていても気にする必要なし workbooks.open filename:="c:\yellow\集計_2011.xls" ’ファイルを調査する myfile = dir(mypath & "*_data.xls") do until myfile = "" ’ファイルを開く set w = workbooks.open(filename:=mypath & myfile) ’貼り付け先を指定する select case w.worksheets("Second").range("C5") case "one" set s = workbooks("集計_2011.xls").worksheets("English") case"eins" set s = workbooks("集計_2011.xls").worksheets("German") case "un" set s = workbooks("集計_2011.xls").worksheets("French") case else msgbox "unexpected data" stop end select ’各シートに事前に準備がしてあれば次の行は不要 s.range("B9") = "title" ’対象範囲を取得してコピーし,貼り付け先を取得して貼り付ける w.worksheets(1).range("A6:Z" & w.worksheets(1).range("A65536").end(xlup).row).copy _ destination:=s.range("B65536").end(xlup).offset(1) ’閉じて繰り返す w.close savechanges:=false myfile = dir() loop end sub