• 締切済み

【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)を繰り返す

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

質問が整理されているのは良いが、どういうコード技術が要るかの観点に踏み込んでいない。 それは質問者の書いた文章にある。エクセルで手操作でやる場合のことを思い浮かべ、順を追って文章箇条書きすることにヒントがある。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)
回答No.1

単なる慣れの問題です。やるべき事を淡々とマクロに書き起こしてください。 丸投げじゃなくピンポイントに「こういう事をするマクロは?」と質問できるよう,頑張ってください。 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

関連するQ&A

専門家に質問してみよう