アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excelについて教えて頂きたいことがあります。
シート名でマクロを組んでいるので、誤ってシートを消されてしまうとエラーになってしまいます。

但し、外部データ取り込む為に、一時的にシートを挿入し、既存のシートにデータを転記し終わったら挿入したシートを削除するという機能が必要であるため、ブックの保護が出来ません。
ブックの保護をして、上記部データ取り込みのマクロを実行したらやはりエラーになってしまいました。

ブックの保護ではなく、特定のシートのみ削除を禁止する方法をご存知の方がいらっしゃれば教えて頂けませんか?
または、上記外部データ取り込み用のシートのみ挿入、削除を認めるという方法でも結構です。

“外部データ取り込み用のシートの挿入→削除”操作以外は、既存のシート構成を保護したいのですが、どうすれ良いか分からず困っています。
ご教授下さい。

A 回答 (3件)

>ブックの保護をして、上記部データ取り込みのマクロを実行したらやはりエラーになってしまいました。



ブックの保護を解除しなければ当然そうなりますよね。

で、以下のようにすれば?

Sub test()

'ブックの保護解除
  ActiveWorkbook.Unprotect password:="1234"

    テンポラリーシートの追加
    データインポート
    テンポラリーシートを使っての処理
    テンポラリーシートの削除

'ブックの保護
  ActiveWorkbook.Protect password:="1234", Structure:=True, Windows:=False

End Sub


でどうでしょうか?
勘違いでしたらご容赦願います。
 
 
    • good
    • 1
この回答へのお礼

お礼が遅くなく申し訳ありません。
なるほど、ブックの保護解除とブックの保護の中に一連の操作を挟めが良いわけですよね。
確かにこの方法により、やっと思い通りのものが完成しました。
但し、よくよく自分の作ったマクロを眺めて見ると、マクロの記録に近いものがあり、まだまだという感じです。
でも、ボタンを押して今まで多大な時間を要していた操作が一瞬にして展開するのを見ると気持ちの良いものですね。
もっと勉強したいと思います。
本当にどうもありがとうございました。

お礼日時:2007/08/28 09:08

#01です。

クラスモジュールで実現する方も書いてみました。

VBE画面で標準モジュールとクラスモジュールを挿入し、まずクラスモジュール(Class1:名前変更不可)に以下を貼り付けます。次にSub myCbar_click()に削除してはいけないシート名を書き換えます(サンプルの"Sheet1,Sheet2,Sheet3"の部分)

Public WithEvents myCbar As Office.CommandBarButton

Public Property Set opt(setOpt As CommandBarButton)
 Set myCbar = setOpt
End Property

Public Property Get opt() As CommandBarButton
End Property

Private Sub myCbar_click(ByVal Ctrl As Office.CommandBarButton, canceldefault As Boolean)
Dim ShName() As String
Dim idx As Integer
 ShName = Split("Sheet1,Sheet2,Sheet3", ",") '削除不可のシート名を記入する
 For idx = 0 To UBound(ShName)
  If ActiveSheet.Name = ShName(idx) Then
   MsgBox "このシートは削除できません"
   canceldefault = True 
   Exit For
  End If
 Next idx
End Sub

次に標準モジュールには以下のVBAを貼り付けます。

Dim myCbarCls As New Class1
Sub InitializeCbarEvents()
Set myCbarCls.myCbar = Application.CommandBars("Ply").Controls("削除(&D)")
End Sub

シート画面に戻りInitializeCbarEvents()を1回実行し、Sheet1、Sheet2、SHeet3のいずれかを「シート名右クリック」→「削除」しようとすると、エラーメッセージが表示されて削除できなくなります。

InitializeCbarEventsは Workbook_OpenからCallしておけば、ブックを開くたびに実行されますので、手動で実行する必要がなくなります。
    • good
    • 1

姑息的ですが「シート名タブ右クリック→削除」を選択できなくするのは以下の文で可能です。

この操作は禁止しておいて、外部取り込みシートの削除はマクロで行ってはいかがでしょうか。(マクロでなら削除できます)

 Application.CommandBars("Ply").Controls(3).Enabled = False

ただしWorkbooks_BeforeClose()で .Enabled = True に戻す必要があります。

本格的に対応するならクラスモジュールが必要になると思います。
    • good
    • 1

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

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


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