【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

Excelのシートに、管理・スケジュール・リストというシートが3つほどあったとします。
その中で管理・リストというシートの削除・移動・名前変更等を行おうとした際に、警告メッセージを表示し、許可しないように制御をかけるにはどのようにマクロを組めばよいのでしょうか?
(シートの保護を使わずに、VBAで実現したい。ただしシート内は自由に編集ができる。)
そのブックExcelファイルを開いた時に有効になるので
VBAProject>Microsoft Excel Objects>ThisWorkBookにて、
Private Sub Workbook_Open() ・・・と続くと思いますが、実現できるコードをご教授のほどお願いいたします。

A 回答 (6件)

#If VBA7 Then


この #IF ディレクティブは、Excel 2007 以降ではなく、Excel 2010 からでした。

条件付きコンパイラ定数を探してみましたが、ありませんので、
#VER =12
#IF VER =12 OR VBA7 Then

とするくらいしか、今のところ思い浮かびません。
    • good
    • 0

これは、まとめです。


ご質問者さんが、反応していないので、これも自分用の記録のひとつとさせていただきます。

まず、旧バージョンの処理の仕方(Excel2003)までは、(*.xls)
'//標準モジュール

'Option Explicit
Public myClass() As Class1
Sub Auto_Open()
If Val(Application.Version) < 12 Then
  Call ClassSetting
Else
  Call DisabledCommands
End If
End Sub

Private Sub ClassSetting()
    Static myClass() As Class1
    Dim num As Variant
    Dim i As Long
    Dim CmdBtn As CommandBarButton
    Dim cID As Variant
    cID = Array(847, 848, 889)
    ReDim myClass(2)
    'SheetDelete, SheetMoveOrCopy, SheetResume
    For i = 0 To UBound(cID)
     Set myClass(i) = New Class1
     Set CmdBtn = Application.CommandBars.FindControl(, cID(i))
     CmdBtn.Enabled = True
     Set myClass(i).Btn = CmdBtn
    Next i
End Sub
'//Class モジュール(Class1)

Private WithEvents myBtn As CommandBarButton
Public Property Set Btn(ByVal Btn As CommandBarButton)
    Set myBtn = Btn
End Property
Private Sub myBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   MsgBox "そのコマンドは禁じられています。", vbCritical
   CancelDefault = True
End Sub

------
''Excel2007以降(.xlsx, xlsm で作成後は、xlsbでも稼働します。)

#If VBA7 Then
'Callback for customUI.onLoad
Sub Ribbon_Load(ribbon As IRibbonUI)
  MsgBox "リボンカスタマイザー(Ribbon Editor)によって加工されています。"
End Sub

'除外するのは、If ActiveSheet.Name にしている
'Callback for SheetMoveOrCopy onAction
Sub CustomMoveOrCopy(Control As IRibbonControl, ByRef CancelDefault)
   If ActiveSheet.Name = "Sheet3" Then CancelDefault = False: Exit Sub
    MsgBox "シートの移動やコピーはできません。", vbCritical
End Sub

'Callback for SheetRename onAction
Sub CustomSheetRename(Control As IRibbonControl, ByRef CancelDefault)
   If ActiveSheet.Name = "Sheet3" Then CancelDefault = False: Exit Sub
   MsgBox "シートの名前の変更はできません。", vbCritical
End Sub

'Callback for SheetDelete onAction
Sub CustomSheetDelete(Control As IRibbonControl, ByRef CancelDefault)
  If ActiveSheet.Name = "Sheet3" Then CancelDefault = False: Exit Sub
   MsgBox "シートの削除はできません。", vbCritical
End Sub
#End If
'---------

コードとしては、書いていない部分もありますから、これを読んだ方が研究してください。このコードの重大な欠点があります。それは、試してみることで分かるでしょう。私としての課題です。当分は解決しそうにありません。もちろん、マクロなしという話は別です。
「Excelの特定のシートのみ削除・移動・」の回答画像5
    • good
    • 0

#3の追加情報



CustomUI.xml については、名前空間が、2007では、CustomUI.xml で、
2010/2013/2016 は、CustomUI14.xml になっていますから、共有できます。

中身をみても、

CustomUI.xml
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/cust …

CustomUI14.xml
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/cust …

という違いが分かるはずです。

したがって、Office 2010 Custom UI Part は
本来は、"Office 2010-2016 Custom UI Part" と解釈してよいようです。

参考文献:
http://fnya.cocolog-nifty.com/blog/2014/03/offic …
http://www.rondebruin.nl/win/s2/win001.htm

なお、#3の物理行9 行目の
「なぜかというと、Office Ribbon Cutomizer 」は、正しくは、
「なぜかというと、Office Ribbon Customizer 」
のタイプミスでした。
    • good
    • 0

「シートの保護を使わず」って、それはワークシートの構成だから、「ウィンドウの保護でしょう」。

それをなぜしないで、という理由が分かりませんが、なんとかやってみました。私にも未知の領域で、昨日からずっと試行錯誤してしまいました。

ただ、以下の内容に「食いついていける」でしょうか。なかなかハードだと思います。

もちろん、Excel 2003以前なら、Class でインスタンスを設ければよいので、それをすればよいのですが、今のところ、Excel 2007と2010に限りますが、基本的には同じだと思います。(Excel 2013以降はまだ分かりません)

最初は、かなり準備が必要です。
なぜかというと、Office Ribbon Cutomizer は、ことごとく、オリジナル・ダウンローダーが不明になっている点で、そのツールが安全に確保できるところからの出発でした。私自身の持っているものも最新ではない可能性をチェックする必要もありました。

Microsoft から、
Office Fluent User Interface Control Identifiers を必要分集めてください。
2010用
http://www.microsoft.com/en-us/download/details. …
2007用
http://www.microsoft.com/en-us/download/details. …

Interface 用の該当する名称を調べなくてはなりません。
ここでは、
Sheet Tab の Context Menu の CellMenuの部分で、一例として、
ひとつピックアップすると、"SheetMoveOrCopy" とします。

次に、Office Ribbon Editor 最新で、4.42 ですが、これでももう古いようです。
開発者は、Leaf Creations というところですが、どうやら潰れてしまったようで、本来は、VSTOに委ねたいところですが、どうもなかなか値段のするものなので代用としてやむを得ません。他にも、Editor はあるのですが、今回は、これが一番よいようです。

http://www.saka-en.com/office/office-ribbon-edit …
ここで手に入ります。

インストールして、ファイル-Openで、ブックを選び、右側のDocument Explorerから、CustomUI Partsを選び、Add CustomUI で、仮に2010を選びました。
後は、

Code側に、このようなコードを貼り付けて、

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/cust … onLoad="Ribbon_Load">
<commands>
<command idMso="SheetMoveOrCopy" onAction="CustomMoveOrCopy" />
</commands>
</customUI>

Window 内の右から2番めのアイコンの[ Generate VBA CallBacks ] で、Call Backs を生成したら、コピーを取っておき、目的のブックの標準モジュールに貼り付けます。
'//標準モジュール
''Callback for customUI.onLoad
Sub Ribbon_Load(ribbon As IRibbonUI)
'----ここに内容を書く-----
End Sub

'Callback for SheetMoveOrCopy onAction
Sub CustomMoveOrCopy(control As IRibbonControl, ByRef cancelDefault)
'----ここに内容を書く-----
End Sub

このようにして作れば、可能になります。

ここが参考になりました。同じような質問です。私は、この質問者さんよりは知識はあったものの分からないままだったのです。

https://social.msdn.microsoft.com/Forums/vstudio …

ここも参考にしました。
http://www.saka-en.com/office/excel-ribbon-hide- …
-----------
画像は、Office Ribbon Editor ver 4.42
「Excelの特定のシートのみ削除・移動・」の回答画像3
    • good
    • 0

VBAじゃなければブックの保護でできますけどね…


あ、新しいシートとかは入れられませんが。
    • good
    • 0

非表示にしては?

    • good
    • 1

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