- ベストアンサー
EXCEL2010で特定の範囲のアクティブセルに基づいてコマンドボタンの有効・無効を切り替える方法
- EXCEL2010で、アクティブセルが特定の範囲にある場合にのみ、アクティブシート上のコマンドボタンを有効にし、範囲外にある場合は無効にしたいです。
- VBAを使用して、アクティブシート名が「予約状況」で、コマンドボタン名が「日報作成」の場合に特定のコードを使用しますが、エラーが発生しています。
- オブジェクトのプロパティとは、物の属性を指し、オブジェクトそのものは目に見える物を表します。また、メソッドは命令や指示を意味しますが、詳しい説明が必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ご質問のコードは通常、No.1 さん・ No.2 さんのおっしゃるとおり Intersect( ) Is Nothing と書くので、そちらを参照してください。私からは、言葉の意味について回答したいと思います。 >プロパティとは「属性」に近い意味だと理解していますが、合っていますでしょうか。(書き込み禁止や文字色や画面上の位置等) property を辞書で引くと、特性とか性質といった訳語が出てくると思います。コンピュータの分野では、おっしゃるとおり、「属性」と訳すのが最も一般的です。プロパティのままでも結構ですが。 コンピュータというのは、全ての事柄を、数字で理解している機械なんです。プロパティは属性だの性質だのと言いますが、そういうのも全部、数字で指定するわけです。ときには文字で指定することもありますが、文字自体だって結局は、数字で指定されているのです。さらに、0~9 の数字も、突き詰めれば 2 進法なので、0 と 1 の組み合わせでできているわけです。 要するに一言で言えば、プロパティというのは、オブジェクトに与えられている数字だということです。例えば画像の表示方法が 3 通りあるとき、それぞれに 1、2、3 という値を割り振って指定することができます。RGB(153,204,255) という薄い青みたいな色なら、VBA では 37 という値で指定できますね(参考 URL)。 デスクトップのショートカットをどれか一つ、右クリックし、「プロパティ」を見てみてください。リンク先だの、ショートカットキーだのという欄があって、ボックスに色んな文字が入力されていますね?作成日時はそのダイアログからは編集できないですが、日付という値が与えられています。そういうのがプロパティというわけです。 >またオブジェクトとは、言ってしまえば「目に見える物自体」だと、理解しています。(ワークシートやコマンドボタン、セル等) object を辞書で引くと、いろんな意味になり得ますが、物体、目的物、対象物といった訳が出てくると思います。つまり、モノという理解で結構です。 ただし、目に見えるとは限らず、概念上だけで存在しているオブジェクトというのもあります。 例えば Excel VBA の WorksheetFunction は、「ワークシート関数の集合」というオブジェクトであり、関数を全部書き出せば目に見えるといえば見えなくもないですが、集合なので具体的にコレとは言いづらいです。Application というオブジェクトは(ウィンドウでもブックでもなく)Excel というアプリケーションのことですから、目に見えませんね。ウィンドウなどは、Application にぶら下がっているまた別のオブジェクトです。 >メソッドは、「命令・指令」で良いのでしょうか。 method を辞書で引くと、方法、手法、手段などと載っていると思います。 メソッドは、プログラミングでは VBA に特有な言い回しですが、処理といった訳が近そうです。ただメソッドのことをプロシージャとかルーチンとは言いません。命令でもいいかもしれません。ただメソッドのことをコマンドとはあまり言いません。関数と思ってもらってもだいたい合っています。 関数とは言っても、Dir などのようないわゆる VBA 関数として独立的に用意されているものとは異なり、「オブジェクト.メソッド」あるいは「オブジェクト.メソッド 引数」、「オブジェクト.メソッド(引数)」といった形で書かれることになっています。Debug.Print のうち .Print の部分です。つまりメソッドは必ずオブジェクトを必要とするので、書いてなければオブジェクトが必要ですのエラーになるわけです(With ステートメントにより繰り返しのオブジェクトの記述を省略することはありますが)。 そうなると「オブジェクト.プロパティ」というコードと見分けが付きにくいわけですが、プロパティは上で説明したとおり値であるのに対して、メソッドは処理なので、書いているコードの意味合い、文脈で区別できます。それでも区別しにくいケースもあるのですが、そういう曖昧なのが出てきたら、VBE のヘルプで確認してください。単語を書いて、キーボードの F1 キーを押すだけです。
その他の回答 (3)
- kybo
- ベストアンサー率53% (349/647)
ボタンはActiveXコントロールなのですよね。 フォームのコマンドボタンではEnabled = Falseにはできません。 また、ボタンのオブジェクト名は、CommandButton1なんでしょうか? 開発→デザインモードで、ボタンを選択、プロパティでオブジェクト名が確認できます。 ここが、「CommandButton1」の場合の例を以下に記述します。 セルの選択イベントで、ボタン、有効、無効にしたいようなので、該当の「予約状況」のシートの見出しで右クリック→コート表示より以下の様に記述します Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'A1:E10の範囲を有効にしたい場合の例 If Not Intersect(Target, Range("A1:E10")) Is Nothing Then CommandButton1.Enabled = True Else CommandButton1.Enabled = False End If End Sub これでもうまくいかない場合、新規シートで単純にActiveXコントロールのコマンドボタンだけを配置し、上記を試して出来るかどうか見て下さい。 最初出来なくてこれで出来るなら何か、最初のkichi4182さんの質問に記載ない情報があるからうまくいなかないと考えられます。
お礼
ありがとうございます。自己解決しました。 アクティブシート名が"予約状況"、コマンドボタン名が、”日報作成"ですが、 Worksheets("予約状況").日報作成.Enabled = False もしくは、 Activesheet.日報作成.Enabled = False で、出来ました。 抜粋して書きますと、こんな感じです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Application .ScreenUpdating = False '画面更新を抑制 .DisplayAlerts = False '警告画面を抑制 .EnableEvents = False 'イベントの介入を阻止する End With ActiveSheet.日報作成.Enabled = False '無効 row = Target.row F_row = row column = Target.column F_column = column With ActiveSheet.UsedRange MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).row MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).column End With If column < MaxCol Then If row > 2 And row <= MaxRow Then ActiveSheet.日報作成.Enabled = True '有効 End If End If With Application .MoveAfterReturnDirection = xlToRight '改行方向を右に変更 .EnableEvents = True 'イベントマクロの活動を戻す .DisplayAlerts = True '警告画面を表示 .ScreenUpdating = True '画面更新を表示 End With End Sub 因みに変数はすべてPublic指定で確保済みです。 他に何か好い方法は有るでしょうか?
- misatoanna
- ベストアンサー率58% (528/896)
次のように記述されたらいかがでしょうか。 まず、特定の範囲に適当な名前(とりあえず "Zone")を付けておきます。 そのうえで、 Private Sub CommandButton1_Click() If Intersect(ActiveCell, Range("Zone")) Is Nothing Then Exit Sub MsgBox "AAA" End Sub のように記述します。 アクティブセルが特定範囲内にない場合は処理しないで、範囲内ならメッセージを出す、という例です。
お礼
ありがとうございます。 残念ながら、ご指摘頂いたのは、ボタンをクリックした後の処理ですね。 僕がやりたいことは、これではありません。アクティブセルが範囲外に在る時は、ボタンがクリック出来ないようにしたいのです。 因みに 範囲の表は行がどんどん増加していきます。列数は固定です。
- kybo
- ベストアンサー率53% (349/647)
ActiveXコントロールのコマンドボタン名が、”日報作成"であれば、 日報作成.Enabled = False と記述します。 セルの選択イベントで、ボタン、有効、無効にしたいようなので、該当の「予約状況」のシートの見出しで右クリック→コート表示より以下の様に記述します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ’A1:E10の範囲を有効にしたい場合の例 If Not Intersect(Target, Range("A1:E10")) Is Nothing Then 日報作成1.Enabled = True Else 日報作成1.Enabled = False End If End Sub >プロパティとは「属性」に近い意味だと理解していますが、合っていますでしょうか そうです、あってます。 >オブジェクトとは、言ってしまえば「目に見える物自体」だと、理解しています。(ワークシートやコマンドボタン、セル等) これは少し難しいですが、必ずしも目に見える物とは限りません。非表示になっていてもそこに存在する限り、オブジェクトです。 >メソッドは、「命令・指令」で良いのでしょうか そうです、あってます。
お礼
ありがとうございます。 残念ながら、 日報作成.Enabled = False で、同じエラーが出ます。何がいけないのでしょう。
お礼
ありがとうございます。定義がはっきり理解出来ました。これからヘルプも活用していこうと思います。