いつもお世話になっております。
下記のコードで
Cells(.Row, "C").Locked = True 必要なら
対象のセルをロックしたいのですが、
可能でしょうか。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim st As String, Cnt As Long
With Target
st = .Address(False, False)
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
Select Case st
Case "C"
If .Value = "必要" Then
Cells(.Row, "D").Resize(, 2).Interior.ColorIndex = 3
Cells(.Row, "C").Locked = True
ElseIf .Value = "不要" Then
Cells(.Row, "F").Resize(, 4).Interior.ColorIndex = 3
ElseIf .Value = "" Then
Cells(.Row, "D").Resize(, 6).Interior.ColorIndex = xlColorIndexNone
Else
Cells(.Row, "D").Resize(, 6).Interior.ColorIndex = xlColorIndexNone
End If
End Select
End With
End Sub
No.5ベストアンサー
- 回答日時:
#4です。
目的が"必要"と入力された(D列セル背景が赤にされた)後、入力されないようにするのであれば、こんな方法もあります。
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Intersect(.Cells, Range("C:C")) Is Nothing Then Exit Sub
Application.EnableEvents = False
If .Offset(, 1).Interior.ColorIndex = 3 Then
MsgBox ("変更できません")
Application.Undo
GoTo myEnd
End If
.Offset(, 1).Resize(, 6).Interior.ColorIndex = xlColorIndexNone
Select Case .Value
Case "必要"
.Offset(, 1).Resize(, 2).Interior.ColorIndex = 3
.Locked = True
Case "不要"
.Offset(, 3).Resize(, 4).Interior.ColorIndex = 3
End Select
myEnd:
Application.EnableEvents = True
End With
End Sub
No.4
- 回答日時:
こんばんは、横から失礼します。
>対象のセルをロックしたいのですが、可能でしょうか。
これについては、既に回答がありますが、
>.Locked = True の使用目的がイマイチわかりません。
どのタイミングで保護をかけるのでしょうか、、"必要"と入力した場合に変更できないようにするのが目的でしょうか
初めにすべてのセルのロックを解除しておいてシート保護をかけるのだと思いますが、書式設定を許可しておかないと
.Interior.ColorIndex = はエラーになりますね。
また、
Select Case を使用していてIFをさらに入れていると言う事は、例えば
Case "G" なども追加されると言う事なのでしょうか
抜粋(サンプル)コードでSelect Case、、、IF、、IFとなっているのかも知れませんが、
いずれにしても、Targetがあるので私的には、活用された方が良いのでは無いかと思います。
ちなみに "必要" で変更できないようにするのなら関係ないかも知れませんが、"不要" のち "必要" (又は逆)とした場合、D~I列まで赤くなるのでは無いかと思います。なので、一旦
.Resize(1, 6).Interior.ColorIndex = xlColorIndexNone
を実行して Case "必要" 又は Case "不要" を実行すれば良いように思います。
示されているコードは、この様な感じでも同じ処理になるかと、、、
(少し変えてしまいました)
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Intersect(.Cells, Range("C:C")) Is Nothing Then Exit Sub
Application.EnableEvents = False
.Offset(, 1).Resize(, 6).Interior.ColorIndex = xlColorIndexNone
Select Case .Value
Case "必要"
.Offset(, 1).Resize(, 2).Interior.ColorIndex = 3
.Locked = True ’?
Case "不要"
.Offset(, 3).Resize(, 4).Interior.ColorIndex = 3
End Select
Application.EnableEvents = True
End With
End Sub
余計なお世話ですが、Worksheet_Changeの場合、セルをフィルした時などスタックする可能性がありますので、Application.EnableEventsは入れておいたほうが良いと思います。
ありがとうございます。
Worksheet_Changeって
やっばり
やっぱりコツをつかむまで、時間がかかりそうです
ありがとうございます。
必要と入力されたら、そのセルだけをLocked
する
これは難しいです
No.3
- 回答日時:
補足を見て。
それであれば
'st = .Address(False, False) 'こちらはコメントアウトしておくとか?
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
それに忘れないようにって点ではテキストファイルなどでコードを保存し、必要に応じて部分コピペをする私みたいな方法は如何でしょう?
No.2
- 回答日時:
>st = .Address(False, False)
>st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
ここについてですが参考コード。
Dim r As Range
Dim st As String
For Each r In Range("A1,C1,AC1,CA1")
st = Left(Split(r.Address, "$")(1), 1) ' (0) は $ に左の "" 文字になるので
Debug.Print r.Address, st
Next
結果:
$A$1 A
$C$1 C
$AC$1 A
$CA$1 C
絶対参照の"$"で区切るのをりようするとか。
あとSelect Case につてはIf文でIntersectを使い変数stをやめて
With Target
If Not Intersect(.Cells, Range("C:C")) Is Nothing Then
とかもあるかと。
No.1
- 回答日時:
『おわりに』を参照願います。
~セルの設定又は設定解除を実行した後にシートを保護する事で、初めてセルの変更可否が有効となります~ 抜粋。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Excel(エクセル) マクロで列を加えたら上手くいかなくなりました。 2 2022/05/23 17:59
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAについて
-
VBA レジストリの値の読み方に...
-
VBAの計算で@が出てしまう件
-
2つのマクロでチェックボックス...
-
Vba SelStart、SelLen教えてく...
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
エクセルのマクロについて教え...
-
現在のブックを閉じないで、マ...
-
VBA初心者 Ctrl+での操作、ボタ...
-
Excel-VBAのmsgBox()の不思議
-
エクセルのマクロについて教え...
-
ExcelのVBAです。フォルダ内の...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBAを使用した時間管理
-
CADシステムに図面番号を入力し...
-
VBA listBoxから
-
VBAに詳しい方教えてください。
-
VB.net(VB)で、フォームにExcel...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel-VBAのmsgBox()の不思議
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
現在のブックを閉じないで、マ...
-
VBAで各列の"+"と"o"の合計数を...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ユーザーフォームに別シートか...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロについて教え...
-
VBA listBoxから
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
おすすめ情報
ここの部分ですが、
>st = .Address(False, False)
>st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
わすれないようにいつもかいています>
すみませんです。