• 締切済み

Shapes の使い方について

今まで、Excel VBA で、 If ActiveSheet.Button1.Visible = False Then   Exit Sub End If が問題なく動いていましたが、VISTA を使っておられる人からエラーが出るという指摘を受けました(Excel のバージョンはわかりません)。どうやら上の文に問題があるような気がして、いろいろ調べてみましたら、皆さん If ActiveSheet.Shapes("Button1").Visible = False Then   Exit Sub End If としておられるようなのです。なぜ、Shapes("Button1")としなければならないのか、教えていただけませんか。

みんなの回答

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.3

すでにいくつかの記法が示されていますが Vista・Excel2007sp1で調べてみたところ下記のどれも問題なく 動作しました。  たくさんのシートにたくさんのcommandbuttonがあるということなのでアクティブシートとcommandbuttonの関係が合致しない使い方が 可能になってしまっているのではないでしょうか。 もしくはサービスパックの適用がなされていない? If ActiveSheet.Shapes("CommandButton1").Visible = True Then MsgBox "true" If CommandButton1.Visible = True Then MsgBox "true" If ActiveSheet.CommandButton1.Visible = True Then MsgBox "true" If Sheets("sheet1").CommandButton1.Visible = True Then MsgBox "true"

zzzIIIzzz
質問者

お礼

回答ありがとうございます。 示していただいた4つの文のうち、2番目はエラーになりました。 その他は問題ありませんでした。 ただ、私が知りたいのは、3番目の文でも動くのに、なぜ1番目のように しなければいけないのかということです。 私が作ったプログラムはもう5年以上も前のもので、その間、何の問題も なく動いていました。それが突然「エラーが出た」という報告を受けたも のですから、OSやExcelのバージョンが変わるとプログラムも更新して いく必要があるかと思い、いろいろ調べてみました。その結果としての 質問でしたが、どうも私は見当違いの質問をしているのかと思うように なってきました。貴重な時間を割いて回答していただいたことに感謝 申し上げます。ありがとうございました。  

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

CommandButtonなどのActiveXコントロールをシートに貼り付けると OLEObjectsになりますので、素直にOLEObjectsを使ったらどうでしょうか 新しいシートにCommandButtonをひとつ貼り付けて下記を試してみてください。 '--------------------------------------------- Sub test()  If ActiveSheet.OLEObjects("CommandButton1").Visible = False Then    MsgBox "Non Visible"  Else    MsgBox "Visible"  End If  With ActiveSheet.OLEObjects("CommandButton1")    .Visible = Not .Visible  End With End Sub '---------------------------------------------  

zzzIIIzzz
質問者

お礼

何もわかっていないとお叱りを受けそうで恐縮ですが、 If ActiveSheet.CommandButton1.Visible = False Then で動くものを、なぜ If ActiveSheet.OLEObjects("CommandButton1").Visible = False Then としなければならないのかを教えていただきたいのです。上の「質問」を 繰り返すことになりますが、なぜ If ActiveSheet.Button1.Visible = False Then でなくて If ActiveSheet.Shapes("Button1").Visible = False Then としなければならないのかがわからないのです。OLEObjects("")とか Shapes("")などとすると、どのようなメリットがあるのでしょうか。 このようなことを質問して叱られはしないかとびくびくしながら お尋ねしています。どうかよろしくお願いいたします。  

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

コントロールの指定の仕方の問題と言うよりは、ActiveSheet.という 指定の仕方に問題があるのではないか。 「あの家」と言うようなもので、時により、人により、場面により「あの」のさす内容が変わるあいまいさがある。 他シートタブを誰かが触るとActiveSheet.が変わる。 それでよい場合も有るが、処理内容の方で特定のシートを対象にした内容になっておれば(こちらのほうが仕事では多いか)、エラーや、処理結果がめちゃめちゃになる。 普通はシート名を指定してシートを特定する。シート名を変えられたら「おじゃん」だが、まあそこまでは、利用者はしないだろうという前提。 ここに聞く手の問題ではないと思う。MsgBoxを数行追加して、情況を把握してはどうだろう。質問者に固有の問題で、情況とか、コード、操作者の操作などわからないので、質問コーナーの読者には推測でしか、答えられない問題と思う。 コントロールの指定としても、コントロールをフォームに貼り付けるのでなく、シートに貼り付けているのか(どちらかと言うと少数ケース)シートとの関係で良くエラーが出る。Gloval何たらかんたら。 エクセルではButton1より良く使うのは、CommndButton1などではないか。 Sub test01() 'Worksheets("Sheet1").button1.Caption = "aaa" 'ActiveSheet.Shapes("Button1").Caption = "bbb" ActiveSheet.Shapes("CommandButton1").Caption = "ccc" 'Worksheets("Sheet1").CommandButton1.Caption = "aaa" Worksheets("Sheet1").CommandButton1.ForeColor = vbRed End Sub 一番下2つ以外はエラーになった。 ーー Userform上のコマンドボタン Private Sub UserForm_Click() UserForm1.CommandButton1.Caption = "XXX" End Sub とCommandButton1で指定。 ーー コマンドボタンも ワークシート上の   フォームでのコマンドボタン   コントロールのコマンドボタン ユーザーフォーム上の   コマンドボタン  の3種ありその区別の意識ありますか。 さらに言えばシートにオートシェイプの四角を貼り付け、マクロを 登録することも出来る。 ーー http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9d441.html のようにControlsと言うのも有る。 ーーー あるいは下記と関連している問題かも知れない http://questionbox.jp.msn.com/qa2740392.html

zzzIIIzzz
質問者

お礼

さっそく丁寧な回答を頂き、ありがとうございます。 単にButton1と記載しましたが、これはCommndButtonのことです。 いいかげんな質問をしてご迷惑をおかけし、申し訳ありませんでした。 このプログラムではCommndButtonしか使っていないものですから、 Button1と書けばCommndButtonのことという思い込みがありました。 --コントロールの指定の仕方の問題と言うよりは、ActiveSheet.という --指定の仕方に問題があるのではないか。 とのことですが、いくつかの枚数のWorkSheetが動的に作成されていて (利用者によりいくつ作成されているのかが異なります)、その中のどの シートにも様々なCommndButtonが貼り付けてあります。利用者が どのシートを開いていても、そのシートに貼り付けてあるボタンを押す ことで、操作ができるようにしてあります。そのため、シート名で指定せ ずActiveSheetという指定の仕方をしています。 例示していただきました5つの文を、XP上のExcel2000 と Excel2003、 およびVista上のExcel2007(これは友人のパソコンを使わせてもらい ました)で試してみましたが、これらのうち、2番目と3番目の文はいず れのパソコンでも、 --実行時エラー'438': --オブジェクトは、このプロパティまたはメソッドをサポートしていません。 となってエラーになってしまいました。そこで、2番目と3番目を --ActiveSheet.Button1.Caption = "bbb" --ActiveSheet.CommandButton1.Caption = "ccc" とShapes("")をはずしてみましたところ、全ての文が実行されました。 どうもShapes("")の使い方が間違っているのかなという気がしてきました。 利用者の方のエラー報告によれば、「質問」に示した文が原因としか考 えられないためにいろいろ調べてみましたところ、多くの人が Shapes("")という表現を示しておられたので、上記のような「質問」をした のでした。 詳しくご教示いただきまして、ありがとうございました。

関連するQ&A