問題点
- イベントプロシージャーWorksheet_Changeにおいて、下記の順番で処理を行うと1004エラーが起きてまう。
- シートの保護を解除する。
2. A1またはB1のセルの値に変更が合った場合に、その値の色で当該セルを塗りつぶしを行う。(標準モジュールからCall)
3. 塗りつぶしたセルの1つ下のセルに、選択した色の文字列の日本語名を挿入する。
4. シートを保護する。(該当のセルは書式設定>保護>ロックのチェックを外しています。)
- 上記3.でセルの変更があったので、再度イベントが発生してしまう。
- 上記2.でシートが保護されてしまっており1004エラーが起きてしまう。(恐らく再度イベントが発生している途中でエラーが起きている?)
- エラーは、呼び出したFunction内で起きている。(サンプルコード参照)
質問・解決したいこと
- なぜイベントの最後にシートを保護しているのに、途中でシートが保護されてしまっているのでしょうか。
- イベント内でセルの値が変更になった場合の処理の順序が把握できておりません。
なぜか一旦End Subに到達する前にIf Not Intersect(Target, Range("A1")) Is Nothing Then
を2回通ります。
- イベント内でセルの値を変更しても、再度イベントが発生してしまわないような処理はできますか?
サンプルコード
※シートのA1およびB1には、「yellow」、「blue」の選択肢を設定しています。
Sheet1(Sheet1)
Private Sub Worksheet_Change(ByVal Target As Range) ActiveSheet.Unprotect If Not Intersect(Target, Range("A1")) Is Nothing Then If Range("A1").Value = "yellow" Then Range("A2").Value = "黄色" Call color_yellow(Range("A1")) ElseIf Range("A1").Value = "blue" Then Range("A2").Value = "青いろ" Call color_blue(Range("A1")) End If End If If Not Intersect(Target, Range("B1")) Is Nothing Then If Range("B1").Value = "yellow" Then Range("B2").Value = "黄色" Call color_yellow(Range("B1")) ElseIf Range("B1").Value = "blue" Then Range("B2").Value = "青いろ" Call color_blue(Range("B1")) End If End If ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Module1
Function color_blue(val As Range) With val.Interior .Pattern = xlSolid 'ここでエラー .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent5 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Function Function color_yellow(val As Range) ActiveSheet.Unprotect With val.Interior .Pattern = xlSolid 'ここでエラー .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With End Function
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。