Excel VBA質問箱 IV

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

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


12729 / 13644 ツリー ←次へ | 前へ→

【8929】バッティング 学生です 03/11/10(月) 11:53 質問
【8930】Re:バッティング つん 03/11/10(月) 12:50 回答
【8932】Re:バッティング 学生です 03/11/10(月) 14:28 質問
【8933】Re:バッティング つん 03/11/10(月) 14:57 発言
【8935】Re:バッティング 学生です 03/11/10(月) 15:00 回答
【8957】Re:バッティング りん 03/11/11(火) 20:00 回答

【8929】バッティング
質問  学生です  - 03/11/10(月) 11:53 -

引用なし
パスワード
   Private Sub Worksheet_Change(ByVal Target As Range)

Dim MyR As Range
Dim セル As Range

  Set MyR = Columns("A:A").SpecialCells(xlCellTypeConstants, 23)
  For Each セル In MyR
    If (Target.Column = 1) And (Target.Value = セル.Value) And _
      (Target.Row <> セル.Row) Then
      Cells(Target.Row, Target.Column).Select
      MsgBox Target.Value & "は、入力済みです"
      Target.Value = ""
      Exit For
    End If
  Next
 
  Set MyR = Nothing
  Set セル = Nothing

End Sub

 これでは、A列同士でのバッティングのみしか出来ません、アクティブセルとA列のバッティングをするにはどうしたら良いんでしょうか?

【8930】Re:バッティング
回答  つん E-MAIL  - 03/11/10(月) 12:50 -

引用なし
パスワード
   こんにちは

>Private Sub Worksheet_Change(ByVal Target As Range)
>
>Dim MyR As Range
>Dim セル As Range
>
>  Set MyR = Columns("A:A").SpecialCells(xlCellTypeConstants, 23)
>  For Each セル In MyR
>    If (Target.Column = 1) And (Target.Value = セル.Value) And _
>      (Target.Row <> セル.Row) Then

>      Cells(Target.Row, Target.Column).Select
>      MsgBox Target.Value & "は、入力済みです"
>      Target.Value = ""
>      Exit For
>    End If
>  Next
> 
>  Set MyR = Nothing
>  Set セル = Nothing
>
>End Sub
>
上記の太字の部分の、(Target.Column = 1) を外せばいいんじゃないでしょうか?
違うかな〜?

【8932】Re:バッティング
質問  学生です  - 03/11/10(月) 14:28 -

引用なし
パスワード
    つんさん、こんにちは
これでは、無限ループに突入してします、
どうしたらいいでしょうか?
 

【8933】Re:バッティング
発言  つん E-MAIL  - 03/11/10(月) 14:57 -

引用なし
パスワード
   どもども

>これでは、無限ループに突入してします、
>どうしたらいいでしょうか?

無限ループにはならないと思うけど……

 Target.Value = ""

ここを通ったとき、確かにもう一度Changeイベントが発生したりはしますね。

 For Each セル In MyR 

の途中でまたChangeイベントが発生するのって、どうかな?と思うので、
こうしたらどうでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

Dim MyR As Range
Dim セル As Range
Dim blnFlag As Boolean

  blnFlag = False

  If Target.Value <> "" Then

    Set MyR = Columns("A:A").SpecialCells(xlCellTypeConstants, 23)
    For Each セル In MyR
      If (Target.Value = セル.Value) And (Target.Row <> セル.Row) Then
        Cells(Target.Row, Target.Column).Select
        MsgBox Target.Value & "は、入力済みです"
        blnFlag = True
        Exit For
      End If
    Next
  
    Set MyR = Nothing
    Set セル = Nothing
  End If
  
  If blnFlag = True Then Target.Value = ""

End Sub

一度ステップ実行して動きを確かめて見てください。

ところで、バッティングときに、A列の行と同行の時はOKなわけなんですね?

【8935】Re:バッティング
回答  学生です  - 03/11/10(月) 15:00 -

引用なし
パスワード
   はい。

【8957】Re:バッティング
回答  りん E-MAIL  - 03/11/11(火) 20:00 -

引用なし
パスワード
   学生です さん、こんばんわ。

イベントモジュール内で実行することでまたイベントがおきないように、
  Application.EnableEvents = False
を設定します。

ただし、このコマンドは強烈なので
  Application.EnableEvents = True
を忘れると、その後イベントが起きませんので、必ず忘れずに戻しましょう。
何かのエラーで中断して戻りそびれると困るので、Resumeで必ず通るようにしてあります。

Private Sub Worksheet_Change(ByVal Target As Range)
  'イベントキャンセル
  Application.EnableEvents = False
  Dim MyR As Range, セル As Range, r1 As Range, r2 As Range
  '
  On Error Resume Next
  Set MyR = Columns("A:A").SpecialCells(xlCellTypeConstants, 23)
  'Targetが複数セルの場合もないとはいえない
  Set r1 = Target.SpecialCells(xlCellTypeConstants, 23)
  On Error GoTo 0
  If (Not r1 Is Nothing) And (Not MyR Is Nothing) Then
   For Each r2 In r1
     With r2
      If .Value <> "" Then
        For Each セル In MyR
         If (.Value = セル.Value) And (.Address <> セル.Address) Then
           .Select
           MsgBox .Value & "は、入力済みです", vbInformation
           .ClearContents
         
           Exit For
         End If
        Next
      End If
     End With
   Next
  End If
  '終了
ExitMacro: 'TAG
  Set MyR = Nothing: Set セル = Nothing: Set r1 = Nothing
  'イベント監視開始
  Application.EnableEvents = True
Exit Sub
errout:
  MsgBox Error(Err), vbExclamation, "エラーで中断"
  Resume ExitMacro
End Sub

こんな感じです。

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