- ベストアンサー
Excel2000での差し込み表示データ読み込みVBAコード
- Excel2000で「差し込み表示.xls」から「実験データ.xls」への値の読み込みを行うVBAコードの作成方法を教えてください。
- 1日だけの日付のデータを読み込む場合は、既存のコードで対応できるのですが、月を指定して30日または31日分のデータを読み込む場合のコードを教えてください。
- 指定した年月を「差し込み表示」のセルに記載し、データ読み込みボタンを押すと、1日から31日までの各日に対応する値を表示させるVBAコードの作成方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
解答したマクロの設計のコンセプト(着眼点)は,ご相談でヤリタイ事はわざわざマクロを使わなくても,関数式を埋めておくだけで実現できますよ,という事です。 その上で,それでもマクロを使うメリットとして挙げられるのは,結果抽出シートに重たい関数式(といってもマクロで書かせたのは少しでも軽く動作する式ですが)を抱えずに,データだけを転記(コピー)することで少しでもシートを軽くできるという点です。 そのため,解答したマクロは 1.関数式を記入し,計算させる 2.関数の計算結果を値化する というステップを踏んでいます。 >省略しても、同じ結果が出るように思えた どうやらマクロで逐一コピーしてこなくても,関数を埋めておくだけで問題無さそうだと考えたのでしたら,解答したマクロがマクロの部分で行っている「小の月では31日の行には計算結果を出さない」という部分も数式に組み込んで(若しくは条件付き書式などで代替する方法もあります),マクロはヤメにして数式だけで運用する方向に転換するのも良い方法だと思います。 あるいは実際にVLOOKUP等の数式を埋めて使ってみて,「やっぱり関数で計算させるのでは重たくてダメだ,値をコピーしてすっきり使いたい」という事が判ったなら,その時こそマクロの出番という事になります。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
既に回答も有るが、何度も質問しているようだが下記をお願いする。 (1)データ実例をテキストで質問に挙げる。 本件は画像で挙げているが拡大してもよく読めない。多数行・列データを盛り込むとぼやける。 (WEBにあるなら質問文に貼り付けては。) 多数行でなくても良いからテキストで質問文に入力してほしい。 (2)そしてデータの特徴は、文章で説明を添えること。 例 月を指定して ということは(A列で?)複数月のデータがあるのか >表示させようとしています どのシートに書き出しのか? データからXXつきのデータだけ抜き出して、別ブックのシートに書き出すのか。 インプットデータに当たるシートとアウトプットにアタラウシートは始のほうに、定義しておいたほうが 後のコード記述ではっきりさせることが出来て良いと思う。 例 Sub test02() Set wb1 = Workbooks.Open("XXX.xls") Set Insh = wb1.Worksheets("Sheet2") MsgBox Insh.Cells(3, "A") End Sub ーー 1行ずつ最終行まで読んでいるようだから、A列でつきがXX月でない行を読み飛ばしたら仕舞いではないのか。 参考 Sub test01() For i = 1 To 3 MsgBox Month(Cells(i, "A")) Next i End Sub 去年の同月のデータもあれば年と同時に判断必要。 == 疑問点、行き詰まった点に絞った質問にすること。(コードを貼り付けるのでなく、何を聞きたいのかしぼって書くこと) ほとんど主旨は1行の文章で表現できる。
お礼
ご指摘ありがとうございます。 ・画像の字の大きさの件了解いたしました。以後気をつけます。 ・データの特徴について、具体的な動作事例を示すように致します。 自分でコードを作成しようとして、無駄に長い構文ができてしまい、動作せず、混乱してしまい投稿させていただきました。 私自身のレベルがもっと向上できれば質問の仕方も改善するとは思いますが、もう少しターゲットを明確にして質問するように気をつけます。
- keithin
- ベストアンサー率66% (5278/7941)
「(所定の日付の)データがない」という場合が実際にあり得る場合は,その旨機能を追加してください。 sub macro1() dim w as workbook dim mydate as date, mydays as long set w = workbooks.open(filename:=thisworkbook.path & "\実験データ.xls") mydate = thisworkbook.worksheets(1).range("E1") mydate = mydate - day(mydate) + 1 ’念のため。 mydays = day(dateadd("M",1,mydate) - 1) thisworkbook.worksheets(1).range("C5:I35").clearcontents with thisworkbook.worksheets(1).range("C5").resize(mydays, 7) .formula = "=VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))" .value = .value end with w.close savechanges:=false end sub
お礼
keithin様 ありがとうございます。まさかここまで、すごく簡潔に短いコードでまとめ上げていただけるなんて、思いもよらなかったため、とても感動しました。 最後のほうの .value = .value の文は、省略しても、同じ結果が出るように思えたのですが、これはどういった意味があるのでしょうか、差し支えなければ、再度ご教授いただけると、ありがたいです。
お礼
ご丁寧に回答くださいましてありがとうございます。 関数とマクロを最も最適なバランスで、融合した最も理想的なコードだと思います。こんなに素晴らしい回答に出会うことができて、私は本当についています。本当にありがとうございました。 さて、申し上げにくいことなのですが、 ご教授いただいたコードで該当する値がない場合のエラー表示「#N/A」をなくすために、値を読みにいくところを、下記コードに変更しようとしたのですが、どうしてもエラーとなってしまうため、再度質問をあげさせていただきました。 さらにご教授いただければ幸いです。 .Formula = "=IF(ISERROR(VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))),"",VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0)))"