[[20101029095956]] 『マクロが有効にならない』(初心者なーくん) >>BOT

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

 

『マクロが有効にならない』(初心者なーくん)
 いつもお世話になります。
 現状sheet1にCommandButton2を配置しています。
 そしてファイルを立ち上げた時にコマンドボタンを追加、ファイルを閉じる時にコマンドボタン削除をしています。
 質問なのですが、ファイルを立ち上げた後すぐにCommandButton2で列の非表示をしよう としてもコマンドが実行されません。
 一度追加したボタン(ここでは作ったボタン1)をクリックするとマクロが有効になり、CommandButton2で列の非表示が実行できます。
 つまり、ファイルを立ち上げた時はマクロが無効になっているのです。
 どのように修正すれば、ファイルを立ち上げた時マクロ有効にできますか?
 以下がそのマクロです。
 ThisWorkbookに
 Private Sub Workbook_Open()
     Call コマンドボタン作成
 End Sub
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
     Application.DisplayAlerts = False   
                Dim Ans As Long
                Ans = MsgBox("保存して終了しますか?", vbYesNoCancel + vbInformation, "保存の確認")
                Select Case Ans
                    Case vbYes
                        Call コマンドボタン削除
                        ActiveWorkbook.Save
                        Application.Quit
                    Case vbNo
                        Call コマンドボタン削除
                        ActiveWorkbook.Saved = True       
                        Application.Quit
                    Case Else
                        Cancel = True
                        Exit Sub
                    End Select
 End Sub

 標準モジュールに
 Public MacroEnabled As Boolean
 Sub 作業内容()
    If Selection.EntireColumn.Hidden = True Then
    Columns("K:M").Select
    Selection.EntireColumn.Hidden = False
    Worksheets("sheet1").CommandButton2.Caption = "非表示にする"
    Else
    Columns("K:M").Select
    Selection.EntireColumn.Hidden = True
    Worksheets("sheet1").CommandButton2.Caption = "表示する"
    End If
 End Sub
 Sub コマンドボタン作成()
 Dim CmdB As OLEObject
     With ActiveSheet           '.Range("B3")
         Set CmdB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
         , DisplayAsIcon:=False, Left:=500, Top:=5, Width:=100, Height:=100)

     End With
     With CmdB
          .Placement = xlFreeFloating
          .PrintObject = False
         .Object.Caption = "マクロ有効中"
         .Name = "作ったボタン1"
     End With
 End Sub

 Sub コマンドボタン削除()
    ActiveSheet.Shapes("作ったボタン1").Select
    Selection.Delete
 End Sub

 sheet1に
 Private Sub 作ったボタン1_Click()
   If MacroEnabled = True Then
      Me.作ったボタン1.Caption = "マクロ無効中" 
      MacroEnabled = False
   Else
      MacroEnabled = True
      Me.作ったボタン1.Caption = "マクロ有効中"
   End If
 End Sub
 Private Sub CommandButton2_Click()
    If MacroEnabled = True Then
        Call 作業内容
    End If
 End Sub

 Windows XP
 Excel 2003
 (初心者なーくん)


 >Public MacroEnabled As Boolean
 と変数MacroEnabledをBoolean型で宣言していますが
 最初にこのMacroEnabledに値をセットするのがCommandButton2をクリックした時ですよね?

 つまりCommandButton2を押すまではBoolean型の初期値であるFalseが入っていますので
 >Private Sub CommandButton2_Click()
 の
 >  If MacroEnabled = True Then
 の所ではじかれますから実行できないのです。

 初期状態で有効にするのであれば
 >Private Sub Workbook_Open()
 か
 >Sub コマンドボタン作成()
 の中で MacroEnabled = True を書く必要がありますね。

 (momo)


 momoさん、返事ありがとうございます。

 >初期状態で有効にするのであれば
 >>Private Sub Workbook_Open()
 > か
 >>Sub コマンドボタン作成()
 > の中で MacroEnabled = True を書く必要がありますね。

 さっそく試しましたが、どちらもだめでした。

 Private Sub Workbook_Open()
     MacroEnabled = True     '←←←←←←
   Call コマンドボタン作成
 End Sub

 又は、
 Sub コマンドボタン作成()
 MacroEnabled = True       '←←←←←←
 Dim CmdB As OLEObject
     With ActiveSheet  
         Set CmdB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
         , DisplayAsIcon:=False, Left:=500, Top:=5, Width:=100, Height:=100)

     End With
     With CmdB
          .Placement = xlFreeFloating
          .PrintObject = False
         .Object.Caption = "マクロ有効中"
         .Name = "作ったボタン1"
     End With
 End Sub
(初心者なーくん)

 シートに配置されたActiveXコントロールの操作で
 Public宣言された変数が意図せずにクリアされているのですね。

 MacroEnabledを使わずに

 >Public MacroEnabled As Boolean
 の行を削除して、直接作ったボタンのCaptionで判定してはどうでしょうか?

 Private Sub 作ったボタン1_Click()
   If Me.作ったボタン1.Caption = "マクロ有効中" Then
      Me.作ったボタン1.Caption = "マクロ無効中"
   Else
      Me.作ったボタン1.Caption = "マクロ有効中"
   End If
 End Sub

 Private Sub CommandButton2_Click()
    If Me.作ったボタン1.Caption = "マクロ有効中" Then
        Call 作業内容
    End If
 End Sub


 補足ですが、ファイルの上書き保存で保存してBeforeCloseでキャンセルした場合に
 作ったボタンがそのまま残ってしまいますので

 Thisworkbookモジュールに

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 Call コマンドボタン削除
 End Sub

 を付け足しておいた方がよいかと思います。

 (momo)


 momoさん、返事ありがとうございます。

 >>Public MacroEnabled As Boolean
 > の行を削除して、直接作ったボタンのCaptionで判定してはどうでしょうか?

 できました。ありがとうです。と言う事で、実際のファイルに対してもチャレンジ
 してみます。(全ての判定の差替えかぁ〜)

 補足の件、ありがとうです。見落としてました。
(いや〜相談してみてよかったで す。)さっそく試しましたが、
 エラーがでます。これもチャレンジしてみます。

 (初心者なーくん)

 >補足ですが、ファイルの上書き保存で保存してBeforeCloseでキャンセルした場合に
 >作ったボタンがそのまま残ってしまいますので
 >Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 >Call コマンドボタン削除
 >End Sub
 >を付け足しておいた方がよいかと思います。
 と
 一時保存して、また入力作業をした場合はどのように考えたらいいですか?
 教えていただけませんか?

 (初心者なーくん)


 方法は色々あると思いますが
 まず、運用をどのようにしたいかがわからないのでハッキリとは言えません。

 たとえば、なぜCommandButton1だけ毎回削除して作り直すのかとか・・・
 そもそも消さなければ、そのような処理も必要ないですよね?

 (momo)


 運用は、 
 1.閲覧だけできればいい人もいるので、マクロ有効でファイルを立ち上げた時、
     ユーザーフォームに読み取り専用(マクロ無効)と書き込み専用(マクロ有効)
     のコマンドボタンを配置しています。
 2.次にA列にRightClickイベントを使用している。(RightClickで日付を入力して
     いる)
 3.月に一度だけA列を含む数列をコピー貼付をしている。(現状、キーボードで入力
     しているCtrl+C、Ctrl+V)

  この作業をマウス操作で行う為にマクロの有効、無効の切替ボタンが欲しい。

 で、今に至るです。
 伝わりました?

 (初心者なーくん)


 >Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 >Call コマンドボタン削除
  ActiveWorkbook.Save
  Cancel = True
  Call コマンドボタン作成
 >End Sub

 未テストですみませんが、こんなロジックでうまく動きますか?
 (momo)

 momoさん、返事遅くなりすみません。

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Call コマンドボタン削除
  ActiveWorkbook.Save
  Cancel = True
  Call コマンドボタン作成
 End Sub

 で試した所、
 実行時エラー、指定した名前のアイテムが見つかりませんでした。
 と出ました。

 これは、「通常の保存して終了」と「上書き+いいえ」(上書きの時点)でエラーが
 でます。

 (初心者なーくん)一日講習はしんどかったです。


 可能ならば作成、削除ではなく、Enabledプロパティで押せる押せないを制御するとか
 Visibleプロパティで見える見えないの制御にしたほうがエラーが減ると思いますし
 対応が簡単だと思います。
 今一度整理してみてはどうでしょうか?
 (momo)

 本題とは離れますが…

 「マクロ有効」で開かれていても「表示」―「ツールバー」―「コントロールツールバー」の「デザインモード」をオンにされると
 マクロが無効になって「Workbook_BeforeSave」等のイベントも無視されるので注意が必要かと。
 (独覚)

 独覚さんのご指摘も注意が必要ですね。
 そこまで考慮していませんが、こんな動きはどうでしょう?

 Sheet1のモジュール

  Private Sub 作ったボタン1_Click()
  With Me.作ったボタン1
    If .Caption = "マクロ有効中" Then
       .Caption = "マクロ無効中"
    Else
       .Caption = "マクロ有効中"
    End If
  End With
  End Sub

  Private Sub CommandButton2_Click()
  If Me.作ったボタン1.Caption = "マクロ有効中" Then
    With Me.Columns("K:M")
      If .Hidden = True Then
        .Hidden = False
        Me.CommandButton2.Caption = "非表示にする"
      Else
        .Hidden = True
        Me.CommandButton2.Caption = "表示する"
      End If
    End With
  End If
  End Sub

  Sub 作業内容()
  With Me.Columns("K:M")
    If .Hidden = True Then
      .Hidden = False
      Me.CommandButton2.Caption = "非表示にする"
    Else
      .Hidden = True
      Me.CommandButton2.Caption = "表示する"
    End If
  End With
  End Sub

 ThisWorkbookのモジュール

  Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Worksheets("Sheet1").作ったボタン1.Enabled = False
  Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.AfterSave"
  End Sub

  Sub AfterSave()
  Worksheets("Sheet1").作ったボタン1.Enabled = True
  End Sub

  Private Sub Workbook_Open()
  Worksheets("Sheet1").作ったボタン1.Enabled = True
  End Sub

  Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.EnableEvents = False
  Worksheets("Sheet1").作ったボタン1.Enabled = False
  End Sub

 (momo)

 (momo)さん、ありがとうございます。
 >Enabledプロパティで押せる押せないを制御するとか
 これですと、マクロ無効、読取専用で開いた時コマンドボタンを削除できますよね。
 これは都合悪いです。
 >Visibleプロパティで見える見えないの制御にしたほうがエラーが減ると思いますし
 できますか?できるなら検討してみたいので教えて下さい。
 以前、こちらで質問した時、出来ない様な回答をもらいあきらめていました。

 (独覚)さん、ありがとうございます。
 >「マクロ有効」で開かれていても「表示」―「ツールバー」―「コントロールツール
 >バー」の「デザインモード」をオンにされると
 >マクロが無効になって「Workbook_BeforeSave」等のイベントも無視されるので注意が
 >必要かと。
 たしかにそうですね。これは対処はあるのでしょうか?・・・

 (初心者なーくん)


 あ〜Visibleは難しそうですね。

 >マクロ無効、読取専用で開いた時コマンドボタンを削除できますよね。
 ここまで考慮しないといけないんですねぇ
 運用レベルの問題じゃないかと思いますが・・・

 それだとCommandButton2の方も同じではないですか?

 私なら、シートの保護でオブジェクトの編集以外に全てチェックを入れて保護するとか
 そのくらいで対策しますけど
 (momo)


 (momo)さん、ありがとうございます。

 >あ〜Visibleは難しそうですね。
 やっぱりですか。残念です。

 >それだとCommandButton2の方も同じではないですか?
 すみません。これは質問用に作ったマクロで実際はないです。

 >ここまで考慮しないといけないんですねぇ
 >運用レベルの問題じゃないかと思いますが・・・
 そうなんですよねぇ〜。ただ、余分な物は見えていない方が良いので・・・。
 シートの保護で考えてみます。
 (初心者なーくん)

コメント返信:

[ 一覧(最新更新順) ]


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