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

解決済みの質問

エクセル VBA

VBA内で、そのVBAの実行を制御することは可能でしょうか?

下のようなコードを作ったのですが、

Sub 承認書作成()
Dim ws0 As Worksheet, ws1 As Worksheet, r1 As Range
Dim i As Long
Dim nyuryoku(), chikuseki()

Set ws0 = Worksheets("承認書作成")
Set ws1 = Worksheets("顧客データ")
Set ws2 = Worksheets("業者コード")
Set ws3 = Worksheets("承認通知書")

Worksheets("顧客データ").Select
Range("テーブル1[[#Headers],[NO.]]").Select
Selection.End(xlToRight).Select
Selection.End(xlDown).Select
Selection.ListObject.ListRows.Add AlwaysInsert:=False
Range("B7").Select

nyuryoku = Array("b5", "d5", "f5", "h5", "j5", "l5", "n5", "p5", "b6", "d6", "f6", "h6", "j6", "l6", "n6", "p6", "b4", "d4")
'転記したいセルの位置
chikuseki = Array("0", "1", "5", "6", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "53", "54")

'転記先の列のオフセット値
 Set r1 = ws1.Range("f" & Rows.Count).End(xlUp).Offset(0)
'データ蓄積セル
 For i = 0 To UBound(nyuryoku)
r1.Offset(0, chikuseki(i)).Value = ws0.Range(nyuryokui)).Value
'入力
Next
MsgBox "入力完了"
Dim lRowNum As Long
'転記先となる行番号を求める
lRowNum = ws1.Cells(Rows.Count, "b").End(xlUp).Row
'転記
ws3.Cells(6, "d").Value = ws1.Cells(lRowNum, "j").Value
ws3.Cells(17, "g").Value = ws1.Cells(lRowNum, "c").Value
ws3.Cells(22, "g").Value = ws1.Cells(lRowNum, "l").Value
ws3.Cells(22, "ac").Value = ws1.Cells(lRowNum, "ab").Value

   Set ws0 = Nothing
  Set ws1 = Nothing
End Sub

ここに、
 
  If call Macro1 then
call 承認書作成
 '上のマクロです
   Else: Msgbox"中止"

「Macro1を実行しないと承認書作成マクロを実行できない」
という
コードを組み込みたいのですが、うまくいきません。

VBA内に同じVBAを組み込むことは不可能なのでしょうか?

投稿日時 - 2007-10-11 18:23:36

QNo.3420776

すぐに回答ほしいです

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

#02です
>自分なりに上のマクロに組み込んでみたのですが、うまく作動してくれません。
とのことですが、まず新規のシートの標準モジュールシートに#02に書いたマクロをそのまま貼り付けて、Macro2を実行してみてください。次にMacro1を実行してから、もう一度Macro2を実行してください

簡単なマクロですから、まず動作を理解してからご自身のマクロに組み込んだ方がよいですよ。

想像が入りますが
Dim psw As Boolean

Sub Macro1()
  psw = True
’ kinoyasukoさんのMacro1の記述
End Sub

Sub 承認書作成()
  If psw Then
    MsgBox "実行可能"
’   kinoyasukoさんの承認書作成マクロの記述
  Else
    MsgBox "中断"
  End If
End Sub
のようにすれば動くと思います

投稿日時 - 2007-10-11 22:49:02

補足

ありがとうございます!
目的の働きをしてくれました!
調べてみたのですが、Boolean型というものでしょうか?

この場合、Macro1を実行させると、「psw」がエクセルを終了するまで有効になっているのですが、
(表現の仕方が間違っていたらすみません。完璧には理解できていないです。)
承認書作成マクロの実行毎にこの動作をさせることはできないですか?

投稿日時 - 2007-10-12 11:41:26

お礼

End IFのまえに、
psw = false
を入れてみたら解決しました!ありがとうございました。

また何かの機会があれば宜しくお願い致します。

投稿日時 - 2007-10-12 12:13:42

ANo.6

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

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

回答(7)

ANo.7

#3です。
>Macro1をクリックした時のみ、承認通知書のマクロが実行されるようにしないといけなくて。
>Macro1のボタンを押せば承認書作成マクロが実行できる、押さないとできない。
シートに置いたコマンドボタンで承認書作成のマクロを実行したいと
言う事ですか?

投稿日時 - 2007-10-12 11:38:24

補足

そうです、ボタンが2個ありMacro1のボタンを押さないと、
承認書作成マクロのボタンを押せないようにしたいです。

承認書作成ボタンを押すたびにリセットされ
承認書作成マクロを実行したあとに、承認書作成ボタンを2度連続で押そうとしてもMacro1のボタンをおしてからでないと実行できないようなしくみにしたいのです。
説明が分かりにくくすみません、お願い致します。

投稿日時 - 2007-10-12 12:03:15

お礼

ありがとうございました、解決しました!

また何かの機会があれば宜しくお願い致します。

投稿日時 - 2007-10-12 12:15:35

ANo.5

次ぎのステップへ実行したという情報を後のステップへ伝えるには、1変数(FLG)を定義しておいて、まず前もって適当な場所(色々処理により場合場合ガある)で初期化(例えばFLG=”N")しておいて、問題のステップを通ったら、FLG="Y"にして、通過したかどうかをチェックするステップでIf FLG="Y" Then (OKルーチン)のようにする。
(そして利用直後・用済み後にFLG="N"にする。)フラグ(旗を立てる)といって、プログラマの常識的手法です。
ただ変数FLGは、どのスッテップでも保持されている、PUBLIC変数などで無いと、別モジュールに行って、システムで初期化されるようでは困るので注意が必要です。
ーー
コードを長々書いて質問し、回答者に読解させるのも良いが、初めにやりたいことの要点を文章で書くのが、回答者の負担や、理解不十分を減らすことになることを考慮されたい。本件では
「プログラムのあるステップを通ったかどうか、後のステップで判別したい」ぐらいかな。

投稿日時 - 2007-10-11 21:35:28

補足

>コードを長々書いて質問し、回答者に読解させるのも良いが、初めにやりたいことの要点を文章で書くのが、回答者の負担や、理解不十分を減らすことになることを考慮されたい。
説明不足ですみません。
質問が至らないのに回答して頂いて、ありがとうございます。

しかしVBA初心者なもので、ぜんぜん理解できないです、、、
すみません、勉強する限りですね。

投稿日時 - 2007-10-12 11:16:44

お礼

ありがとうございました、解決しました!

また何かの機会があれば宜しくお願い致します。

投稿日時 - 2007-10-12 12:15:52

ANo.4

単純に Macro1 → 承認書作成 の順番で必ずマクロを実行させたいって事じゃないみたいですね。
Macro1が一度も実行されて無い状態では「承認書作成」を実行出来ないようにしたいって事?
シェアウェアでパスワードを入れてないとダメ見たいな感じ?

例えば、Macro1を実行したら隠しシートとか既存シートの未使用セルとかに何らかのフラグを立てて、「承認書作成」マクロはそれを見て実行させるとか、、、

大した仕組みじゃないけど、例えば

'----------------------------------------------------------------------
Sub Macro1()
 Do
   s = Application.InputBox("パスワードは?", "入力", Type:=1)
   If s = False Then
    MsgBox "終了します", vbCritical, "キャンセル"
'    ThisWorkbook.Close savechanges:=False
     Exit Sub
   End If
 Loop Until s = 123456
 MsgBox "OK", vbInformation, "パス解除"
 Worksheets(1).Range("IV1").Value = True
 ThisWorkbook.Save
End Sub

'----------------------------------------------------------------------
Sub 承認書作成()
 If Not Worksheets(1).Range("IV1").Value Then
   MsgBox "Macro1でパスワードを入れてね", vbInformation, "要求"
   Exit Sub
 End If
 MsgBox "承認書作成"
End Sub

投稿日時 - 2007-10-11 21:25:38

補足

ありがとうございます。
私にとっては複雑ですが、うまくいきました!
しかしどこに承認書作成マクロを組み込めばよいかが分かりませんでした。。

パスワードというのは少し大げさすぎまして、
Macro1のボタンを押せば承認書作成マクロが実行できる、押さないとできない。
といったものを作らないといけないのです。
分からない用語は勉強して、参考させて頂きます。

投稿日時 - 2007-10-12 11:11:16

お礼

ありがとうございました、解決しました!

また何かの機会があれば宜しくお願い致します。

投稿日時 - 2007-10-12 12:15:21

ANo.3

>「Macro1を実行しないと承認書作成マクロを実行できない」
>Macro1を実行していない場合は実行できない様にしたいのです。
承認書作成のマクロを実行した際に、まずMacro1を呼び出して実行後に
以降を続けて実行すればいいのでは?

承認書作成のマクロを実行する際に、Macro1が必ず実行されると
まずい場合があるのなら別ですが。

投稿日時 - 2007-10-11 20:55:24

補足

>承認書作成のマクロを実行する際に、Macro1が必ず実行されると
まずい場合があるのなら別ですが。
まさにそうです。
Macro1をクリックした時のみ、承認通知書のマクロが実行されるようにしないといけなくて。

承認通知書のマクロに、承認通知書のマクロを組み込むと、どうしてもループしてしまいます。
なので、そんなことできるわけない、と教えてくだされば違う方法を考えてみます。

投稿日時 - 2007-10-12 10:13:26

ANo.2

「ご参考まで」ですが、こんな制御方法も考えられます。
ただしプログラムスイッチをFalseに戻すタイミングは考える必要がありますが…

Dim psw As Boolean

Sub Macro1()
  psw = True
End Sub

Sub Macro2()
  If psw Then
    MsgBox "実行可能"
  Else
    MsgBox "実行不可"
  End If
End Sub

投稿日時 - 2007-10-11 18:40:42

補足

迅速なご回答ありがとうございます。

自分なりに上のマクロに組み込んでみたのですが、うまく作動してくれません。
Macro1とは質問で提示したものでよろしいでしょうか?

せっかくアドバイス頂いたのに、VBA初心者なものですみません。

投稿日時 - 2007-10-11 19:15:15

ANo.1

Sub 承認書作成()
call Macro1
Dim ws0 As Worksheet, ws1 As Worksheet, r1 As Range
  :
  :
ではいけないのですか?

投稿日時 - 2007-10-11 18:35:56

補足

迅速なご回答ありがとうございます。

すみません、説明不足でした。
承認書作成マクロに制御をつけたいのですが、
Macro1を実行していない場合は実行できない様にしたいのです。

Ifの後にcallがどうしても入らないもので・・

投稿日時 - 2007-10-11 19:08:28

お礼

ありがとうございました、解決しました!

また何かの機会があれば宜しくお願い致します。

投稿日時 - 2007-10-12 12:14:39

あなたにオススメの質問