• ベストアンサー

Excel2003で作成したマクロが2000で不具合が生じました。

Excel2003で作ったマクロを2000で実行したところこの命令でエラーになってしまいました。恐らく参照設定の問題だと思いますが、どの参照が問題なのでしょうか?   If Environ("COMPUTERNAME") = "Z7890580" Then     Exit Sub   End If このVBAのブックの特定のシートで右クリックでオプション選択できるようになっていましたが、上記エラーが生じた後、そのPCでエクセルを実行すると、このブックを閉じても常に右クリックするとオプションが表示されるようになってしまいました。 どのようにすれば出ないようになるのでしょうか? よろしくお願い申し上げます。 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)   Application.CommandBars("Cell").Reset   With Application.CommandBars("Cell").Controls.Add     .BeginGroup = True     .Caption = "ReadOnlyで開く"     .FaceId = 59     .OnAction = "Selection_File_Open"   End With End Sub

この投稿のマルチメディアは削除されているためご覧いただけません。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >Private Sub Worksheet_BeforeRightClickの指定でかなり長期間私のPCで稼動させていましたが、特に問題はありませんでした。 そういう問題がないというよりも、設計自体がヘンだと思いませんか? 結果オーライというなら、それは、それで、こちらは何も言うつもりはありません。VBAは、あくまでも、プライベートのものですから、不具合がなければ、それはそれで良いのですが、アドバイスを求められれば、指摘はします。ベテランの人でも、別件の使い方ですが、ある程度のコード・ルールは、守っても良さそうだと思う人のコードがあります。VBAは、VBAの範疇の書き方があるのですね。それを指摘したら、ある人から恨まれて、未だに時々嫌がらせをするようですが。Microsoft が指導していた内容だったので知っていると思ったのですが、プライドを傷つけたようです。 私は、メニューが出る出ないだけの問題で、右クリックで、右クリックメニューを入れ出しするコードは感心しません。メニューが出る・出ないというのは、Visible だけの問題であって、本格的に、削除するのは、Application が終わる場合や、そのブックが閉じる時だけで十分ではないでしょうか? それが、値ではなくて、オブジェクトを立てているからです。そうすると、その時のロスが多いように感じます。Excelのメニュー自体のつくりがそういうようになっていますから、私は、そのようなコードは書きません。 >「Auto_Open やThisWorkbook_Openで行うと全てのそのブックの全てのシートに対してオプションが追加されてしまうように思えます。」でした。 それは、誤解だと思います。現行のままでは、どこで登録しようが、メニューを削除しなければどのようにしても全ブック・全シートで現れますし、残ってしまいます。Application のプロパティに命令しているからです。そうすると、そのメニューをクリックすると、そのマクロを登録したブック自体が呼び出されてしまいます。 通常は、メニュー等に、Temporary 属性(下記参照)をTrue にしていれば、実際にアプリが終われば、消えてしまいます。それに、その取り付けたブックの、Auto_Close や ThisWorkbook_BeforeClose にメニューの削除を命じれば、それはブックだけで終わってしまいます。 すべてのブックに対するものは、別の方法です。PERSONAL.XLS のThisWorkbook_Open 等に取り付けます。 もし、そのブックのみにしか現れないというなら、ActiveWorkBookを、ThisWorkbook を切り替える際のイベント(Activate とDeactivate)によって、Visible のTrue/False は書き加えます。Excelの既存のコマンドでも、例えば、行や列の削除メニューがそういう作り方になっています。 なお、私は、Reset メソッドを使わないのは、二種類の右クリックメニューを使っています。片方は、単独のブックのみしか使わないメニューで、もうひとつは、ブック全体に用いるものです。そうすると、ブック全体の方のメニューは、Reset で削除してはまずいからです。 ブック全体に用いるものでも、Temporary:=True で、ユーザー設定をすれば、マクロ自体で設定されなければ、次には消えてしまいます。   On Error Resume Next   '二重登録を防ぐ(強制終了した場合でも、最初に削除してから登録する)   Application.CommandBars("Cell").Controls("ReadOnlyで開く").Delete   On Error GoTo 0   With Application.CommandBars("CELL").Controls.Add _     (Type:=msoControlButton, Temporary:=True) '*     .BeginGroup = True     .Caption = "ReadOnlyで開く"     .FaceId = 59     .OnAction = "Selection_File_Open"   End With

believe_me
質問者

お礼

すいません。もう一つVBAの記述がありましたが、説明から漏れておりました。 Private Sub Worksheet_Deactivate()   Application.CommandBars("Cell").Reset End Sub これにより、他のシートに移動した場合、右クリックオプションが出ないようになっております。 CommandBars("Cell")に対する指定はこのVBAだけで、他のブックでは行っていないのでResetで問題なかったと思います。 現在は問題なく稼動していますが、Resetではなく個々のコントロールに対してDeleteした方がいいようですね。 問題のPCでは、このブックでエラーが発生した為、このリセットが働かなかったものと思われます。 Wendy02殿にはいつも適切な回答をいただいて非常に感謝しております。 歯に着せぬ鋭いご指摘に関心することはあっても、逆恨みするなど考えたこともありません。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >Excel2003で作ったマクロを2000で実行したところこの命令でエラーになってしまいました。恐らく参照設定の問題だと思いますが、どの参照が問題なのでしょうか? もし、参照設定の問題なら、参照設定の部分に、×が出ているかもしれません。それを解消すればなおるかもしれません。上位から下位のバージョンに対しては、マッチングが良くありません。VBA関数ですから、その部分自体は、Excel 2000 でも、2003 でも同じです。 >Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) >  Application.CommandBars("Cell").Reset >  With Application.CommandBars("Cell").Controls.Add 間違いではないですが、コード自体に無理がありませんか? このコードはヘンです。こういう設定の入れだしを繰り返すのはよくありません。誤動作の原因になります。 右クリックしてメニューを出すから、右クリックイベントに入れるなんて、ありえないです。 設定は、Auto_Open や ThisWorkbook_Open などに入れます。 そして、Auto_Close や ThisWorkbook_BeforeClose に With Application.CommandBars("CELL")   On Error Resume Next   .Controls("ReadOnlyで開く").Delete   On Error GoTo 0 End With On Error Resume Next と入れます。

believe_me
質問者

お礼

回答ありがとうございます。 ご指摘の点ですが、ブックの全シートではなく、特定のシートを開いている時のみ右クリックオプションが必要になります。 何をやっているかと言うと、セルにエクセルのフルパスが埋められています。そのセルをポイントして右クリックさせて、ReadOnlyで開く、ReadWriteで開く、そのフォルダを開く、File削除を選べるようにしています。 当職場では大半の文書がエクセルファイルです。 ショートカットでは画面がアイコンだらけになってしまいます。 サーバー上のエクセル文書を開いた状態でプルダウンメニューで追加支持を行うと、開いている文書のフルパスがこの管理シートに追加される仕組みにしています。 現在1000件近く登録しています。(毎日増え続けます) 話が少しそれてしまいましたが、Auto_Close やThisWorkbook_BeforeCloseで行うと全てのそのブックの全てのシートに対してオプションが追加されてしまうように思えます。 このブックは文書管理だけでなく、業務に必要な他の機能も合わせて持っているので他のシートではオプション表示させたくありません。 Private Sub Worksheet_BeforeRightClickの指定でかなり長期間私のPCで稼動させていましたが、特に問題はありませんでした。 尚、コントロールを削除するVBA、ありがとうございます。 明日出社したら早速使ってみたいと思います。

believe_me
質問者

補足

すいません。間違えました。 「Auto_Close やThisWorkbook_BeforeCloseで行うと全てのそのブックの全てのシートに対してオプションが追加されてしまうように思えます。」ではなく 「Auto_Open やThisWorkbook_Openで行うと全てのそのブックの全てのシートに対してオプションが追加されてしまうように思えます。」でした。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

次を実行したらどうなる? sub test() Application.CommandBars("Cell").Reset end sub 右クリックでオプション選択が出なくなるのでは?

believe_me
質問者

お礼

回答ありがとうございます。 トライしてみます。

believe_me
質問者

補足

すいません。もう一つVBAの記述がありましたが、説明から漏れておりました。 Private Sub Worksheet_Deactivate()   Application.CommandBars("Cell").Reset End Sub このVBAはネットで検索したものをそのまま使っておりました。 自分で考えたVBAでなかったので、この記述があることを忘れておりました。 問題のPCでは、このブックでエラーになった為、このVBAが働かなかったと思われます。 コントロールをリセットするだけのブックを作って強制的にオプションを削除するようにいたします。

関連するQ&A