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

たくさんの人が使うエクセルファイルで例えばA3の所に佐藤と入力してシートが開き、鈴木と入力してシートが開かないようにコードを作成したいのですがそのことは可能でしょうか?

A 回答 (3件)

こんにちは。



他の方の回答で解決すれば、それでよいかとは思います。

用途によりけりですが、プロテクトが必要な場合に、考えてみました。こういうのは、その人のスキルに比例するかもしれませんが、はるかにむつかしいと思います。

私自身でしたら、シートを開いたりする場合は、Change イベントを用いずに、(コントロールツール側の)コマンド・ボタンにします。そのほうが、動作的に確実だからです。

その人専用のシートが開くようにします。シート名を、その人の名前に変更しても、同じように開きます。

シートの問題ですが、シートは、xlSheetVeryHiddenにします。そうしないと、開けられてしまいます。xlSheetVeryHidden 設定は、マクロからしか出来ません。

また、マクロ側も、不用意に、オートメーションオブジェクトや他のブックから オブジェクトブラウザを使われても、覗かれないように、Private Module にします。参照設定されても、名前リストさえも抜き出すことは出来ません。名前リストは、標準モジュールのPrivate モードにした場所に書きます。

------------------------------------------------------
サンプル:
Sheet4 ~ Shee6 を隠しシートとした場合の例

'名前入力用 Sheet1 (常時・表示モジュール)

Private Sub CommandButton1_Click()
 Call CheckNames
End Sub


'標準モジュール
Option Explicit
Option Private Module
'複数ある場合は、「,」で区切り入力する
'名前のリスト
Private Const OurName As String = "佐藤,木村,安藤"
Sub CheckNames()
  Dim ret As Variant
  Dim dummy As Variant
  Dim OurNames As Variant
  Dim ShName As String
  Dim wh As Worksheet
  OurNames = Split(OurName, ",")
  If Sheet1.Range("A3").Value <> "" Then
   On Error GoTo ErrMsg
   dummy = OurNames(0)
   ret = WorksheetFunction.Match(Sheet1.Range("A3").Value, OurNames, 0)
   If ret > 0 Then
     Sheet1.Range("A3").ClearContents

     For Each wh In Worksheets
      'Sheet4 だとすれば、+3 になる
      If wh.CodeName = "Sheet" & CStr(ret + 3) Then
       wh.Visible = xlSheetVisible
       wh.Activate
       ret = 0
       Exit For
      End If
     Next wh
   End If

  Else
   MsgBox "名前が入力されていません。", vbCritical
  End If
  Exit Sub
ErrMsg:
  If Err.Number() Then
   MsgBox "該当名はありません。", vbCritical
   Err.Clear
  End If
End Sub

'ThisWorkbook へ
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim i As Long
Dim num As Variant
 On Error Resume Next
 For i = 1 To Worksheets.Count
  '+5 は、Sheet の次の文字を出す
  num = Mid$(Worksheets(i).CodeName, InStr(Worksheets(i).CodeName, "Sheet") + 5)
  'Sheet4 以上は、非表示
  If CLng(num) > 3 Then
   Worksheets(i).Visible = xlSheetVeryHidden
  End If
 Next i
 
End Sub

Private Sub Workbook_Open()
Dim i As Long
Dim num As Variant
 On Error Resume Next
 For i = 1 To Worksheets.Count
  '+5 は、Sheet の次の文字を出す
  num = Mid$(Worksheets(i).CodeName, InStr(Worksheets(i).CodeName, "Sheet") + 5)
  'Sheet4 以上は、非表示
  If CLng(num) > 3 Then
   Worksheets(i).Visible = xlSheetVeryHidden
  End If
 Next i
End Sub

最後に、
'各Sheet には、ディアクティベートすると、非表示になってしまうようにする。

'Sheet4~Sheet6 までに、イベントによる非表示のプロパティを入れる
Private Sub Worksheet_Deactivate()
 Me.Visible = xlSheetVeryHidden
End Sub

こうしておいて、VBAプロジェクトは、パスワード・ロックします。Sheet は、正常終了している限りは、非表示になります。正常終了した後で、マクロモードを「高」にして、マクロが動かないようにしても、そのシートは開くことができません。本来は、これに、開く前に、シートプロテクトを外し、閉じるときに、UsesrInterfaceOnlyのシートプロテクトをすれば、良いと思います。

ただ、名前ではなく、個々のパスワードにしたら、もっと強力です。
    • good
    • 0
この回答へのお礼

いつも有難うございます。
返事が遅くなりすいません。無事できました。
感動ものです。

お礼日時:2005/11/06 23:33

(1)セルに入力規則を設置することをVBAでやればどうですか。


ここにはマクロの記録で判りますので記しません。
(2)シートのChangeイベントで、セル(Target)のRow,ColumnでA3を特定・制限し、そのValueが佐藤かどうかきく、手もあります。
    • good
    • 0

可能です。



まず、変更するシートに対して
Sub Worksheet_Change(ByVal Target As Range)
イベントに対するコードを書きます。
これはシート内のセルが変更されると起動されます。

この中でTarget(セルの番号等)が変更されたRangeオブジェクトが帰ってきますので
Target.Row と Target.Column で変更された場所が指定の場所か確認します。

で、指定の場所であれば
Target.Valueで内容を確認し、内容に対応したコードを書けばよいと思います。
    • good
    • 0

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