重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

EXCEL2010で、アクティブセルが特定の範囲に在る時だけ、アクティブシート上のコマンドボタンを有効にし、範囲外に在る時は無効にしたいのですが、どうもうまくいきません。

表示・非表示ではなく有効・無効で対応したいです。

アクティブシート名が"予約状況"、コマンドボタン名が、”日報作成"です。

VBAの基本が解かっていないだけかもしれませんが、

CommandButton1.Enabled = False '無効

だと、実行時エラー424 オブジェクトが必要です。と出て、

Sheets("予約状況").Select
ActiveSheet.Unprotect
ActiveSheet.Shapes.Range(Array("日報作成")).Select
ActiveSheet.Shapes.Range(Array("日報作成")).Enabled = False

だと、最後の行で、実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていません  と出てしまいます。

プロパティとは「属性」に近い意味だと理解していますが、合っていますでしょうか。(書き込み禁止や文字色や画面上の位置等)

またオブジェクトとは、言ってしまえば「目に見える物自体」だと、理解しています。(ワークシートやコマンドボタン、セル等)

メソッドは、「命令・指令」で良いのでしょうか。よく解かりません。この辺りもご教示戴けると大変有り難いです。よろしくお願いします。

A 回答 (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 キーを押すだけです。

参考URL:http://www.relief.jp/itnote/archives/000482.php
    • good
    • 0
この回答へのお礼

ありがとうございます。定義がはっきり理解出来ました。これからヘルプも活用していこうと思います。

お礼日時:2013/05/01 14:59

ボタンは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さんの質問に記載ない情報があるからうまくいなかないと考えられます。
    • good
    • 0
この回答へのお礼

ありがとうございます。自己解決しました。

アクティブシート名が"予約状況"、コマンドボタン名が、”日報作成"ですが、

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指定で確保済みです。

他に何か好い方法は有るでしょうか?

お礼日時:2013/05/03 21:08

次のように記述されたらいかがでしょうか。



まず、特定の範囲に適当な名前(とりあえず "Zone")を付けておきます。
そのうえで、
Private Sub CommandButton1_Click()
If Intersect(ActiveCell, Range("Zone")) Is Nothing Then Exit Sub
MsgBox "AAA"
End Sub
のように記述します。

アクティブセルが特定範囲内にない場合は処理しないで、範囲内ならメッセージを出す、という例です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

残念ながら、ご指摘頂いたのは、ボタンをクリックした後の処理ですね。

僕がやりたいことは、これではありません。アクティブセルが範囲外に在る時は、ボタンがクリック出来ないようにしたいのです。

因みに 範囲の表は行がどんどん増加していきます。列数は固定です。

お礼日時:2013/05/01 14:57

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


>プロパティとは「属性」に近い意味だと理解していますが、合っていますでしょうか

そうです、あってます。

>オブジェクトとは、言ってしまえば「目に見える物自体」だと、理解しています。(ワークシートやコマンドボタン、セル等)

これは少し難しいですが、必ずしも目に見える物とは限りません。非表示になっていてもそこに存在する限り、オブジェクトです。

>メソッドは、「命令・指令」で良いのでしょうか

そうです、あってます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

残念ながら、

日報作成.Enabled = False

で、同じエラーが出ます。何がいけないのでしょう。

お礼日時:2013/05/01 14:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!