Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


66 / 13155 ツリー ←次へ | 前へ→

【79708】エラーメッセージ V 18/3/14(水) 10:38 質問[未読]

【79713】Re:エラーメッセージ V 18/3/14(水) 14:19 質問[未読]
【79719】Re:エラーメッセージ りった 18/3/15(木) 12:33 回答[未読]
【79720】Re:エラーメッセージ V 18/3/15(木) 13:13 質問[未読]
【79724】Re:エラーメッセージ りった 18/3/22(木) 12:49 回答[未読]

【79713】Re:エラーメッセージ
質問  V  - 18/3/14(水) 14:19 -

引用なし
パスワード
   ▼りった さん:
># 下記は、Sheet1のマクロとして記載するイメージです。
>Private Sub Worksheet_Change(ByVal Target As Range)
>  ' A1に値が入力されていないとB1,C1,D1,E1,F1は、入力できずに
>  '「大項目を入力して下さい」とエラーメッセージがでるようにする
>  If Not Intersect(Target, Sheet1.Range("B1:F1")) Is Nothing Then
>    If Sheet1.Range("A1") = "" Then
>      MsgBox "大項目を入力して下さい"
>    End If
>  End If
>End Sub


ありがとうございます。
質問なのですが、これをA31まで適用するには
どこを変えればいいのでしょうか?

【79719】Re:エラーメッセージ
回答  りった  - 18/3/15(木) 12:33 -

引用なし
パスワード
   Targetが複数セルのことがあるので、for eachでループしてみるのは如何でしょうか?
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Anに値が入力されていないとBn,Cn,Dn,En,Fnは、入力できずに
  '「大項目を入力して下さい」とエラーメッセージがでるようにする
  ' n:1〜41
  Dim r As Range
  For Each r In Target
    If Not Intersect(r, Sheet1.Range("B1:F41")) Is Nothing Then
      If Sheet1.Range("A" & r.Row) = "" Then
        MsgBox "大項目を入力して下さい"
      End If
    End If
  Next
End Sub

複数セルを一気に更新して大量にエラーが出るのが嫌であれば、ループから抜けてください。
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Anに値が入力されていないとBn,Cn,Dn,En,Fnは、入力できずに
  '「大項目を入力して下さい」とエラーメッセージがでるようにする
  ' n:1〜41
  Dim r As Range
  For Each r In Target
    If Not Intersect(r, Sheet1.Range("B1:F41")) Is Nothing Then
      If Sheet1.Range("A" & r.Row) = "" Then
        MsgBox "大項目を入力して下さい"
        Exit For ' ★
      End If
    End If
  Next
End Sub


無関係な広範囲のセルを更新時に大量にループするのが嫌であれば下記で
Private Sub Worksheet_Change(ByVal Target As Range)
  ' Anに値が入力されていないとBn,Cn,Dn,En,Fnは、入力できずに
  '「大項目を入力して下さい」とエラーメッセージがでるようにする
  ' n:1〜41
  Dim r As Range
  If Not Intersect(Target, Sheet1.Range("B1:F41")) Is Nothing Then ' ★
    For Each r In Target
      If Not Intersect(r, Sheet1.Range("B1:F41")) Is Nothing Then
        If Sheet1.Range("A" & r.Row) = "" Then
          MsgBox "大項目を入力して下さい"
        End If
      End If
    Next
  End If
End Sub

【79720】Re:エラーメッセージ
質問  V  - 18/3/15(木) 13:13 -

引用なし
パスワード
   ▼りった さん:

返信ありがとうございます。
何回も質問ばかりして申し訳ないのですが、

3つのループの違いがいまいちわからないのですが
一番下の無関係な広範囲の・・・ものが
一番処理的には、良いのでしょうか?

また、下記のコードですが、

Private Sub Worksheet_Change(ByVal Target As Range)

' A1に値が入力されていないとB1,C1,D1,E1,F1は、入力できずに
'「大項目を入力して下さい」とエラーメッセージがでるようにする
' n:1〜41
  
  Dim r As Range
 
  If Not Intersect(Target, Sheet1.Range("B1:F41")) Is Nothing Then ' ★
  
   For Each r In Target
    If Not Intersect(r, Sheet1.Range("B1:F41")) Is Nothing Then
     If Sheet1.Range("A" & r.Row) = "" Then
     
      Application.EnableEvents = False
      Target.Value = ""
      Application.EnableEvents = True
      
      MsgBox "大項目を入力して下さい", Title:="入力エラー!", Buttons:=vbCritical + vbRetryCancel
 
     End If
    End If
   Next
  End If
End Sub

キャンセルの場合は、値が消えるようにしてみたのですが
一応動いているみたいですが、こんな感じで間違ってないでしょうか?

【79724】Re:エラーメッセージ
回答  りった  - 18/3/22(木) 12:49 -

引用なし
パスワード
   気付くの遅れました済みません。
動いているとのことですし、だれも指摘しないので、大丈夫だと思います。

iEnEv = Application.EnableEvents
Application.EnableEvents = False
Target.Value = ""
Application.EnableEvents = iEnEv

とした方がお行儀いいかもしれません。
ただ、ここら辺は私もやったことがないので、よくわかりません。

66 / 13155 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free