EXCEL2010で特定の範囲のアクティブセルに基づいてコマンドボタンの有効・無効を切り替える方法

このQ&Aのポイント
  • EXCEL2010で、アクティブセルが特定の範囲にある場合にのみ、アクティブシート上のコマンドボタンを有効にし、範囲外にある場合は無効にしたいです。
  • VBAを使用して、アクティブシート名が「予約状況」で、コマンドボタン名が「日報作成」の場合に特定のコードを使用しますが、エラーが発生しています。
  • オブジェクトのプロパティとは、物の属性を指し、オブジェクトそのものは目に見える物を表します。また、メソッドは命令や指示を意味しますが、詳しい説明が必要です。
回答を見る
  • ベストアンサー

EXCEL2010で、アクティブセルが特定の範囲に

EXCEL2010で、アクティブセルが特定の範囲に在る時だけ、アクティブシート上のコマンドボタンを有効にし、範囲外に在る時は無効にしたいのですが、どうもうまくいきません。 表示・非表示ではなく有効・無効で対応したいです。 アクティブシート名が"予約状況"、コマンドボタン名が、”日報作成"です。 VBAの基本が解かっていないだけかもしれませんが、 CommandButton1.Enabled = False '無効 だと、実行時エラー424 オブジェクトが必要です。と出て、 Sheets("予約状況").Select ActiveSheet.Unprotect ActiveSheet.Shapes.Range(Array("日報作成")).Select ActiveSheet.Shapes.Range(Array("日報作成")).Enabled = False だと、最後の行で、実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていません  と出てしまいます。 プロパティとは「属性」に近い意味だと理解していますが、合っていますでしょうか。(書き込み禁止や文字色や画面上の位置等) またオブジェクトとは、言ってしまえば「目に見える物自体」だと、理解しています。(ワークシートやコマンドボタン、セル等) メソッドは、「命令・指令」で良いのでしょうか。よく解かりません。この辺りもご教示戴けると大変有り難いです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ご質問のコードは通常、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
kichi4182
質問者

お礼

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

その他の回答 (3)

  • kybo
  • ベストアンサー率53% (349/647)
回答No.4

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

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指定で確保済みです。 他に何か好い方法は有るでしょうか?

回答No.2

次のように記述されたらいかがでしょうか。 まず、特定の範囲に適当な名前(とりあえず "Zone")を付けておきます。 そのうえで、 Private Sub CommandButton1_Click() If Intersect(ActiveCell, Range("Zone")) Is Nothing Then Exit Sub MsgBox "AAA" End Sub のように記述します。 アクティブセルが特定範囲内にない場合は処理しないで、範囲内ならメッセージを出す、という例です。

kichi4182
質問者

お礼

ありがとうございます。 残念ながら、ご指摘頂いたのは、ボタンをクリックした後の処理ですね。 僕がやりたいことは、これではありません。アクティブセルが範囲外に在る時は、ボタンがクリック出来ないようにしたいのです。 因みに 範囲の表は行がどんどん増加していきます。列数は固定です。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

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 >プロパティとは「属性」に近い意味だと理解していますが、合っていますでしょうか そうです、あってます。 >オブジェクトとは、言ってしまえば「目に見える物自体」だと、理解しています。(ワークシートやコマンドボタン、セル等) これは少し難しいですが、必ずしも目に見える物とは限りません。非表示になっていてもそこに存在する限り、オブジェクトです。 >メソッドは、「命令・指令」で良いのでしょうか そうです、あってます。

kichi4182
質問者

お礼

ありがとうございます。 残念ながら、 日報作成.Enabled = False で、同じエラーが出ます。何がいけないのでしょう。

関連するQ&A

  • エクセルVBAでフォームの無効化

    エクセル2000です。 ワークシート上に配置した、フォームのDropDown (コンボボックス)を一定の条件下で無効にしようと思い、下記のTEST1のようにやってみました。 Sub TEST1() ActiveSheet.Shapes.Range(Array("Drop Down 7", "Drop Down 8", "Drop Down 9")).Select Selection.Enabled = False End Sub うまくいきました。そこで Sub TEST2() ActiveSheet.Shapes.Range(Array("Drop Down 7", "Drop Down 8", "Drop Down 9")).Enabled = False End Sub のように書き換えたところ実行時エラーがでました。 下記のようにばらせばうまくいきますが、どうしてTEST2ではダメなのかわかりません。 ご教示ください。 Sub TEST3() With ActiveSheet .DropDowns("Drop Down 7").Enabled = False .DropDowns("Drop Down 8").Enabled = False .DropDowns("Drop Down 9").Enabled = False End With End Sub

  • エクセル2010のvbaについて

    Image1.picture = LoadPicture() 上のImage1を変数にすることはできますか? WithやActiveSheet.Shapes.Range(Array(""))なども実行しましたが 同じエラーしか出ません (オブジェクトは、このプロパティまたはメソッドをサポートしていません) 回答お願いします

  • エクセルVBAでオプションボタンを無効にする方法

    フォームで作成したオプションボタンを一定の条件下で無効にするにはどのような記述をすればよいのでしょうか? たとえばsheets("Sheet1").Range("A1")がFalseのときにShapes("Option Button 1")を無効にするという記述です。

  • フォームの無効化

    Excel2002にてマクロを使用しています。 新規で作成したbookに フォームのボタンを2つ配置して 1を押すと2を無効化 2を押すと1を無効化 したいのですが、どうもうまくいきません。 Enabledプロパティみたいのを探しているんですが なぜか出てきません・・・ Visibleでやったら消えてしまいました・・・ 書き方としては ActiveSheet.Shapes("Button 1").・・・ でいいのでしょうか?

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

  • オートシェイブだけ削除したい場合、

    シートの上にオートシェイブとOLEオブジェクトの方のコマンドボタンがあり、 オートシェイブだけ削除したい場合、 どのようなvbaコードになるのでしょうか? Sub Sample() ActiveSheet.Shapes.Delete End Sub 上だと 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)」 になります。

  • EXCEL VBA:埋め込みグラフオブジェクトの命名方法について

    質問させて頂きます。 EXCEL2000のVBAで、グラフを色々加工しているのですが、 埋め込みグラフオブジェクトの名前をグラフ作成時に命名する事は 可能でしょうか? dim myRange as Range Set myRange = Range("A1:D2") Charts.Add ActiveChart.ChartType = xlPie ActiveChart.SetSourceData Source:=myRange, PlotBy:=xlRows ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent, LegendKey:=False, HasLeaderLines:=True とここで、(グラフそのもののサイズではなく) 埋め込みグラフオブジェクトのサイズを変更するとき、 ActiveSheet.Shapes(1).ScaleWidth 1.6, msoFalse, msoScaleFromTopLeft ActiveSheet.Shapes(1).ScaleHeight 1.9, msoFalse, msoScaleFromTopLeft のようにすれば、最初に作成したオブジェクトのサイズ変更は可能ではあるのですが、 条件により色々な種類の複数のグラフを順不同で作成しているため、 ActiveSheet.Shapes(1) では、希望のオブジェクトを選択できるとは限りません。 つきましては、Charts.Add 時に(グラフの名前ではなく) オブジェクトの名前を指定できれば希望のオブジェクトを 簡単に選択できると考えているのですが、これは可能でしょうか? 何卒ご教授のほど、よろしくお願いいたします。

  • 【Excel】 マクロをチェックして頂けないでしょうか。

    こんにちは 毎月更新するシートを追加する コマンドボタンを設置したいと思います。 シートをコピーし、名前を付けた範囲「翌月繰越」を F6にコピペ。 名前を付けた範囲「クリア範囲」をクリアし、カーソルをG6に置く という、マクロを記録しました。 コマンドボタンをクリックすると、記録したマクロを 実行するようにしましたが、 Range("F6").Select の、ところで止まってしまいます。 どのように修正したら良いでしょうか。 Private Sub CommandButton2_Click() ActiveSheet.Copy Before:=ActiveSheet Application.Goto Reference:="翌月繰越" Selection.Copy Range("F6").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Goto Reference:="クリア範囲" ActiveWindow.SmallScroll Down:=-48 Application.CutCopyMode = False Selection.ClearContents Range("G6").Select End Sub また、これを実行するとコピー元シートの左側にシートが追加されますが、 コピー元シートの右側に追加するにはどうしたら良いでしょうか。 Excelは2003です。 よろしくお願いいたします。

  • エクセルVBAでフォームの無効化(2)

    http://odn.okwave.jp/kotaeru.php3?q=1942213 の質問の追加質問なのですが、 ワークシート上に配置したフォームのコンボボックス(DropDowns)をマクロにて無効とさせる方法です。 シート保護されている場合、 DropDownオブジェクトを個別に指定して Sub TEST3() With ActiveSheet .DropDowns("Drop Down 7").Enabled = False .DropDowns("Drop Down 8").Enabled = False .DropDowns("Drop Down 9").Enabled = False End With End Sub とすると、OKなのですが、コレクションオブジェクトとしてまとめてやろうとして、 Sub TEST4() With ActiveSheet .DropDowns.Enabled = False End With End Sub とするとエラーになります。 シート保護のない場合は両方ともOKです。 どういう違いなのでしょうか?

  • シート上のボタン、オブジェクト名取得 or 変更

    探してみたのですが、 良い方法が見当たらないため質問させて頂きます。 Excel2003を使用しています。 UserForm上で、シートにボタンを追加し、 マクロを登録するプログラムを組みました。 -------------------------------------- With ActiveSheet.Buttons.Add(Range("H1").Left, _ Range("H1").Top, _ Range("H1:I1").Width, _ Range("H1").Height) .OnAction = "HiddenDataOpenMacro" .Characters.Text = "表示" .Characters.Font.Size = 8 End With --------------------------------------- この場合、H1の部分に新しいボタンが登録されます。 作成したボタンのオブジェクト名が知りたいのですが、 どのようにしたら分かるでしょうか? もしくは、HiddenDataOpenMacro上に どういうプログラムを組めばいいのか教えて頂きたいです。 --------------------------------------- Sub HiddenDataOpenMacro() If ActiveSheet.Commandbuton1.Caption = "表示" Then ActiveSheet.CommandButton1.Caption = "非表示" ActiveSheet.Rows.Hidden = False ElseIf ActiveSheet.Commandbuton1.Caption = "非表示" Then ActiveSheet.CommandButton1.Caption = "表示" ActiveSheet.Rows("2:20").Hidden = True Else MsgBox "違うよ!" End If End Sub ------------------------------------------ ためしに、上記マクロを考えてみました。 シート上には、マクロ登録してあるボタンがもう1つあります。 やりたいことはシンプルでして、 ボタンに表示されている文字列が”表示”だった場合、 ボタンに表示されている文字列を”非表示”に変更 また、非表示にしていたデータを表示にします。 ボタンの文字列が”非表示”だった場合には、 文字列を”表示”に変更し、 指定部分を非表示にします。 標準モジュールでの操作ではできませんでした。 (メソッドをサポートしてませんとエラーが出ます。) シートは毎回新しく作り直すため、 シートにプログラムを書くのはもったいない?気がします。 どうにか方法は無いでしょうか? ボタンを作成するときに、オブジェクト名まで指定できれば 良いかと思うのですが・・・ 話がごちゃごちゃになってきましたので、 やりたいことをまとめます。 ●シートにある、指定文字列が書いてあるボタンのオブジェクト名を取得 ●ボタン作成時にオブジェクト名を設定する方法 ●If ActiveSheet.Commandbuton1.Caption = "表示" Then ではない他の書き方 以上、よろしくお願い致します!

専門家に質問してみよう