• 締切済み

VBAでセルに入力制限(指定)できますか?

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

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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のシートプロテクトをすれば、良いと思います。 ただ、名前ではなく、個々のパスワードにしたら、もっと強力です。

syoi198985
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

(1)セルに入力規則を設置することをVBAでやればどうですか。 ここにはマクロの記録で判りますので記しません。 (2)シートのChangeイベントで、セル(Target)のRow,ColumnでA3を特定・制限し、そのValueが佐藤かどうかきく、手もあります。

  • keikan
  • ベストアンサー率42% (75/176)
回答No.1

可能です。 まず、変更するシートに対して Sub Worksheet_Change(ByVal Target As Range) イベントに対するコードを書きます。 これはシート内のセルが変更されると起動されます。 この中でTarget(セルの番号等)が変更されたRangeオブジェクトが帰ってきますので Target.Row と Target.Column で変更された場所が指定の場所か確認します。 で、指定の場所であれば Target.Valueで内容を確認し、内容に対応したコードを書けばよいと思います。

関連するQ&A