[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロが有効にならない』(初心者なーくん)
いつもお世話になります。
現状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.