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

解決済みの質問

エクセルでの複数VBAの作業

 こんばんは。

 お世話になります。

 以下のコードをMicrosoft Visual Basicの「標準モジュール画面」にて記述し、作動させてみたのですが、
 2つ目のSub lll()のみしか反映されないようで、”S”行のみしか値がえられませんでした。

 何が問題なのか、初心者のわたくしには、わかりません。

 お手数ですが、原因等をお教えいただければ、幸いでございます。



Sub hhh()
Dim n As Long
Dim rng As Range
n = 2000
ReDim hh(1 To n, 1 To 1)
Set rng = Range("C2:C31")
For i = 1 To n
hh(i, 1) = WorksheetFunction.Max(rng)
Set rng = rng.Offset(30)
Next i
Range("R2").Resize(n) = hh
End Sub

Sub lll()
Dim n As Long
Dim rng As Range
n = 2000
ReDim ll(1 To n, 1 To 1)
Set rng = Range("D2:D31")
For i = 1 To n
ll(i, 1) = WorksheetFunction.Min(rng)
Set rng = rng.Offset(30)
Next i
Range("S2").Resize(n) = ll
End Sub

投稿日時 - 2012-08-11 01:43:27

QNo.7637837

すぐに回答ほしいです

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

いったいあなたは、今どうやってマクロを実行しているのですか。

基本の手順:
ALT+F8を押す
hhhを実行する
ALT+F8を押す
lllを実行する。
このようにしてそれぞれのマクロを実行するのです。


手順:
シート上にオートシェイプを1つ配置する
右クリックしてマクロの登録でhhhを登録する
シート上に別のオートシェイプを1つ配置する
右クリックしてマクロの登録でlllを登録する
hhhを登録したオートシェイプをクリックしてhhhを実行する
lllを登録したオートシェイプをクリックしてlllを実行する



そもそもなんでhhhとlllと2つ作ったのですか。何の意図も考えていないなら、1つのマクロで作成します。


sub hhhlll()
 dim r as long

’おまけ
 range("R:S").clearcontents
 range("R1:S1") = array("MAX","MIN")
 
’本題
 for r = 2 to range("C65536").end(xlup).row step 30
 range("R65536").end(xlup).offset(1) = application.max(cells(r, "C").resize(30, 1))
 range("S65536").end(xlup).offset(1) = application.min(cells(r, "D").resize(30, 1))
 next r
end sub

投稿日時 - 2012-08-11 13:57:14

お礼

 実を申しますと、2つにまとめたいのは、元々の希望だったのですが、残念ながら、VBAの知識が足らず、ご質問させていただいた次第でございます。

 非常に参考となるコードをお示しになられましたこと、厚くお礼申し上げます。

投稿日時 - 2012-08-11 22:53:30

ANo.4

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

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

回答(4)

ANo.3

Subが並んでいるからといって、それは実行(仕事)の順序(流れ)とは無関係。
実行の順序を制御するのはプログラマの仕事です。
「プロシージャの呼び出し」
http://kabu-macro.com/kouza/macro/macro_yobidasi.html
マクロ機能に慣れてより複雑なプログラムを組むようになると、どうしてもVBAコードが長くなってしまいます。
そこで、「各プロシージャを呼び出す」専用のプロシージャを用意し、全体の流れをひと目で把握できるようにしましょう。
以下に2つのプロシージャを用意しました。
VBEを開いて以下のVBAコードを標準モジュールに入力(参考→VBAとは)
---------------
Sub プロシージャ1 ()
   Range("A1").value = "〇"
End Sub
---------------
Sub プロシージャ2 ()
   Range( "A2").value = "×"
End Sub
---------------
では、今から上記2「プロシージャを呼び出す」専用のプロシージャを作ってみましょう。
----------------
Sub プロシージャの呼び出し ()
   Call プロシージャ1
   Call プロシージャ2
End Sub
----------------
Sub プロシージャ1 ()
   Range( "A1").value = "〇"
End Sub
----------------
Sub プロシージャ2 ()
   Range( "A2").value = "×"
End Sub
----------------
見事に「プロシージャを呼び出す」プロシージャを実行することで2つのプロシージャが実行されましたね。

投稿日時 - 2012-08-11 13:01:33

お礼

 ご参考資料までいただきまして、どうもありがとうございます。

 勉強させていただきます。

 厚くお礼申し上げます。

投稿日時 - 2012-08-11 22:50:52

ANo.2

関連を持たないSubを2つ並べても一方しか実行されない。(親のSubを作って2つを呼び出すこともできるが...)
MAXとMIN、この2つはどう見ても1つの機能、だからまとめればいい。スッキリする。
勿論、データは1セットしか要らない。
それと、テストならもっとコンパクトにして、視野を確保すべき。ループカウンタは10で十分だし、データはA列(1セット!)、結果はC列とD列だろう。
判らないときは、デバッグする。ステップbyステップ(F8)もできる。変数のウォッチもできる。

投稿日時 - 2012-08-11 09:39:38

お礼

 ご回答いただきまして、どうもありがとうございました。

 何分、初心者なものですから、ご質問させていただいた次第であります。

 Subを2つ並べても一方だけしか実行されないのでしょうか?

 もし、よろしければ、複数のVBAを同時に実行してくれるものをご紹介いただければ、幸甚に存じます。

投稿日時 - 2012-08-11 12:21:51

ANo.1

マクロ自体はどちらも正常です。


>2つ目のSub lll()のみしか反映されないようで、”S”行のみしか値がえられませんでした。

S列にとりあえず数字が入ったのは良いとして、肝心の問題のR列は「具体的に目に見える様子」として、いったいどうなったのですか?



○ゼロの羅列が入った場合
 C列に「数値」が記入できていないのが原因です
 まっさらのシートを用意、C列とD列に数字を記入し、あなたのマクロを実行して正しく作動する事を確認してください
 そのうえで改めて問題のシートに戻り、C列とD列を見直すなりデータを入れ直してもう一回やってみます

 あるいはもしかするとゼロが記入できているのに、セルの書式設定の表示形式などで表示が目に見えないようにしてしまっているのかも?しれません。セルを選んだ時に数式バーに何某か現れるのでしたら、単に表示の問題です



○数式バーの中も何も無い空っぽのままの場合
 hhhを実行していないのが原因です
 
 あるいはもしかすると、ご相談に掲示されたの以外にも他のマクロを一緒に実行していて、R列を消してしまったのかも?しれません。ブックを用意し、もう一度明示的にhhhをただ実行します。

 あるいはもしかすると、マクロの使い方が悪くて「他のシート(他のブック)に」結果を出してしまっているのかも?しれません。C列とD列に数字を入れたブックそれ1つだけをエクセルで開き、マクロを実行します。

投稿日時 - 2012-08-11 02:11:19

補足

 どうも申し訳ございません。

 通常ならば、上述のコードで”R列”と”S列”も同時に埋まっていくはずですよね?

 何分、初心者なものですから、根本的な間違いがないかお聞きしたかった次第でございます。

 もし、よろしければ、「基本的には、間違いはない」もしくは、「根本的に間違いがある」のご連絡を頂きますれば、幸いでございます。

投稿日時 - 2012-08-11 12:18:49

お礼

 ご返答いただきましたこと、厚くお礼申し上げます。

 なお、数式バーの中が空っぽという結果となっております。

 ご指示にもございますように、新たなシート(or ブック)を別途用意し、それで再計算させてみようと思っております。

 まずは、取り急ぎ、お礼申し上げます。

投稿日時 - 2012-08-11 12:14:46