- 締切済み
VBAでセルに入力制限(指定)できますか?
たくさんの人が使うエクセルファイルで例えばA3の所に佐藤と入力してシートが開き、鈴木と入力してシートが開かないようにコードを作成したいのですがそのことは可能でしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 他の方の回答で解決すれば、それでよいかとは思います。 用途によりけりですが、プロテクトが必要な場合に、考えてみました。こういうのは、その人のスキルに比例するかもしれませんが、はるかにむつかしいと思います。 私自身でしたら、シートを開いたりする場合は、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のシートプロテクトをすれば、良いと思います。 ただ、名前ではなく、個々のパスワードにしたら、もっと強力です。
- imogasi
- ベストアンサー率27% (4737/17070)
(1)セルに入力規則を設置することをVBAでやればどうですか。 ここにはマクロの記録で判りますので記しません。 (2)シートのChangeイベントで、セル(Target)のRow,ColumnでA3を特定・制限し、そのValueが佐藤かどうかきく、手もあります。
- keikan
- ベストアンサー率42% (75/176)
可能です。 まず、変更するシートに対して Sub Worksheet_Change(ByVal Target As Range) イベントに対するコードを書きます。 これはシート内のセルが変更されると起動されます。 この中でTarget(セルの番号等)が変更されたRangeオブジェクトが帰ってきますので Target.Row と Target.Column で変更された場所が指定の場所か確認します。 で、指定の場所であれば Target.Valueで内容を確認し、内容に対応したコードを書けばよいと思います。
お礼
いつも有難うございます。 返事が遅くなりすいません。無事できました。 感動ものです。