• 締切済み

Excel2003でブックごとにコピー&ペースト不可の制限

過去の記事なども調べ 下記でアプリケーション単位での設定はわかりました。 しかし全ブックに影響がでるのはこまるのでこれをブック単位に設定することはできますでしょうか。 お願いします! ▽ソース Sub Auto_Open() Call DisEnableKeys1 Call DisEnableKeys2 End Sub Sub DisEnableKeys1() Dim eFlg As Boolean eFlg = False 'サブルーチンにしてトグルも可能 With Workbook .CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("貼り付け(&P)").Enabled = eFlg .CommandBars("Cell").FindControl(, 22).Enabled = eFlg If eFlg = False Then .OnKey "^v", "DummyMacro1" Else .OnKey "^v" End If End With End Sub Sub DisEnableKeys2() Dim eFlg As Boolean eFlg = False 'サブルーチンにしてトグルも可能 With Workbook .CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("コピー(&C)").Enabled = eFlg .CommandBars("Cell").FindControl(, 19).Enabled = eFlg If eFlg = False Then .OnKey "^c", "DummyMacro2" Else .OnKey "^c" End If End With End Sub Sub DummyMacro1() MsgBox "貼り付けは禁止されています。", vbInformation End Sub Sub DummyMacro2() MsgBox "コピーは禁止されています。", vbInformation End Sub

みんなの回答

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

こんばんは。 #1の説明だけでは、お分かりにはならなかったのですね。「サブルーチンにしてトグルも可能」と書いていらっしゃるので、分かっているかと思いましたが、以下のようにしたら、どうかということです。 '指定するブックのThisWorkbook モジュール Private Sub Workbook_Activate()   Call DisEnableKeys1(False)   Call DisEnableKeys2(False) End Sub Private Sub Workbook_Deactivate()   Call DisEnableKeys1(True)   Call DisEnableKeys2(True) End Sub Private Sub Workbook_Open()   Call DisEnableKeys1(False)   Call DisEnableKeys2(False) End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean)   Call DisEnableKeys1(True)   Call DisEnableKeys2(True) End Sub '------------------------------------------ '標準モジュール '------------------------------------------ Sub DisEnableKeys1(eflg As Boolean)   With Application     .CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("貼り付け(&P)").Enabled = flg     .CommandBars("Cell").FindControl(, 22).Enabled = eflg     If eflg = False Then       .OnKey "^v", "DummyMacro1"     Else       .OnKey "^v"     End If   End With End Sub Sub DisEnableKeys2(eflg As Boolean)   With Application     .CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("コピー(&C)").Enabled = eflg     .CommandBars("Cell").FindControl(, 19).Enabled = eflg     If eflg = False Then       .OnKey "^c", "DummyMacro2"     Else       .OnKey "^c"     End If   End With End Sub Private Sub DummyMacro1() MsgBox "貼り付けは禁止されています。", vbInformation End Sub Private Sub DummyMacro2() MsgBox "コピーは禁止されています。", vbInformation End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 本来、そのコードは、クラス-インスタンスだったはずですが……。 それは、ともかく、以下のように、ThisWorkbook モジュール上の Activate, Deactiveate イベントで、Call で、設定のオン・オフをしてあげればよいのではありませんか? ただし、コードの中の、[With Workbook] は、[With Application] だとは思いますし、 サブルーチンですから、例えば、 Sub DisEnableKeys1(flg As Boolean) だとは思いますが。

xhiromix
質問者

お礼

指定したいブックに下記を記述 Private Sub Workbook_Activate() Call DisEnableKeys1 Call DisEnableKeys2 End Sub ------------------------------------ 標準モジュールに下記を記述 Sub DisEnableKeys1() Dim eFlg As Boolean eFlg = False 'サブルーチンにしてトグルも可能 With Application .CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("貼り付け(&P)").Enabled = eFlg .CommandBars("Cell").FindControl(, 22).Enabled = eFlg If eFlg = False Then .OnKey "^v", "DummyMacro1" Else .OnKey "^v" End If End With End Sub Sub DisEnableKeys2() Dim eFlg As Boolean eFlg = False 'サブルーチンにしてトグルも可能 With Application .CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("コピー(&C)").Enabled = eFlg .CommandBars("Cell").FindControl(, 19).Enabled = eFlg If eFlg = False Then .OnKey "^c", "DummyMacro2" Else .OnKey "^c" End If End With End Sub Sub DummyMacro1() MsgBox "貼り付けは禁止されています。", vbInformation End Sub Sub DummyMacro2() MsgBox "コピーは禁止されています。", vbInformation End Sub ------------------------------------ してみましたが、やはりエクセルのアプリ全体にかかってしまいます。。。

xhiromix
質問者

補足

お返事ありがとうございます。 確かに元は、[With Workbook]が、[With Application] でした 汗 自分でいじってる間にそのまま保存しちゃってました…。 Activate, Deactiveateとはどのように使えばいいんでしょうか…。 教えてくださいorz サブルーチンは標準モジュールにいれてしまえばいいんですよね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA を使用してexcel起動時に 右クリックメニューの行削除や列削除を無効にしようとするとエラーが出ることがある。

    お世話になります。 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

  • エクセル ルーチンマクロ

    以前コピー・貼り付けを停止させる為に、下記マクロを参照させて頂いたのですが、 '--------------------------------------------------------------- Sub DisableCommandButtons(Cmd_bln As Boolean) 'コピー・貼り付けを停止させるサブルーチン・マクロ  Dim cmd As Variant  Dim Cmdb As Object  Dim CmdNames As Variant  CmdNames = Array("Worksheet Menu Bar", "Cell", "Column", "Row")  'ショートカットのインスタンス  If Cmd_bln = False Then   Application.OnKey "^c", ""   Application.OnKey "^v", ""   Application.OnKey "^x", ""  Else   Application.OnKey "^c"   Application.OnKey "^v"   Application.OnKey "^x"  End If  'コマンドボタンのEnable  For Each cmd In CmdNames  If cmd = "Worksheet Menu Bar" Then   With Application.CommandBars(cmd).Controls(2)    .Controls(3).Enabled = Cmd_bln    .Controls(4).Enabled = Cmd_bln    .Controls(5).Enabled = Cmd_bln   End With  Else   With Application.CommandBars(cmd)    .FindControl(, 19).Enabled = Cmd_bln 'Copy    .FindControl(, 22).Enabled = Cmd_bln 'Paste    .FindControl(, 21).Enabled = Cmd_bln 'Cut   End With  End If  Next cmd End Sub '--------------------------------------------------------------- このマクロを実行した所、コンテキストメニュー及びショートカットキーのコピー、貼付が無効になりました。 EnableCommandButtons というマクロを別に作り ショートカットのインスタンスの  If Cmd_bln = False Then を  If Cmd_bln = True Then に 書き換えて、実行した所、ショートカットキーは有効になったのですが コンテキストメニューのコピー、貼付を有効にするやり方がわかりません。 以前、 同じ質問させていただき、ご回答頂いたのですが、別のPCでは、その方法でもダメなことが分かりました。 OSはXP Pro エクセルはは2003です どなたか、助けていただけないでしょうか? よろしくお願い致します。

  • エクセル ルーチンマクロ

    エクセルにて、コピー貼付を禁止するマクロを、教えてGooの過去のQ&Aから、参照させていただきました。 '--------------------------------------------------------------- Sub DisableCommandButtons(Cmd_bln As Boolean) 'コピー・貼り付けを停止させるサブルーチン・マクロ  Dim cmd As Variant  Dim Cmdb As Object  Dim CmdNames As Variant  CmdNames = Array("Worksheet Menu Bar", "Cell", "Column", "Row")  'ショートカットのインスタンス  If Cmd_bln = False Then   Application.OnKey "^c", ""   Application.OnKey "^v", ""   Application.OnKey "^x", ""  Else   Application.OnKey "^c"   Application.OnKey "^v"   Application.OnKey "^x"  End If  'コマンドボタンのEnable  For Each cmd In CmdNames  If cmd = "Worksheet Menu Bar" Then   With Application.CommandBars(cmd).Controls(2)    .Controls(3).Enabled = Cmd_bln    .Controls(4).Enabled = Cmd_bln    .Controls(5).Enabled = Cmd_bln   End With  Else   With Application.CommandBars(cmd)    .FindControl(, 19).Enabled = Cmd_bln 'Copy    .FindControl(, 22).Enabled = Cmd_bln 'Paste    .FindControl(, 21).Enabled = Cmd_bln 'Cut   End With  End If  Next cmd End Sub '--------------------------------------------------------------- このマクロを実行した所、コンテキストメニュー及びショートカットキーのコピー、貼付が無効になりました。 しかし、マクロを有効にしたエクセルファイルを閉じても、他のエクセルファイルもコピー、貼付が無効になってしまいました。 コピー、貼付を有効にするためのマクロを動かさないとダメなのか?と思い、色々試してみたのですが、うまくいきません。 EnableCommandButtons というマクロを別に作り ショートカットのインスタンスの  If Cmd_bln = False Then を  If Cmd_bln = True Then に 書き換えて、実行した所、ショートカットキーは有効になったのですが コンテキストメニューのコピー、貼付を有効にするやり方がわかりません。 どなたか、助けていただけないでしょうか? よろしくお願い致します。

  • Excel2007互換モードでの右クリックロジック

    100件程度の実績のあるソフトですが、あるお客様のみ不思議な現象が発生しています。 そのお客様はWindowsXP & Excel2007の組み合わせで、ソフトは互換モードで動作しています。 Option Compare Text Option Explicit Sub migi_del() Dim icbc Application.CommandBars("cell").Reset For Each icbc In Application.CommandBars("cell").Controls icbc.Delete Next icbc End Sub Sub migi_add() Dim icbc Application.CommandBars("cell").Reset For Each icbc In Application.CommandBars("cell").Controls icbc.Delete Next icbc With Application.CommandBars("cell").Controls _ .Add(Type:=msoControlButton, Temporary:=True) .Caption = "Message!" .OnAction = "aaa" End With End Sub Sub migi_addTag() Dim icbc Application.CommandBars("cell").Reset For Each icbc In Application.CommandBars("cell").Controls icbc.Delete Next icbc With Application.CommandBars("cell").Controls _ .Add(Type:=msoControlButton, Temporary:=True) .Caption = "Message!" .OnAction = "aaa" .Tag = "aaa" End With End Sub Sub migi_Rest() Dim icbc Application.CommandBars("cell").Reset End Sub Sub aaa() MsgBox "OK" End Sub Sub Sample() Application.CommandBars("Row").Reset Application.CommandBars("Column").Reset End Sub の何れの操作を行っても、右クリックは標準のものが表示されてしまいます。 WindowsXP & Excel2007の組み合わせの他のお客様ではこのような現象は出ていません。 何方か理由をご存知の方はいらっしゃいませんか?

  • VBA 保存方法を教えて下さい

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("×ボタンは使用できません。" & vbCr & _ "よろしいですか?", vbInformation + vbOKOnly) = vbOK Then Cancel = True End If End Sub 上記の様にEXCELワークブックに記述しましたが、 別に設置した「保存終了ボタン」で終了できなくなってしまいました。 Workbook_BeforeClose が邪魔しているようです。 どうすれば解決できるでしょうか? 「保存終了ボタン」に記述しているコードは下記です。 Sub 保存終了() ActiveWorkbook.Save CommandBars("Worksheet Menu Bar").Enabled = True Application.CommandBars("Standard").Visible = True Application.CommandBars("Formatting").Visible = True Application.CommandBars("Drawing").Visible = True With Application .DisplayFormulaBar = True .ShowWindowsInTaskbar = True End With Application.WindowState = xlMaximized Application.Quit MsgBox "終了します" End Sub 宜しくお願いします。

  • エクセル2003で作成したVBAを2007で使用したい

    エクセル2003で下記のようなVBAを作成していました。 作成した物を使用者が印刷設定を変更できないように ブックを開くと同時に印刷ボタンなどを非表示にしていたのですが・・・ 2007でも使用出来るようにしたいと思ったのですが 2007ではこのままではエラーが出てしまうようです。 2007はまったく扱ったことがないのでどのようにすればよいかわかりません。 どなたかご教授いただけたらと思います。 Private Sub Workbook_Open() Application.DisplayStatusBar = False 'ステータスバー非表示 'ブックを開く時ページ設定と印刷を非表示 On Error Resume Next Application.CommandBars("Worksheet Menu Bar").Controls("ファイル(&F)") _ .Controls("ページ設定(&U)...").Enabled = False Application.CommandBars("Worksheet Menu Bar").Controls("ファイル(&F)") _ .Controls("印刷(&P)...").Enabled = False Application.CommandBars("Worksheet Menu Bar").Controls("ファイル(&F)") _ .Controls("印刷プレビュー(&V)").Enabled = False Application.CommandBars("Worksheet Menu Bar").Controls("ファイル(&F)") _ .Controls("印刷範囲(&T)").Enabled = False Application.CommandBars("Standard").Enabled = False End Sub

  • 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

  • エクセルVBA 保護シート&フィルタ実行 全シート

    VBA超初心者です。 たくさんのシートのあるエクセルで、 シート保護後もフィルタを使用できるようにVBAを設定したいと思ってます。 (現在エクセル2000を使用してます) ネットで調べてVBAを設定してみました。 しかし下記のようにするとコンパイルエラーになってしまうのですが、 正しい方法を教えていただけると助かります。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean)   Application.CommandBars("Cell").Reset End Sub Private Sub Workbook_Open()   With Application.CommandBars("Cell").Controls.Add( _            Type:=msoControlButton, Before:=1, Temporary:=True)     .Caption = "AutoFilter"     .OnAction = "ThisWorkbook.filter"   End With   With Worksheets.Select     .Unprotect     .EnableAutoFilter = True     .Protect UserInterfaceOnly:=True   End With End Sub Private Sub filter()   On Error Resume Next   Selection.AutoFilter End Sub

  • Excel 数式バーを非表示にしたい(VBA)

    ツール-オプション-表示-数式バーのチェックを外せば 数式バーを非表示にできますが、VBAでやりたいと思います。 次の様に記述してみましたが、書式バーの「数式バー(F)」のボタンが非表示になるだけで数式バー自体は非表示になりません。 Private Sub Workbook_Open() Application.CommandBars("formatting").Controls(23).Visible = False End Sub 次の様に記述してみても今度は「数式バー(F)」のボタンが操作不可になるだけで数式バー自体は非表示になりません。 Private Sub Workbook_Open() Application.CommandBars("formatting").Controls(23).Enabled = False End Sub 他にも試すのですが、エラーになったりで答えに辿り着けず・・ どなたかヒントだけでもお願いします。

  • VBA コマンドバーを消した後に残る空白部分

    お世話になります。 ExcelVBAで、コマンドバーの類を全て消去した後に残る、 空白部分ができる原因が解りません。 この部分をダブルクリックすると、エラーになって強制終了に なってしまいます。 完全に消してしまいたいのですが、この状況になってしまう、 原因と対策を教えてください。 内容は、『システム』という名のシートにある『ロック』ボタンを 押すと、コマンドバーを全て消去して、Sheet1に切り替わるといった 流れです。 ↓モジュール側 ------------------------------------------------------------- Dim myCB As CommandBar Public Sub onCmdBarAttr() DoEvents With Application For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB .CommandBars("Standard").Visible = True .CommandBars("Formatting").Visible = True .CommandBars("Visual Basic").Visible = True .CommandBars("Worksheet Menu Bar").Enabled = True .CommandBars("CELL").Enabled = True ' タスクバーに表示させる .ShowWindowsInTaskbar = True ' 数式バーを表示 .DisplayFormulaBar = True ' ステータスバーを表示 .DisplayStatusBar = True End With End Sub Public Sub offCmdBarAttr() Dim myCB As CommandBar On Error Resume Next For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB On Error GoTo 0 With Application .CommandBars("Worksheet Menu Bar").Enabled = False .CommandBars("CELL").Enabled = False ' 数式バーを消去 .DisplayFormulaBar = False ' ステータスバーを消去 .DisplayStatusBar = False ' タスクバーに表示させない .ShowWindowsInTaskbar = False End With End Sub ' シートロック Public Sub protectSheet(ByVal stSheetName As String) Application.ScreenUpdating = False ' 一旦シート保護をかけ直す With Worksheets(stSheetName) .Activate .Unprotect .Protect UserInterfaceOnly:=True ' カーソルの移動範囲を設定する .ScrollArea = "$A$1" ' 左上セルを選択 .Range("H16").Select ' 保護されたセルは選択不可にする .EnableSelection = xlNoRestrictions End With Application.ScreenUpdating = True End Sub ' シートロック解除 Public Sub unprotectSheet(ByVal stSheetName As String) ' 一旦シート保護をかけ直す With Worksheets(stSheetName) .Unprotect ' スクロール範囲を解除する .ScrollArea = "" ' 保護されたセルでも選択可能にする .EnableSelection = xlUnlockedCells End With End Sub Public Sub setBookAttribute(ByVal bFlg As Boolean) With Windows(ThisWorkbook.Name) ' タブを設定 .DisplayWorkbookTabs = bFlg ' スクロールバーを設定 .DisplayHorizontalScrollBar = bFlg .DisplayVerticalScrollBar = bFlg ' グリッドを設定 .DisplayGridlines = bFlg ' 行列数表示を設定 .DisplayHeadings = bFlg End With End Sub ↓シート側 ------------------------------------------------------ Private Sub btnProtect_Click() ' アプリケーション全体の処理 Call Module1.offCmdBarAttr ' シート単位の処理 Call Module1.protectSheet("Sheet1") ' ブック単位の処理 Call setBookAttribute(False) Worksheets("Sheet1").Activate End Sub Private Sub btnUnprotect_Click() Call Module1.onCmdBarAttr Call Module1.unprotectSheet("Sheet1") Call setBookAttribute(True) End Sub 以上、よろしくお願いいたします。

専門家に質問してみよう