重要なお知らせ

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

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

エクセルシートに図形から丸っこい四角の図形を貼付けて、それのマクロ登録を使ってボタンからマクロを実行していますが、つい最近、あるブックの全部のボタンに登録しているマクロが、違うマクロに変わっていて、ボタンを押すとエラーになるトラブルがありました。

私はこれは誰かがサーバにあるこのファイルを開いて、わざわざ、マクロを違うマクロに変えたと考えていますが、それ以外に何か考えられる原因はありますでしょうか。

そもそも、このエラーは起きるものでしょうか。

質問者からの補足コメント

  • このため、ボタンのマクロを違うマクロに変更出来ないようにしたいのですが、ユーザがシート上で自由にデータ入力、行の移動、挿入、その他の作業は全て出きるようにしたいのですが、何か方法はありますでしょうか。

    よろしくお願いします。

      補足日時:2016/08/05 10:01

A 回答 (7件)

こんにちは。


#4の回答者です。

自分の発言に対して、実行可能か調べてみました。

私自身の回答のオブジェクトの名前の問題については、トラブルを発生しやす原因として、それは至急変更すべきだという意見は、変えるつもりはありません。おそらく、オブジェクトのセルのアドレス名でコンフリクトが生じている問題だと思います。

しかし、私はわたし自身の発言を、それとは別に、プロテクトという件で、数日来から、ずっと調べていました。

>ボタンのマクロ名を変えられないようにするものではありません。
ご本人がこの内容を、じっくりと、ゆっくりと理解していただくしかありません。私の発想そのものが、まったく違うからです。見慣れない用語もありますから、そこらは調べていただくことで、実際に試してみればわかる話しです。

さて、最初からですが、

今回のご質問は、「図形(AutoShape)」に対するマクロの登録も問題であって、フォーム・コントロールボタンもActiveX も安易にプロテクトというよりも、ご質問者さんが望む程度のプロテクトというか、ユーザーが、マクロ名などを簡単には変更できないようになっています。

念のためですが、予め再度確認しておかなくてはなりません。
図形などにマクロをつけたことではなく、その図形の名称をオリジナルのままにしなかったのが問題ではないかと思っています。

コンテクストメニュー(右クリックメニュー)から、マクロの登録ができないようにするというご相談では、いろいろ調べてみましたが、いくつかのリボン・カスタマイザーの海外の作者が指摘していましたが、コンテクスト・メニューでPicture モードのものは、その変更は不可能だというそうです。

そこで、私が考えた方法は、複数のマクロ自体を、マクロの登録に入れるのではなく、ひとつのマクロで、AlternativeText や図形の名称そのものでマクロを選ばせるという方法があります。普通は、オブジェクトには、Tag やIDを持っているのですが、図形(AutoShape)には、それがありません。

AutoShape そのものが持つユーザ認識コード(AlternativeTextに書き込む)
 ↓     それぞれに振り分けられる
Main()----------+-- triangle  Macro1 
        |            
        +-- round    Macro2
        |       
        +-- pentagon  Macro3  
        |            
        +-- rectangle  Macro4  

実は、今の私には、クラスからインスタンス自体も、載せることができませんでした。(前言を訂正させていただきます。)

オートシェイブの「マクロの登録(Assign Macro)」に登録するのはこれ一つです。
むろん標準モジュールです。(入れるときは、選択していれるのではなく、コピー&ペーストで、マクロの登録に貼り付けないとできません

'//
Private Sub obSelectjMacro1()
Dim NameObj As String
Dim obj As Object
 On Error Resume Next
 NameObj = Application.Caller()
 If Err <> 0 Then Exit Sub
 On Error GoTo 0
 Set obj = ActiveSheet.Shapes(NameObj)
 Select Case obj.AlternativeText
 Case "triangle" 'オブジェクトの認識コード(AlternativeText)
   Call Macro1
 Case "round"
   Call Macro2
 Case "pentagon"
   Call Macro3
 Case "rectangle"
   Call Macro4
 Case Else
   sObjName = NameObj
   Call Macro5(sObjName)
 End Select
End Sub

'/本体のモジュール内に以下も置いてください。

Private Sub Macro1()
    MsgBox "三角形から、マクロ1が選ばれました", vbInformation
End Sub

Private Sub Macro2()
  MsgBox "丸から、マクロ2が選ばれました", vbExclamation
End Sub
Private Sub Macro3()
  MsgBox "五角形から、マクロ3が選ばれました", vbCritical
End Sub
Private Sub Macro4()
  MsgBox "長方形から、マクロ4が選ばれました", vbQuestion
End Sub

Private Sub Macro5(ByVal sObjName As String)
  MsgBox sObjName & "は、登録されていません。", vbCritical
End Sub

---------------
次に、図形側に、代替テキストの中に、それぞれ、
三角は、triangle
丸は、round
五角形 pentagon
長方形は rectangle

とします。こうしますと、オブジェクト名が変更されても、そのまま、マクロ自体は変わりません。(添付の画像)
----------------

他の発言されている方に対して失礼かもしれませんが、
特定のシートのVBAマクロだけをプロテクトする方法はありません。
ClassモジュールのFriend キーワードや標準モジュールのPrivate キーワードがありますが、これらは、少し目的が違います。
また、プロジェクトというのは、単体のVBEの構成の最高レベルに位置します。
シートモジュール・標準モジュール、ThisWrokbookモジュール、UserFormモジュールそして、Class モジュール、参照設定を含めた機能が、プロジェクトといいます。
「Excel VBA ボタンのマクロについ」の回答画像7
    • good
    • 0

>>それは、ActiveXコントロールのことでしょうか?


そうでは無くて、図形に貼り付けたVBAコードは例えば、Sheet1にいるとしたら、添付の赤で囲んだプロジェクトを指定して、保護を掛ける。

保護の掛け方は今まで説明した通りの方法。
「Excel VBA ボタンのマクロについ」の回答画像6
    • good
    • 0

#4の回答者です。


----------
>AシートのA1ボタンに、A3のプロシージャ名が登録されてあり
>BシートのB1ボタンに、B3のプロシージャぉ名が登録されているのですが
----------

>AシートのA1ボタンに、A3のプロシージャ名が登録されてあり

ボタンに話が変わっているようですが、最初、話は、図形ではなかったかなって思いました。私の望んでいる情報はありませんでしたが、気になる部分がありましたので、それを指摘しておきます。

どうやら、本当に、A1ボタンのA3プロシージャ名?を付けていらっしゃるようですね。私は、最初、仮の話かとは思いましたが、もし、それが本当なら、トラブルの発生の可能性はかなり高いです。どれかのオブジェクトを触ると、エラーが出ていたはずです。

セルのアドレス名と重なる名前は使ってはいけません。これは、フォームボタンでも同じです。

また、フォームも図形を同じですが、Index で処理でしますといつの間にかに中身が違ったものを扱っているということがあります。Index は、見かけの順序に支配されるからです。

オブジェクトは、英字に一意(Unique)の名前に枝番をつけたり、オブジェクトのデフォルト名をそのまま使います。また、マクロ名も一般的な名前か一意の名前にします。

それで、試してみてください。
    • good
    • 0
この回答へのお礼

ボタンではなく図形でした。失礼しました。
A3は、仮の名前で、きちんとしたプロシージャ名を付けております。

お礼日時:2016/10/03 13:39

>あるブックの全部のボタンに登録しているマクロが、違うマクロに変わっていて、ボタンを押すとエラーになるトラブルがありました。


    ↓
>ボタンのマクロを違うマクロに変更出来ないようにしたいのですが

何か、ここの間には、見えない情報が存在していると思います。結果だけをみて、それが起こらないようにするにはどうしたらよいのか、と言われても、本来の対処とはかけ離れたものになりかねません。

まず、そのコードの内容とエラーの種類なのです。致命的エラー(C言語[マイナスがつく])が出たのか、VBAのエラーが出たのか、オートメーションや外部オブジェクトのエラーなのか、VBA内のエラーなのか、ワークシートとVBE間のエラーなのか、それぞれによって対処の仕方は違います。

特に、何百回といか、何週間というテストを繰り返して、デバッグが終わったならともかく、エラーが限定されていない段階で、VBEditorにパスワードを入れてロックするのは、お勧めできません。

基本としては、
・当該ブックの標準モジュールを使う。
・汎用性があるVBAマクロコードであるか。
・エラーの範囲を最小限にとどめさせることが可能か。

しかし、究極の方法としては、ボタン自体をインスタンスにすれば、一般ユーザーは、まったく手の届かない所に置かれると思いますが、難易度4から5ぐらいというところでしょうか。マクロを全面的に書き換えなくてはなりません。カプセル化させて、表に出る部分を極力少なくすればよいとおもいます。でも、それは最初の段階で設計すればよいのですが、後付けは大変なことが多いです。

もう一つは、マクロでマクロを選ばせる方法があります。
同じマクロでも、クリックしたオブジェクトによってマクロが変わるという方法です。ある意味では、上記と同じ考え方です。

でも、そうする前にすることはあると思うのです。

・エクセルシートに図形から丸っこい四角の図形を貼付けて、・・マクロ登録

図形は、基本的にはフォーム・コントロールとは同じに扱いにはなります。そういう方法でやることは、私はほとんどありません。フォーム・コントロールを張り付けて、そこにマクロを取り付けます。(私がフォーム・コントロールを詳しくないと思っている方もいるようですが。)

繰り返しますが、どんなエラーであるか、そのマクロは、シートやオブジェクトが変わることで対応力があるのか、というところです。まず、そこからスタートしていかないといけないと思います。

マクロが問題なく完璧だというなら、もちろん、上記で書いた方法を考えればよいし、またそれが可能だろうと思います。失礼な言い回しに聞こえましたら、ご容赦ください。
    • good
    • 0
この回答へのお礼

AシートのA1ボタンに、A3のプロシージャ名が登録されてあり
BシートのB1ボタンに、B3のプロシージャぉ名が登録されているのですが
そのA1ボタンのマクロ名がC3のプロシージャ名に変わってるというふうに、全シートのボタンのマクロの登録名が違うプロシージャ名に変わってしまっていたのです。
こんな事は普通ありえません。誰かが手で変えないかぎり。

お礼日時:2016/08/05 14:49

ボタンに張り付いているプロパティを変更出来ない様にする。


と言う事だと思います(プロジェクト名もボタンのプロパティ設定)。

ボタンに対応したプロジェクト(マクロ名)、を一覧から選択して、前と同じ様に保護すれば大丈夫なんですケド。

さらに非表示をチェックにすれば、デバッグモードにしてプロパティを変更しようにもプロパティウィンドウには何も表示されませんから、マクロ名も変更出来ませんが・・・。
    • good
    • 0
この回答へのお礼

それは、ActiveXコントロールのことでしょうか?

お礼日時:2016/08/05 16:31

エクセルを保存して一旦終了しないと駄目なんですが、ソーしました?


エクセル再立ち上げで有効。

コードも見せない様にするなら、「表示用にロックする」のチェックを入れます。この場合も保存して一旦終了、再立ち上げ。
    • good
    • 0
この回答へのお礼

もちろん、一旦終了して再立ち上げして、図形に登録してあるマクロ名は、普通に違うマクロ名に替えられます。
お話されてるVBAエディターのパスワードは、そのエディターを開いて見れなくするもので、ボタンのマクロ名を変えられないようにするものではありません。
違う方法を教えて下さい。

お礼日時:2016/08/05 13:15

vbaエディターを開いて、一覧ウィンドウから該当プロジェクトを選択して右クリック⇒プロパティで、保護タブを開いてパスワード設定する。



これで当該プロジェクトだけが保護されます。
    • good
    • 0
この回答へのお礼

オススメの方法を試しましたが、図形に登録してあるマクロ名は、違うものに変える事は出来ました。ですので、それでは私がシたいことは出来ません。何か他に方法はありますでしょうか。

お礼日時:2016/08/05 10:34

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