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

初心者過ぎて大変恐縮です。
エクセルファイルの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件)

こんなのは、どうでしょうか?


原理を知っている人であれば、簡単に改竄できちゃうんですけど、ちょっとした入力ミスを防止するだけであれば、これで十分だと思います。
なお、「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
    • good
    • 1
この回答へのお礼

ありがとうございました。皆様もつたない質問で回答いただきありがとうございました!

お礼日時:2022/11/14 10:25

こんにちは


>黄色の矢印と黄色で色付けされてしまいました。
ちょっと意味が分かりません

>その後入力済みのセルはほかの人は再入力できなくする方法を探しています。
他の人と自分をどのように区別するかで条件が変わります
①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などもありますがどちらにしても 少々面倒で
都度行う事にあまり生産性を感じられないので、普通に保護・ロックを掛け使ってもらえば良いように思いますね

サンプルコードを参考に 閉じる時に自動で保護を掛ける 開く時に自動で保護を解除する とか・・
    • good
    • 0

こんにちは



記載していないことが多いので、よくわかりませんけれど、「シートの保護」機能を利用しようというおつもりでしょうか?

まず保護をかけた際に、他のセルの編集をどうしたいのかにもよります。
他のセルは誰でも自由に編集可であるなら、最初に全セルのプロパティでロックを外しておく必要があります。(デフォルトではロックが掛かっていると思いますので・・)
あるいは、一部は不可などであったり、操作内容の許可なども設定するのなら、それに応じたオプション設定が必要になります。

一方で、最初に保護を欠ける際に、マクロから
 UserInterfaceOnly:=True
を設定しておくことで、通常の(人間の)操作では保護状態ですが、マクロからの変更は可能と言う保護になりますので、イベント処理内で保護をはずしたりかけたりしなくても済むようになります。
https://learn.microsoft.com/ja-jp/office/vba/api …
こうしておくことで、処理としては単に「対象セルにロックをかける」だけで済むようになると思います。


>入力済みのセルはほかの人は再入力できなくする方法を探しています。
「他の人」というのが、質問者様以外という意味であれば、操作者の識別が必要になると考えられます。
ご提示の保護の方法だと、ボタン一つで簡単に保護を解除できてしまいますので、パスワードは必須ではないでしょうか。
また、上記の方法で保護をかけておけば、ご提示のマクロ内にはパスワードを書く必要が無くなりますので、安全性は高くなると言えるでしょう。


他の人と質問者様を区別する方法としては、Environ関数を利用して
  Environ("USERNAME")
でログインユーザ名を取得できますので、これを利用することで識別できるのではないかと思いますが・・
(同じログイン名を共用しているなどの場合は、ダメですが)
もしも、こちらで識別できる利用環境なら、質問者様が利用する時だけ保護を解除しておくなどにしておけば良いのではないでしょうか?
https://learn.microsoft.com/ja-jp/office/vba/lan …
まぁ、ご自身の場合は、手操作で保護を解除しても良いのではないかとは思いますけれど・・
    • good
    • 0

この質問内容で実現が難しい、と言うか、不可能なのは、「ほかの人は再入力できなくする方法」と言う箇所です。



「自分ならok」と解釈出来ますが、AI付きカメラを使って、エクセルが自動で「あたな本人」を認識する方法が無いので無理です。

あなた自身も、入力不可になります。
手動で設定を変更する必要が出て来ます。
    • good
    • 1

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