プロが教える店舗&オフィスのセキュリティ対策術

エクセル VBA内で Call  自分が作ったプログラム名 を記載して、稼働する場合と稼働しない場合があるがどうしてか、稼働しない場合はどうすればいいか。

A 回答 (6件)

こんにちは。



No.5の回答者です。

>すみませんが、ご回答の内容が理解できません。
やっている内容は、なかなか、VBAとしては、レベルの高いことをされているようです。

いろいろ検証して回答を書いてみましたが、おそらく、私のNo.5の延長のような書き方をしたら、分からないと言われそうです。それは、基本的な所が分かっているのか不安になっています。

ポイントとしては、

・「シートモジュール」と「標準モジュール」の使い方の違い
・Private キーワードというもの
・CommandButton などのActiveX コントロールと、フォームコントロールのオブジェクトの違い

さて、以下の場合は、どこが問題か。

>Private Sub CommandButton4_Click() 'これがどこにあるのか?
>Sheets("Sheet3").Select
 'Worksheets("Sheet3")ではなさそうです。それを別の所持っていってしまうやり方では、うまくいくとは思えません。CommandButton は、基本的にシートに従属されたものだからです。

>Application.Run "'2更新.xls'!AAA"
>Application.Run "'2更新.xls'!BBB"
>End Sub

Excelのほとんどのマクロは、標準モジュールで使われるものです。シートモジュールでは、シートオブジェクトを親オブジェクトとするので、そのシートだけを管理するイベント型がほとんどで、他のシートなどをアクティブにして流用することはないのです。
    • good
    • 0

割り込ませていただきます。



コマンドボタンは、何かは分かりません。シートごとに作るというのは、ActiveX コントロールではないかと思います。Windows 10 の大幅な改変以降は、フォームコントロールを使うことが多くなりました。取り扱いも、セキュリティも簡単だからです。ActiveX コントロールのコマンドボタンでないのでしたら、また違う内容になってしまいます。

本来、その周辺を丁寧に書いていただけたらよかったと思います。

Private Sub CommandButton1_Click()
となっているものは、
  Call Worksheets("Sheet1").CommandButton1_Click
では呼び出せません。なぜなら、このCall 以下を、プログラム名とするには、かなり高度なテクニックが必要になってしまうからです。

それぞれ、コマンドボタンの名称が違うなら、このようになります。
Sub Test_Command1()
  Worksheets("Sheet1").CommandButton1.Value = True
  Worksheets("Sheet2").CommandButton1.Value = True
End Sub

一緒でしたら、このように書きます。

Sub Test_Command2()
Dim sh As Worksheet
For Each sh In Worksheets
  sh.CommandButton1.Value = True
Next
End Sub

なお、例えば、シートモジュールの場合、コマンドの中が、以下のようになっていても、この上位オブジェクトは、ActiveSheet ではなく、その書かれたシートが上位オブジェクトですから、問題なく、その上位シート上のRange("A1") に値が書き込まれるはずです。ActiveSheet を意識しなくてよいです。

Private Sub CommandButton1_Click()
  Range("A1").Value = "myDAT" '上位オブジェクトは、その書き込まれたシート
End Sub
    • good
    • 0
この回答へのお礼

ありがとう、いままで作ったマクロをそれぞれのシートでは動いており、それをドミノにして稼働させたいが途中で止まってしまう、すみませんが、ご回答の内容が理解できません。
自分の場合はこうなっております。
Sub ドミノ記録()
'
' ドミノ記録 Macro
'
Call  1

Call  2

Call  3

Call  4

Call  5

Call  5のプログラムで止まってしまう、中身は

Private Sub CommandButton4_Click()
Sheets("Sheet3").Select

Application.Run "'2更新.xls'!AAA"
Application.Run "'2更新.xls'!BBB"
End Sub

これをどうすればいいということなのでしょうか?

お礼日時:2018/10/20 04:31

No2です。


>シート1)で作ったマクロのボタン、シート2)で作ったマクロのボタン、シート3)で作ったマクロのボタンはそれぞれのボタンで動くが それらを一括して1)2)3)を一括して
>特定のシート 例えばシート4)にマクロボタンを一個を作り それを押すことにより 先のそれぞれのシートのマクロが連動して作動できるようにするにはどうすればいいかということです。

シート1で作ったマクロのボタンから呼び出されるマクロ名をマクロ①
シート2で作ったマクロのボタンから呼び出されるマクロ名をマクロ②
シート3で作ったマクロのボタンから呼び出されるマクロ名をマクロ③
シート4で作ったマクロのボタンから呼び出されるマクロ名をマクロ④
とすると
マクロ④の中身は
call マクロ①
call マクロ②
call マクロ③
とすれば良いです。

もし、上記のことを既に行っていて、期待した結果にならないということであれば、考えられる原因の1つとして、
アクティブシートを前提としたマクロを作っていることがあります。
マクロ①のボタンから呼び出した時点では、シート1がアクティブシートになります。
マクロ②のボタンから呼び出した時点では、シート2がアクティブシートになります。
マクロ③のボタンから呼び出した時点では、シート3がアクティブシートになります。
ところが、
マクロ④のボタンから呼び出した時点では、シート4がアクティブシートになります。
シート4がアクティブシートの状態で、マクロ①を実行すると、シート1を対象にした動作ができなくなります。
以下同様。

これらの事象を回避するためには、アクティブシートを前提にしたマクロの書き方をやめて、
シート名を指定したマクロの書き方に変える必要があります。
    • good
    • 0

> Call  自分が作ったプログラム名



その「自分が作ったプログラム」とやらは、どこに置かれていますか?

同じブック内にあるのにそういう動きをする場合は、プログラムの内容に問題があるはずです。もし別のブック内にある場合はCallでは動かないので、Runを使ってください。詳細は以下に。

http://officetanaka.net/excel/vba/tips/tips09.htm
    • good
    • 0
この回答へのお礼

ありがとう。
シート1)で作ったマクロのボタン、シート2)で作ったマクロのボタン、シート3)で作ったマクロのボタンはそれぞれのボタンで動くが それらを一括して1)2)3)を一括して
特定のシート 例えばシート4)にマクロボタンを一個を作り それを押すことにより 先のそれぞれのシートのマクロが連動して作動できるようにするにはどうすればいいかということです。
RUNでもうまくいかなかった。

お礼日時:2018/10/18 06:51

No1の方の言われる通りです。



稼働する場合と稼働しない場合があるとのことですが、考えらえるのが
①そもそもcallすらされていない
②callされているが、そのあと、期待した動作をしていない
の2点が考えらえます。

もっと、解決につながる具体的な、アドバイスがほしいのであれば、
callしている箇所
callされているプロシージャの全てを提示したほうが良いかと。
    • good
    • 0
この回答へのお礼

ありがとう やってみます。

問題は
シート1)で作ったマクロのボタン、シート2)で作ったマクロのボタン、シート3)で作ったマクロのボタンはそれぞれのボタンで動くが それらを一括して1)2)3)を一括して
特定のシート 例えばシート4)にマクロボタンを一個を作り それを押すことにより 先のそれぞれのシートのマクロが連動して作動できるようにするにはどうすればいいかということです。

マクロボタンの作り方が問題?

お礼日時:2018/10/18 06:53

>>稼働する場合と稼働しない場合があるがどうしてか、稼働しない場合はどうすればいいか。



プログラム記述にエラーがあれば稼働しない。エラーが無ければ稼働する。
稼働しない場合、エラー箇所を探して修正する。
    • good
    • 0
この回答へのお礼

ありがとう。

お礼日時:2018/10/18 06:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!