プロが教えるわが家の防犯対策術!

お世話になります。
VBA を使用してexcel起動時に 右クリックメニューの行削除や列削除を無効して、下記VBAを作成しました。
しかしながら、起動時(実行時)に
「実行時エラー 5 プロシージャの呼び出し、または引数が不正です。」が出ることがあります。
でないときもあるのですが、

デバック時にとまるところは、毎回変わり(1)~(5)のどれかで止まります。
使用したい環境はexcel2007,excel2003で正常に動くようにしたいのですが、何卒よろしくお願いします。

*************ソース*********************
Private Sub Workbook_Open()
InsertEnabled False
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
InsertEnabled True
End Sub

Private Sub InsertEnabled(flg As Boolean)
With Application
(1) Application.CommandBars("Worksheet Menu Bar").Controls("挿入(&I)").Enabled = flg
(2) Application.CommandBars("Cell").Controls("挿入(&I)...").Enabled = flg
(3)Application.CommandBars("Cell").Controls("削除(&D)...").Enabled = flg
(4)Application.CommandBars("Row").Controls("挿入(&I)").Enabled = flg

(5)Application.CommandBars("Row").Controls("削除(&D)").Enabled = flg

.CommandBars.FindControl(, 296).Enabled = flg
.CommandBars.FindControl(, 293).Enabled = flg

End With
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (3件)

とりあえず、私の環境(2003)では


Application.CommandBars("Row")のコントロールに
挿入はありませんでした・・・
削除(&D)も削除(&D)...となっていましたし。

そこで、ちょっと無駄の多い処理になるかもしれませんがこうしてみては?

Private Sub Workbook_Open()
InsertEnabled False
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
InsertEnabled True
End Sub

Private Sub InsertEnabled(flg As Boolean)
Call ControlEnabled(flg, "Worksheet Menu Bar")
Call ControlEnabled(flg, "Cell")
Call ControlEnabled(flg, "Row")

With Application.CommandBars
.FindControl(, 296).Enabled = flg
.FindControl(, 293).Enabled = flg
End With
End Sub

Private Sub ControlEnabled(flg As Boolean, BarName As String)

Dim i As Integer
'指定コマンドバーのコントロールの数だけループし、挿入もしくは削除から
'始まるコントロールを有効/無効化する
With Application.CommandBars(BarName)
For i = 1 To .Controls.Count
If .Controls(i).Caption Like "挿入*" Or .Controls(i).Caption Like "削除*" Then
.Controls(i).Enabled = flg
End If
Next i
End With
    • good
    • 0

こんにちは


#1です。ごめんなさい。見当違いのメッセージでした。無視して下さいm(__;m
    • good
    • 0

こんにちは


エラーストップしたときに I とか D の内容をウォッチ式で確認して下さい。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

今回は下記(5)でエラーしました。調べると
(5)Application.CommandBars("Row").Controls("削除(&D)").Enabled
=<プロシージャの呼び出し、または引数が不正です。>
と出ます。

何卒よろしくお願いします。

お礼日時:2009/04/17 14:04

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル VBA で行の右クリックメニューから行の挿入削除を無効にしたい

お世話になります。

右クリックメニューの行の挿入と削除を無効にしたいのですが、
セルを選択して、右クリックメニューの挿入・削除は

Private Sub Workbook_Open()
Dim mymenubar1 As CommandBar
Set mymenubar1 = Application.CommandBars("Cell")
mymenubar1.Controls("挿入(&I)").Enabled = False
End Sub

で無効にできたのですが、
行を選択→右クリックメニューの挿入削除の無効化の仕方がわかりません。
※セルに対してではなく、行に対して行いたいのです。

ご教授頂ければと幸いですのでよろしくお願いします。

Aベストアンサー

#1 の回答者です。読み落としましたので、書き加えました。
ただ、再度書きますが、Excel 2003以上には不要です。
また、これは、クラスインスタンスに設けることも多いです。
これは、右クリックメニュー(Cell)だけでなく、メニューの中も含めます。

サブルーチンを入れ替えてください。

Private Sub InsertEnabled(flg As Boolean)
With Application
 .CommandBars.FindControl(, 296).Enabled = flg
 .CommandBars.FindControl(, 293).Enabled = flg
 .CommandBars("Worksheet Menu Bar").FindControl(, 30003). _
        Controls("削除(&D)...").Enabled = flg
 .CommandBars("Row").FindControl(, 3183).Enabled = flg
 .CommandBars("Cell").FindControl(, 3181).Enabled = flg
End With
End Sub


本来は、2バイト文字を使いたくはないのですが、どうしてもできない部分があります。

#1 の回答者です。読み落としましたので、書き加えました。
ただ、再度書きますが、Excel 2003以上には不要です。
また、これは、クラスインスタンスに設けることも多いです。
これは、右クリックメニュー(Cell)だけでなく、メニューの中も含めます。

サブルーチンを入れ替えてください。

Private Sub InsertEnabled(flg As Boolean)
With Application
 .CommandBars.FindControl(, 296).Enabled = flg
 .CommandBars.FindControl(, 293).Enabled = flg
 .CommandBars("Worksheet Menu Bar").Fin...続きを読む

Qエクセルでセルの挿入・削除を禁止し、他のセルの列や行がずれないようにし

エクセルでセルの挿入・削除を禁止し、他のセルの列や行がずれないようにしたい。

■共有データのリスト更新時に、誰かの仕業で列や行の内容が途中からズレて困っています。その為原因となりそうなセルの挿入や削除を規制し、他のセルが上下左右にズレるのを防ぎたいのです。
なおリスト更新時に個々のセルの記載内容は変更出来る必要があります。

シートの保護を応用すれば出来そうな気がしますが、、 具体的な方法を教えてください。
ちなみに皆さんはこんな経験ないですか

Aベストアンサー

できますよ。
ただし、単純に保護するだけでなく、まずはロックを解除しないとだめですよね。

こちらに同じ例が載っています。

Excel:入力は許可するが行列の挿入・削除は禁止したい
http://office-qa.com/Excel/ex114.htm

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QRange("A1")⇔cells(1,1)の変換。

EXCELのマクロについて質問します。
Range("A1")⇒(1,1)
cells(1,1)⇒("A1")
に一発変換する方法を教えて下さい。
時間があるかた宜しくお願いします。

Aベストアンサー

こんなのでよろしいでしょうか?
range("A1") → Range("A1").Row & "," & Range("A1").Column
cells(1,1) → Cells(1, 1).Address(False, False)
()や""は付けていません

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBA:シートの右クリックメニューへの追加方法

(1)EXCEL VBAで、シートの右クリックメニューへの追加方法が下記の通り、ある本に載っていたので試してみましたが、うまく動作しません。
どこが間違っているか教えて下さい。
 Sub シートの右クリックメニュー追加()
 With CommandBars("Ply").Controls.Add
 .Caption = "AAA(メニューの表示文字)"
 .OnAction = "BBB(実行するマクロ名)"
 .BeginGroup = True
 End With
 End Sub
(2)上記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、右クリックメニューで動作させたいのですが、やり方を教えて下さい。
宜しく、お願いします。

Aベストアンサー

>シートの右クリックメニューへの追加方法が下記の通り
>With CommandBars("Ply").Controls.Add
セルを右クリックをした時に表示されるショートカットメニューを操作するにはCommandBars("Cell")です。
CommandBars("Ply")は、シート見出しを右クリックした時に表示されるショートカットメニューです。

QEXCEL VBAアドイン:シートの右クリックメニューへの追加方法その2

下記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、自動的に右クリックメニューに組み込んでBBBマクロを動作させたいのですが、やり方を教えて下さい。
PERSONAL.XLSのThisWorkbookにAddinstallイベントプロシージャーで下記のように記述しましたがエラーが出ます。
どのように修正すれば良いか、教えて下さい。
また、やり方はこれでOKでしょうか。
なお、標準モジュールに登録して実行すると動きます。
宜しく、お願いします。

「エラー内容」
実行時エラー’91’
オブジェクト変数またはWithプロック変数が設定されていません。

Sub シートの右クリックメニュー追加()
 With CommandBars("Cell").Controls.Add
 .Caption = "AAA(メニューの表示文字)"
 .OnAction = "BBB(実行するマクロ名)"
 .BeginGroup = True
 End With
End Sub

Aベストアンサー

>PERSONAL.XLSのThisWorkbookにAddinstallイベントプロシージャーで下記のように記述しましたが
PERSONAL.XLSに記述するのではなく新たに新規ブックで作成します。
'ThisWorkbookモジュールに
Private Sub Workbook_Open()
  With Application.CommandBars("Cell").Controls.Add(Temporary:=True)
    .Caption = "AAA"
    .OnAction = "BBB"
    .BeginGroup = True
  End With
End Sub
'標準モジュールに
Sub BBB()
  '○×△・・・
End Sub
このブックをアドインファイルとして保存する
メニューから[ファイル]-[名前を付けて保存]-[ファイルの種類]-Microsoft Excel アドイン(*.xla)を選択しファイル名を入力して保存
つぎに作成したアドインを使えるようにします。
メニューから[ツール]-[アドイン]-で使えるアドインの一覧が出ますので先ほど保存したアドインにチェックを入れて[OK]
これで使えるはずです。

>PERSONAL.XLSのThisWorkbookにAddinstallイベントプロシージャーで下記のように記述しましたが
PERSONAL.XLSに記述するのではなく新たに新規ブックで作成します。
'ThisWorkbookモジュールに
Private Sub Workbook_Open()
  With Application.CommandBars("Cell").Controls.Add(Temporary:=True)
    .Caption = "AAA"
    .OnAction = "BBB"
    .BeginGroup = True
  End With
End Sub
'標準モジュールに
Sub BBB()
  '○×△・・・
End Sub
このブックをアドインファイルとして...続きを読む

QExcel マクロ ファイルオープン時 自動実行 

いつもありがとうございます。初心者につき、わかりにくい文章かもしれませんが、宜しくお願い致します。

Excel2003で改ページを自動で行うマクロをこちらの過去の質問を参考にしながら作成しました。
勤め先の同僚にも配布しようと思い、どうせならマクロ実行が簡単なようにと、ユーザー定義のツールバー作成のマクロも作成。ここまでは無事に出来たのでが・・・
さらにファイルを開いた時に自動でツールバーが作成マクロを実行するように Sub Auto_Open()を用いて無事に成功、しかし一旦終了して再度このファイルを開くと

実行時エラー ’5’:
プロシージャの呼び出し、または引数が不正です。

というエラーが出てしまいます。一回目に開いた時にSub Auto_Open()によって作成したツールバー作成のマクロを再度実行しようとするのが原因だと思うのですが、これを回避する方法があるのでしょうか?

ちなみにエラーのダイヤログの終了ボタンを押せば、他のマクロは問題なく作動しますし、
本来の目的は別ファイルの改ページを、自動に行うためのマクロの実行をツールバーにて簡単に行うためのもので、このエラーが出たからといって何ら支障は無く、他のファイルからこの改ページのマクロを実行してもエラーは出ず、本来の目的は達成しおり問題は無いのですが、気分的にスッキリしません。何卒宜しくお願い致します。

下記をご参照ください。(実際は改頁マクロは複数あり)

Sub A改ページ()
Dim PB As HPageBreak
Dim idx As Long
Const tCol As String = "A" '改頁判断する列
With ActiveSheet
For idx = 3 To .Cells(65536, tCol).End(xlUp).Row
If .Cells(idx, tCol) <> .Cells(idx - 1, tCol) Then
ActiveSheet.HPageBreaks.Add Before:=.Cells(idx, tCol)
End If
Next idx
End With
End Sub

Sub ツールバー作成()
Dim myBar As CommandBar, myButton As CommandBarButton
Set myBar = CommandBars.Add
myBar.Name = "改頁マクロ"
Set myButton = myBar.Controls.Add
myButton.OnAction = "A改ページ"
myButton.FaceId = 80
myBar.Visible = True
End Sub

Sub Auto_Open()
ツールバー作成
End Sub

いつもありがとうございます。初心者につき、わかりにくい文章かもしれませんが、宜しくお願い致します。

Excel2003で改ページを自動で行うマクロをこちらの過去の質問を参考にしながら作成しました。
勤め先の同僚にも配布しようと思い、どうせならマクロ実行が簡単なようにと、ユーザー定義のツールバー作成のマクロも作成。ここまでは無事に出来たのでが・・・
さらにファイルを開いた時に自動でツールバーが作成マクロを実行するように Sub Auto_Open()を用いて無事に成功、しかし一旦終了して再度このファ...続きを読む

Aベストアンサー

Auto_Openイベントにツールバーを消すマクロも入れておけば問題ないかと。

Sub Auto_Open()
On Error Resume Next
Application.CommandBars("改頁マクロ").Delete
On Error GoTo 0
ツールバー作成
End Sub

Q【VBA】特定シート 名前編集・削除を禁止したい

いつも大変お世話になっております。
Excel2003を使用しております。

今回VBAでやりたいことは、
特定シートの名前編集・削除を禁止したいのです。

シート名 「データ」
シート名 「一覧」

この二つを名前編集・削除禁止にしたいと思っております。
保護する方法も考えたのですが、
現在様々なプログラムでシートを利用しており、
保護をかけると色んなフォーム上で保護解除をしないといけません。
データの参照・編集が出来ないと困るのです。

保護をかける
以外で何か、方法はありますでしょうか?

以上、
回答よろしくお願い致します。

Aベストアンサー

こんにちは。

何年ぶりかで、このようなマクロを書いてみました。

普通は、ブックの保護のシート構成の保護だけで、良いはすですが、以下のようなマクロが可能かと思います。ただし、上位バージョン(2010)では、稼働しませんでした。また、2003では、現在、完全には試しておりません。たぶん、ご質問者さんでしたら、コードに間違いがあっても、修正できますでしょうから、今はヒントということだけにしてください。

また、本来は、FindControlsのID、847, 889が該当するのですが、バージョン2003ですと、Control配列になってしまいますので、その中を選択するという方法は、ちょっと手間が多すぎます。

'//ThisWorkbookに登録

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 If Sh.Name = "データ" Or Sh.Name = "一覧" Then
  With Application.CommandBars("Ply")
   .Controls("削除&(D)").Enabled = False '削除
   .Controls("名前の変更&(R)").Enabled = False '名前の変更
  End With
 End If
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
'戻し
 If Sh.Name = "データ" Or Sh.Name = "一覧" Then
  With Application.CommandBars("Ply")
   .Controls("削除&(D)").Enabled = True
   .Controls("名前の変更&(R)").Enabled = True
  End With
 End If
End Sub
'ブックを開いたり閉じたりする場合
Private Sub Workbook_Activate()
 If ActiveSheet.Name = "データ" Or ActiveSheet.Name = "一覧" Then
  With Application.CommandBars("Ply")
   .Controls("削除&(D)").Enabled = False '削除
   .Controls("名前の変更&(R)").Enabled = False '名前の変更
  End With
 End If
End Sub
Private Sub Workbook_Deactivate()
'戻し
 If ActiveSheet.Name = "データ" Or ActiveSheet.Name = "一覧" Then
  With Application.CommandBars("Ply")
   .Controls("削除&(D)").Enabled = True '削除
   .Controls("名前の変更&(R)").Enabled = True '名前の変更
  End With
 End If
End Sub

'//

こんにちは。

何年ぶりかで、このようなマクロを書いてみました。

普通は、ブックの保護のシート構成の保護だけで、良いはすですが、以下のようなマクロが可能かと思います。ただし、上位バージョン(2010)では、稼働しませんでした。また、2003では、現在、完全には試しておりません。たぶん、ご質問者さんでしたら、コードに間違いがあっても、修正できますでしょうから、今はヒントということだけにしてください。

また、本来は、FindControlsのID、847, 889が該当するのですが、バージョン2003ですと、Contr...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング