[[20171107153924]] 『入力した値が同シート内で重複しない場合に警告音』(とり) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『入力した値が同シート内で重複しない場合に警告音』(とり)

質問失礼致します。

もとからD列には多数の値が入力されておりB列に新しく値を入力した際、
D列に入力されている値と " 重複しない場合 " に警告音を出したいのです。

現状、重複に色がつくようにしており
色がつかなかった場合は重複なしと判断しているのですが、
作業中にPC画面を見ているのでは効率が悪いため
音で判断をしたいです。

調べても重複する場合に警告という内容のものしか見つけられなかったため
ご教示いただけますと幸いです。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 入力規則で警告を出すようにしてはどうか?
 (警告時ダイアログ表示時には音も出るらしい。私の環境ではPCから音が出ないような設定になっているため未確認)
(ねむねむ) 2017/11/07(火) 16:03

とり さん
こんばんは、
ねむねむ さんご指摘の入力規則と併用されると効果的かも、です。

>D列には多数の値が入力されておりB列に新しく値を入力、
が前程で
当該のシートのVBEに貼り付けてください。
参考まで。

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim B_flg As Boolean
  Dim ad As String
  Dim cnt As Long
  B_flg = True
  ad = Target.Address(False, False)
  If (Mid(ad, 1, 1) <> "B") Or (Selection.Count > 1) Or (IsEmpty(Range(ad).Value)) Then
    Exit Sub
  End If
  For cnt = 1 To Cells(Rows.Count, 4).End(xlUp).Row
    If Cells(cnt, 4).Value = Range(ad).Value Then
      B_flg = False
    End If
  Next cnt
  If B_flg Then
    Beep
  End If
End Sub
(隠居じーさん) 2017/11/07(火) 21:50

追記

(^^;

入力規則だけでも、
ねむねむ さんご指摘通りダイアログも
音もかなりきれいなベル音が出ますよ。
マクロは必要ないかもです。

<(_ _)>

(隠居じーさん) 2017/11/07(火) 22:00


ねむねむ 様
隠居じーさん 様

ご教示ありがとうございます。
入力規則で確かに音が出たうえ、誤った入力を防ぐことができました。
難しそうだなと少し忌避していたのですが案外簡単に使えたので
ここでご教示いただけてよかったです。

VBAもシートに貼り付け使用してみたのですがB列へ入力毎に音が鳴ってしまいました。
(同シート内にB列入力時、隣のセルに日付を自動入力するVBAが入っていたのですが
 それが影響を与えてしまうことがあったりするのでしょうか。。?)

(とり) 2017/11/08(水) 15:58


とり 様へ

テストしましたが、B列に入力した値が

D列の数値と同じ数値であれば鳴りません。
D列の数値と違えば鳴ります。

尚、B列のみ確認しておりますのでA列の値は関係無いとは
思いますが、ソースが解らないので判断出来ません。

はずしておりましたら、申し訳ありません

<(_ _)>

(隠居じーさん) 2017/11/08(水) 16:32


隠居じーさん 様

下記、ご教示頂いたVBAを組み込んだ際のソースです。


Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 3 Then
If Cells(Target.Row, 3).Value <> "" Then Status = Date Else Status = ""
If TypeName(Target.Value) <> "Variant()" Then Cells(Target.Row, 2).Value = Status Else _
For i = 0 To UBound(Target.Value) - 1: Cells(Target.Row + i, 2).Value = Status: Next
End If

  Dim B_flg As Boolean
  Dim ad As String
  Dim cnt As Long
  B_flg = True
  ad = Target.Address(False, False)
  If (Mid(ad, 1, 1) <> "B") Or (Selection.Count > 1) Or (IsEmpty(Range(ad).Value)) Then
    Exit Sub
  End If
  For cnt = 1 To Cells(Rows.Count, 4).End(xlUp).Row
    If Cells(cnt, 4).Value = Range(ad).Value Then
      B_flg = False
    End If
  Next cnt
  If B_flg Then
    Beep
  End If
End Sub


最近VBAを使い始めたのでそもそも組み込み方自体が
間違っているかもしれません^^;
(とり) 2017/11/08(水) 17:11


とり 様
こんばんわ
テストしてみました。
C列に何か情報があればB列に何を入力しても
入力したB列のセルが日付情報に変換されてしまいます。
後、C列を更新(消す)するとハングアップしますよ。 (^^;

行頭にOption Explicitを指定して
変数の宣言とか
if構文は End IFで括られたほうがメンテはしやすいかもです。

結果Beep音が連発しているようです。
日付はA列にされて、B列は入力用にあけておかれた方がよいかと。
取り急ぎ、ご報告まで。

<(_ _)>

(隠居じーさん) 2017/11/08(水) 19:53


とり 様
こんばんわ
ハングアップは私の勘違いです。

失礼致しました。 m(__)m

Ubound(Target.Value)は
全列削除を指定した場合、最終行まで処理となり
時間がかかって、一時応答なし状態でした。

>同シート内にB列入力時、隣のセルに日付を自動入力するVBA

の隣のセルがA列と仮定してですが。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)

  Dim Status
  Dim i As Long
  If Target.Column = 2 Then
    If Cells(Target.Row, 2).Value <> "" Then
      Status = Date
    Else
      Status = ""
    End If
    If TypeName(Target.Value) <> "Variant()" Then
      Cells(Target.Row, 1).Value = Status
    Else
      For i = 0 To Cells(Rows.Count, 1).End(xlUp).Row
        Cells(Target.Row + i, 1).Value = Status
      Next
    End If
  End If
  '********************************************************
  Dim B_flg As Boolean
  Dim ad As String
  Dim cnt As Long
  B_flg = True
  ad = Target.Address(False, False)
  If (Mid(ad, 1, 1) <> "B") Or (Selection.Count > 1) Or (IsEmpty(Range(ad).Value)) Then
    Exit Sub
  End If
  For cnt = 1 To Cells(Rows.Count, 4).End(xlUp).Row
    If Cells(cnt, 4).Value = Range(ad).Value Then
      B_flg = False
    End If
  Next cnt
  If B_flg Then
    Beep
  End If
End Sub
で、どうでしょうか
参考まで
外してましたらすみません。

<(_ _)>

(隠居じーさん) 2017/11/08(水) 23:43


隠居じーさん 様

こんにちは

>同シート内にB列入力時、隣のセルに日付を自動入力するVBA

の隣のセルは仰るとおりA列のことになります。
説明が足りず申し訳ございません。。

また、遅くまでご教示頂きありがとうございます。
本日は音の確認できる環境ではないため明日改めて確認いたします。

取り急ぎご連絡まで。

(とり) 2017/11/09(木) 13:51


とり 様
ご連絡、有難うございます。
修正版をUpいたします。
修正箇所
1.全範囲選択でDELETEをかけるとオーバーフローをエラー処理。
2.A列の消去処理、途中は空白でA,B列、最終行付近に情報があった
  場合時間がかかりすぎるので1000行以降はMSGを表示後、処理中断と
  しました。後でA列全行選択で削除してください。
  1000行以上ご必要な場合は追加の当該コードを削除してください
3.B列の行全て選択時のエラートラップ追加。
お試しを。

<(_ _)>

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)

  Dim Status
  Dim i As Long
  On Error GoTo my_end
  If Target.Column = 2 Then
    If Cells(Target.Row, 2).Value <> "" Then
      Status = Date
    Else
      Status = ""
    End If
    If TypeName(Target.Value) <> "Variant()" Then
      Cells(Target.Row, 1).Value = Status
    Else
      For i = 0 To Cells(Rows.Count, 1).End(xlUp).Row
        If i > 1000 Then
          Call my_chk
          Exit Sub
        End If
        Cells(Target.Row + i, 1).Value = Status
        DoEvents
      Next
    End If
  End If
  '********************************************************
  Dim B_flg As Boolean
  Dim ad As String
  Dim cnt As Long
  B_flg = True
  ad = Target.Address(False, False)
'  MsgBox ad
  If (Mid(ad, 1, 1) <> "B") Or (Selection.Count > 1) Or _
     (IsEmpty(Range(ad).Value)) Or ad = "B:B" Then
  Exit Sub
  End If
  For cnt = 1 To Cells(Rows.Count, 4).End(xlUp).Row
    If cnt > 1000 Then
      Call my_chk
      Exit Sub
    End If
    If Cells(cnt, 4).Value = Range(ad).Value Then
      B_flg = False
    End If
  Next cnt
  If B_flg Then
    Beep
  End If
  Exit Sub
my_end:
MsgBox Err.Number & "error ^^:"
End Sub
Private Sub my_chk()
  MsgBox "A列の1000行以降に不審な情報があるようです。"
End Sub
追伸
もう少しお待ちになると。私の様なへぼコード(何とかうごくだけ(^^))
ではなく
VBAウイザードさまがたくさんおられますので、
もっと素晴らしい知識をお示し戴けるかもです ^^;

<(_ _)>

(隠居じーさん) 2017/11/09(木) 17:43


入力規則で解決したのに、なぜマクロなのかわかりませんが。
こんなことでしょうか?
 Option Explicit

 Private Sub Worksheet_Change(ByVal Target As Range)
        Dim rr As Range, r As Range
        Dim m, flg As Boolean

     Set rr = Intersect(Target, Columns("B"))    
    If rr Is Nothing Then Exit Sub

    Application.EnableEvents = False

    rr.Offset(, -1).ClearContents
    rr.Interior.ColorIndex = xlNone

    For Each r In rr
        If r.Value <> "" Then
            r.Offset(, -1).Value = Date
            m = Application.Match(r, Columns("D"), 0)
            If IsError(m) Then
                r.Interior.Color = vbRed
                flg = True
            End If
        End If
    Next

    If flg Then Beep

    Application.EnableEvents = True

 End Sub

(マナ) 2017/11/09(木) 21:21


マナ 様
おはようございます。試してみました。
視覚、聴覚、で確認でき。凄いですね。

>入力規則で解決したのに、なぜマクロなのかわかりませんが。
私の場合は、下手の横好き、という事で

とても勉強になります。
ありがとうございました。

とり 様、割り込み、すみません

<(_ _)>

(隠居じーさん) 2017/11/10(金) 08:55


隠居じーさん 様
マナ 様

こんにちは。
いろいろご教示頂きありがとうございます。

シートに貼り付けて使用してみたのですが
何も反応しなかったです。
変数の宣言について知識が無いためそこが原因かなと思います。。
(勉強します)
教えてくださったのにすぐに活かす事ができず申し訳ないです。

>入力規則で解決したのに、なぜマクロなのかわかりませんが。
最低限欲しい機能が今回の件だったため、
今後機能を追加した際に今回マクロのことについて教わっておけば
何かしら活用できるのでは?という下心からです。

大変助かりました。
ありがとうございました!

(とり) 2017/11/10(金) 15:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.