

初心者過ぎて大変恐縮です。
エクセルファイルのVBAについて教えてください。
表に入力をしたら→セルの色が変わる(条件付き設定で設定)→その後入力済みのセルはほかの人は再入力できなくする方法を探しています。
★その範囲としてはB3からD16までとします。
★ネットでVBAの再入力できなくコードを見たのですが、これでは最初から引っかかって
黄色の矢印と黄色で色付けされてしまいました。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As Integer, C As Integer
R = Target.Row
C = Target.Column
If Cells(R, C) = “” Then Exit Sub
ActiveSheet.Unprotect ‘保護解除
Cells(R, C).Locked = True ‘ロック
‘追加あればここに記述
ActiveSheet.Protect ‘保護
End Sub
どうかお知恵を頂けますでしょうか。よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こんなのは、どうでしょうか?
原理を知っている人であれば、簡単に改竄できちゃうんですけど、ちょっとした入力ミスを防止するだけであれば、これで十分だと思います。
なお、「Microsoft Officeのユーザ設定」で個々の名前が設定されていることが前提となります。もし、設定していない場合は、デフォルトのユーザ名での入力を制限する必要があります。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rs As Range
Dim r As Range
Set Rs = Intersect(Range("B3:D16"), Target)
If Rs Is Nothing Then Exit Sub
For Each r In Rs
If Not r.Comment Is Nothing Then
If r.Comment.Text <> Application.UserName Then
MsgBox "他の人が入力済みのセルを編集しようとしました。入力を無効にします。"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
End If
Next
If Not Rs Is Nothing Then
For Each r In Rs
If r.Value <> "" Then
If r.Comment Is Nothing Then
r.AddComment
r.Comment.Text Text:=Application.UserName
End If
Else
If Not r.Comment Is Nothing Then
r.Comment.Delete
End If
End If
Next
End If
End Sub
No.3
- 回答日時:
こんにちは
>黄色の矢印と黄色で色付けされてしまいました。
ちょっと意味が分かりません
>その後入力済みのセルはほかの人は再入力できなくする方法を探しています。
他の人と自分をどのように区別するかで条件が変わります
①PCの違いで判断
②ログインユーザー名で判断
③起動時に判断 など
①PCや②ログインユーザー名での判断は同じような処理で可能と思います
③起動時に判断の場合はWorkbook_Openイベントなどでパスワード付きチェックなどの処理でグローバル変数に権限キーを代入してChangeイベントなどで使い回せば、誰が運用しているかを判断できると思います
同じPC同じログインユーザー名でExcelを使っていて、かつ既に開かれているブックを権限によって操作を抑制する場合は、(操作)実行時のトリガー内に確認用ロジックを入れるしか方法がないのではないかと思います
此の辺まで分かりますでしょうか・・
②の例 (内容はなさりたい事なのかは未検証)
先ず自身のログインユーザー名を取得してみてください
多分判り難いと思うので下記を実行(結果を参考)
Sub test0()
'ログインユーザー名を取得
Debug.Print Environ("USERNAME")
MsgBox Environ("USERNAME")
End Sub
メッセージボックスとイミディエイトウィンドウに出力されます
下記の ログインユーザー名 を変更してください
ここから・・シートモジュールに
Private Sub Worksheet_Change(ByVal Target As Range)
Const UrName As String = "ログインユーザー名"
If Intersect(Range("B3:D16"), Target) Is Nothing Then Exit Sub
If UrName <> Environ("USERNAME") Then
'不要?---
MsgBox "管理者以外入力できません"
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
Exit Sub
'---不要?
Else
If Target.Value = "" Then Exit Sub
ActiveSheet.Unprotect '保護解除
Target.Locked = True 'ロック
'追加あればここに記述
ActiveSheet.Protect '保護
End If
End Sub
自分
ロックのないセルに入力した場合、入力されロックがかかる
すでにロックがかかっている場合、保護・・・が表示される・・はず・
他の人
ロックのかかっていないB3:D16の範囲に入力
MsgBox "管理者・・が出力され入力前の値に戻る
すでにロックがかかっている場合、保護・・・が表示される・・はず・
自分が値を変更したい場合
セルをダブルクリック ロック解除 入力できる
他の人は 解除されない
解除のコード 同じシートモジュールに
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Const UrName As String = "ログインユーザー名"
If Intersect(Range("B3:D16"), Target) Is Nothing Then Exit Sub
If UrName = Environ("USERNAME") Then
ActiveSheet.Unprotect '保護解除
Target.Locked = False 'ロック
Cancel = True
End If
End Sub
保護も解除しています
ログインユーザー名を適当に入れると違うユーザーとして認識されますのでテスト時に確認してみてください
Worksheet_BeforeDoubleClickではなく
Worksheet_Activateなどもありますがどちらにしても 少々面倒で
都度行う事にあまり生産性を感じられないので、普通に保護・ロックを掛け使ってもらえば良いように思いますね
サンプルコードを参考に 閉じる時に自動で保護を掛ける 開く時に自動で保護を解除する とか・・
No.2
- 回答日時:
こんにちは
記載していないことが多いので、よくわかりませんけれど、「シートの保護」機能を利用しようというおつもりでしょうか?
まず保護をかけた際に、他のセルの編集をどうしたいのかにもよります。
他のセルは誰でも自由に編集可であるなら、最初に全セルのプロパティでロックを外しておく必要があります。(デフォルトではロックが掛かっていると思いますので・・)
あるいは、一部は不可などであったり、操作内容の許可なども設定するのなら、それに応じたオプション設定が必要になります。
一方で、最初に保護を欠ける際に、マクロから
UserInterfaceOnly:=True
を設定しておくことで、通常の(人間の)操作では保護状態ですが、マクロからの変更は可能と言う保護になりますので、イベント処理内で保護をはずしたりかけたりしなくても済むようになります。
https://learn.microsoft.com/ja-jp/office/vba/api …
こうしておくことで、処理としては単に「対象セルにロックをかける」だけで済むようになると思います。
>入力済みのセルはほかの人は再入力できなくする方法を探しています。
「他の人」というのが、質問者様以外という意味であれば、操作者の識別が必要になると考えられます。
ご提示の保護の方法だと、ボタン一つで簡単に保護を解除できてしまいますので、パスワードは必須ではないでしょうか。
また、上記の方法で保護をかけておけば、ご提示のマクロ内にはパスワードを書く必要が無くなりますので、安全性は高くなると言えるでしょう。
他の人と質問者様を区別する方法としては、Environ関数を利用して
Environ("USERNAME")
でログインユーザ名を取得できますので、これを利用することで識別できるのではないかと思いますが・・
(同じログイン名を共用しているなどの場合は、ダメですが)
もしも、こちらで識別できる利用環境なら、質問者様が利用する時だけ保護を解除しておくなどにしておけば良いのではないでしょうか?
https://learn.microsoft.com/ja-jp/office/vba/lan …
まぁ、ご自身の場合は、手操作で保護を解除しても良いのではないかとは思いますけれど・・

No.1
- 回答日時:
この質問内容で実現が難しい、と言うか、不可能なのは、「ほかの人は再入力できなくする方法」と言う箇所です。
「自分ならok」と解釈出来ますが、AI付きカメラを使って、エクセルが自動で「あたな本人」を認識する方法が無いので無理です。
あなた自身も、入力不可になります。
手動で設定を変更する必要が出て来ます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
電子書籍プレゼントキャンペーン!
最大2万円超分当たる!マンガや小説が読める電子書籍サービス『Renta!』で利用できるギフトコードプレゼント実施中!
-
【VBAエラー】Nextに対するForがありません 対策について
Visual Basic(VBA)
-
初めてマクロを入力しますが、テキストとおりに入力したのに構文エラーです。修正を教えてください。
Visual Basic(VBA)
-
エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ
Visual Basic(VBA)
-
4
ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています
Visual Basic(VBA)
-
5
動かなくなってしまった古いVBAを動くようにしたい
Visual Basic(VBA)
-
6
VBAで一時中断したプログラムの再開をさせたい
Visual Basic(VBA)
-
7
vbaの計算 if elseと範囲について
Visual Basic(VBA)
-
8
Excel VBAのデバッグ
Visual Basic(VBA)
-
9
なぜこんな初歩的なVBAのIf文でエラーか発生して使えないのか、全く理解出来ません。誰か助けてくださ
Visual Basic(VBA)
-
10
このマクロの説明文を教えてほしいです。
Visual Basic(VBA)
-
11
Excel-VBAでのファイルの開き方
Visual Basic(VBA)
-
12
配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。
Visual Basic(VBA)
-
13
ExcelのVBAでシフト表を作っていますが、バグが出て困っています
Visual Basic(VBA)
-
14
vba メモリ節約
Visual Basic(VBA)
-
15
【至急】 当方初心者です。 マクロについて知恵をお貸しください。 ★したい動作 ①リストE列2行目か
Visual Basic(VBA)
-
16
ExcelVBA 日付変更
Visual Basic(VBA)
-
17
VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく
Visual Basic(VBA)
-
18
ExcelのVBAでをA列に第0〜19項のフィボナッチ数列を代入するプログラムを作りたいです。 どな
Visual Basic(VBA)
-
19
マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」
Visual Basic(VBA)
-
20
任意の置換を互換の積で表すプログラム
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
セルに最初からある文字列を表...
-
5
エクセルでセルにポインタする...
-
6
シートを保護しても入力規則を...
-
7
エクセル逆三角マークで選択項...
-
8
エクセルVBA ユーザーフォーム...
-
9
Excelで同じセルに入力し エン...
-
10
エクセルVBA ブックを閉じる前...
-
11
エクセルでセルのコメントが消...
-
12
【Excel】ドロップダウンリスト...
-
13
Excelで急に動かなくなる
-
14
エクセルの入力規則で作ったリ...
-
15
Excel 自動的に半角英数になり...
-
16
Excelで、すでに入力されている...
-
17
入力モードが勝手に切り替わる
-
18
ドロップダウンリスト(INDIREC...
-
19
エクセルのプルダウンメニュー...
-
20
エクセルデータの入力規則リス...
おすすめ情報
公式facebook
公式twitter