[[20110128215718]] 『マクロの実行方法』(shota) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの実行方法』(shota)
 dimで始まったマクロの実行方法がわかりません。
 マクロ実行ボタンが作れないマクロの実行方法を教えて下さい。
 よろしく御願いします。


 マクロを提示ください。
 Sub、 Function 以外で始まるマクロを私は知りません。
 (Mook)

 すみません
 Private Subの間違いでした。
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Dim bCount As Integer, WB As Workbook
 '開いているブック数
 bCount = Workbooks.Count
 'PERSONAL.XLSを探して、見つかったら数に入れない
 For Each WB In Workbooks
    If StrConv(WB.Name, vbUpperCase) = "PERSONAL.XLS" Then
        bCount = bCount - 1
    End If
 Next
 'ブック数が2以上なら閉じられないようにする
 If bCount >= 2 Then
    Cancel = True
 End If
 End Sub
 これだとマクロ実行ボタンが作れないから実行の仕方がわかりません。 
 ご指導よろしく御願いします。


 中身を標準モジュールの別のプロシージャにし、
 どちらからもそれを呼べばよいと思います。
 (Mook)


 追伸
 しかし、上記はファイルが一つ開いているかどうかの判定だけですが、
 それでよいのでしょうか。
 Workbook_BeforeClose の意味はご存知ですか?

 何がしたいのか目的をはっきりした方が、解決が早いと思います。
 (Mook)

 Private Subで始まったマクロの実行方法が知りたいのです。
 例題にあげたマクロの内容は関係ありません。
 普通のマクロだとマクロ実行ボタンが作れて、それに登録してクリックすればマクロは実行されますが、
 この場合実行ボタンが作れないので実行できないんです。
 Private Subの場合の実行方法が知りたいのです。
 (shota)

 標準モジュールにあって引数がなければ、選択リストになくとも、ボタンで名前を指定すれば
 実行できます。

 ですが、なぜ Private 指定があるか、コードの変更は可能なのか、何をする処理なのか、
 状況や目的によって適切な回答は異なってきます。
 (Mook)


 Mook様
 有難うございました。
 (shota)

 shotaさんは、この質問がお好きですね ^^

 1.実際のマクロは、どこに書いてあるんですか?
   Module1ですか、Sheet1ですか、それとも・・・?

 2.そのマクロは、引数(下記サンプルの○○)を必要としていますか?
            ↓
     Private Sub test1(○○)
       MsgBox "Private Test1"
     End Sub

 (半平太) 2011/01/29 20:51

 半平太様
 Cancel As Booleanですが何を意味しているのかわかりません。
 (shota)

 > Cancel As Booleanですが何を意味しているのかわかりません。

 あれれ? 
 「例題にあげたマクロの内容は関係ありません。」との事でしたので、
  全然別のお話かと勘違いしてしまいました。

 すると、処理内容は関係ないが、Cancelが何か分からないので
 「とにかくそのマクロを実行したいと思った時、どう動かせばいいのか知りたい」
 と云う様な感じのご質問ですね?

 サンプルとして、こんなマクロを考えてみます。

  Private Sub Workbook_BeforeClose(Cancel As Boolean)
   MsgBox Cancel
  End Sub

 括弧の中にある「Cancel」は引数(ひきすう)です。
 As Boolean と定義されているので、
 「Cancel」と云う名前を付けられた変数で、データ型は論理値です。

 別にCancelと云う名前でなくてもいいです
 日本語なら「取消す」なんて名前にしてもいいです。

 つまり、こんなのでも全く同じマクロです。
      ↓
  Private Sub Workbook_BeforeClose(取消す As Boolean)
   MsgBox 取消す
  End Sub

 引数を渡されて動きますので、実行したい時は論理値を渡さないと動きません。
 同じ場所にこんなマクロを書いてみてください。

 Sub ちょっとテスト()
     Call Workbook_BeforeClose(True) '引数にTrueを渡して冒頭のマクロを実行させる。
 End Sub

 試しに「ちょっとテスト」を実行してみてください。(これはボタンにも登録できます)

 ※あと、もうひとつ云っておかなければなりません。
  冒頭のマクロは、エクセルのブックを閉じる時、
  自動的に引数にFalseが渡されて実行されるものでもあります。

   その処理中に、Cancel(取消す)にTrueを入れれば、
   ブックを閉じるのを止めさせることができます。
  それが冒頭のマクロの本来的な存在意義です。

   無理やり「ちょっとテスト」したりする様な使い方は滅多にしないものです。
  お気をつけ遊ばせ ^^

 (半平太) 2011/01/29 23:15

 半平太様
 こまごまとしたご指導有難うございました。
 (shota)


 >Private Subで始まったマクロの実行方法が知りたいのです。
 と書いてありますが

 >例題にあげたマクロの内容は関係ありません。
 >実行ボタンが作れないので実行できないんです。
 と言う事なので

 ●[Alt]+[F8]の一覧に出てこないマクロはどのように実行するのか?
 という質問の様に思えます。

 Private Sub で始まらず、Subで始まるものでも一覧に出てこないものもあります。

 これらのマクロは、
 使用者(実際にその時にエクセルをつついている人)が意識をして実行するものではなく、
 作成者(そのマクロ・プログラムを作った人)が「このタイミングで実行してほしい」と
 思った時に、使用者の意識に関係なく実行させたい時、実行【される】ものです。

 shotaさんが使用者であれば、shotaさんの意志では実行できません。
 作成者が「○○をしたら実行される様にしよう」と考えた「○○」と言う行為をした時に、
 実行されます。
  もちろん、事前に「○○」が何かを知っていて 意識して「○○」をした場合
  shotaさんの意志で実行した事に成りますが。。。

 shotaさんが作成者であれば まず先に何をしたら実行したいのか 考える必要があります。
 たとえば、
  ・(マクロ1)を実行した時にだけ実行したい。
  ・特定のセルに入力した時に実行したい。
  ・セルをダブルクリックした時に実行したい。
  ・印刷をする前に実行したい。
  ・ブックが閉じられようとしている時、閉じられる前に実行したい。
 等です。

 もしも
 「(マクロ1)を実行した時にだけ実行したい。」と考えた場合
 '------
    Sub マクロ1()
        MsgBox "マクロ1が実行されました。"
        Call マクロ2
    End Sub
    Private Sub マクロ2()
        MsgBox "マクロ2が実行されました。"
    End Sub
 '------
 こんなコードが書いてあったら、一覧には(マクロ1)の名前しか表示されません。
 しかし、(マクロ1)を実行すれば (マクロ2)も自動的に実行されます。

 (マクロ2)の Private Sub の所が Sub だけだったら、
 (マクロ2)の名前も一覧に表示されます。

 (マクロ2)の名前も一覧に表示されていると、使用者は
 (マクロ1)を実行せずに(マクロ2)を単独で実行してしまうかもしれません。
    本当は、(マクロ1)を実行した後 (マクロ2)を実行してもらいたいのに。

 こんな時、(マクロ2)を一覧から見えない様にしておいて、
 (マクロ1)が実行された時に (マクロ2)が自動的に実行される様に
 (マクロ1)のコードを作ります。
 すると、使用者に勝手に(マクロ2)を実行される事が無くなりますね。

 こういったコードにしてあると、
 使用者が(マクロ2)を実行しなくても(マクロ2)が自動的に実行されますが、
 (マクロ1)を実行させる事は必要になりますね。

 でも、この(マクロ1)の実行を忘れて次の処理に移る人が居るかもしれません。
 たとえば、
  印刷をする前に実行したいマクロがある。(セルの書式を整える 等のマクロ)
  使用者には、印刷前にこのマクロを実行してから、印刷をしてほしい。
  でも、それを忘れて印刷する人がたくさんいて、印刷されたものを見て
   「あ、マクロ実行してなかった」と気付いて マクロを実行して
   再度印刷している。
  これでは、時間も紙もインクも無駄になる。
  エクセルで印刷を実行しようとした時に、マクロが自動的に実行されれば良いのに。

 と思った時も Private Sub で始まるマクロを使います。

 通常のマクロは「標準モジュール」に書いていきます。
 VBEで 挿入(I)→標準モジュール と進んで出てくる所です。

 今回のマクロは「シートモジュール」とか「This Workbookモジュール」等に書きます。
 (「シートタブを右クリックして コードの表示(V)で出てきた画面に〜」なんて説明を
  学校で良くご覧になると思いますが、その画面が「シートモジュール」になります。)

 このマクロは、基本的にマクロ名等が決まっています。
 たとえば
  セルの値が変わった時に実行されるマクロ
    Private Sub Worksheet_Change(ByVal Target As Range)
  ダブルクリックした時に実行されるマクロ
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  印刷をする前に実行されるマクロ
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
  ブックが閉じられる前に実行されるマクロ
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
 勝手にマクロの名前等を変えてしまうと、そのタイミングで実行されなくなります。

 一覧に表示されないマクロ
(Private Subで始まって居たり、Subで始まっているが表示されないマクロ)は
  使用者が [Alt]+[F8]の一覧からいつでも自由に実行できるものではなく、
  そのマクロを作った人にいつ実行させたいかを決められているマクロ
 と言えるかもしれません。

 (HANA)

 HANA様
 ご指導有難うございました。
 (shota)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.