• ベストアンサー

エクセル 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を組み込むことは不可能なのでしょうか?

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.6

#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 のようにすれば動くと思います

kinoyasuko
質問者

お礼

End IFのまえに、 psw = false を入れてみたら解決しました!ありがとうございました。 また何かの機会があれば宜しくお願い致します。

kinoyasuko
質問者

補足

ありがとうございます! 目的の働きをしてくれました! 調べてみたのですが、Boolean型というものでしょうか? この場合、Macro1を実行させると、「psw」がエクセルを終了するまで有効になっているのですが、 (表現の仕方が間違っていたらすみません。完璧には理解できていないです。) 承認書作成マクロの実行毎にこの動作をさせることはできないですか?

その他の回答 (6)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.7

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

kinoyasuko
質問者

お礼

ありがとうございました、解決しました! また何かの機会があれば宜しくお願い致します。

kinoyasuko
質問者

補足

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

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

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

kinoyasuko
質問者

お礼

ありがとうございました、解決しました! また何かの機会があれば宜しくお願い致します。

kinoyasuko
質問者

補足

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

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.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

kinoyasuko
質問者

お礼

ありがとうございました、解決しました! また何かの機会があれば宜しくお願い致します。

kinoyasuko
質問者

補足

ありがとうございます。 私にとっては複雑ですが、うまくいきました! しかしどこに承認書作成マクロを組み込めばよいかが分かりませんでした。。 パスワードというのは少し大げさすぎまして、 Macro1のボタンを押せば承認書作成マクロが実行できる、押さないとできない。 といったものを作らないといけないのです。 分からない用語は勉強して、参考させて頂きます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

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

kinoyasuko
質問者

補足

>承認書作成のマクロを実行する際に、Macro1が必ず実行されると まずい場合があるのなら別ですが。 まさにそうです。 Macro1をクリックした時のみ、承認通知書のマクロが実行されるようにしないといけなくて。 承認通知書のマクロに、承認通知書のマクロを組み込むと、どうしてもループしてしまいます。 なので、そんなことできるわけない、と教えてくだされば違う方法を考えてみます。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

「ご参考まで」ですが、こんな制御方法も考えられます。 ただしプログラムスイッチをFalseに戻すタイミングは考える必要がありますが… Dim psw As Boolean Sub Macro1()   psw = True End Sub Sub Macro2()   If psw Then     MsgBox "実行可能"   Else     MsgBox "実行不可"   End If End Sub

kinoyasuko
質問者

補足

迅速なご回答ありがとうございます。 自分なりに上のマクロに組み込んでみたのですが、うまく作動してくれません。 Macro1とは質問で提示したものでよろしいでしょうか? せっかくアドバイス頂いたのに、VBA初心者なものですみません。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

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

kinoyasuko
質問者

お礼

ありがとうございました、解決しました! また何かの機会があれば宜しくお願い致します。

kinoyasuko
質問者

補足

迅速なご回答ありがとうございます。 すみません、説明不足でした。 承認書作成マクロに制御をつけたいのですが、 Macro1を実行していない場合は実行できない様にしたいのです。 Ifの後にcallがどうしても入らないもので・・