重複した値を入力できなくするVBAのコード
この記事は自分用の覚書です。
F.Nさん。
エクセルで重複した値を入力できなくするコードです。
手入力だけでなく、コピー貼り付けや =B2 といったセルの参照で重複が起きても入力を禁止します。
ただし、「コピーしたセルの挿入」の操作はできてしまいます。
僕が書いたのではなくもらったものなので、僕のVBAの知識ではコードの詳細はわかりません。とにかく、このコードで重複入力を禁止できるので助かりました。よかったら使ってみてください。
(コメントは僕がつけました。解釈が間違えていたらごめんなさい)
Private Sub Worksheet_Change(ByVal Target As Range)
から
End Sub
までをコピーします。
シート名の上で右クリックして「コード表示」を選ぶと、VBE(Visual Basic Edtor)が起動してくるので、その画面に貼り付けます。
( Windows 8 Pro 64ビット + Excel2010 )
■重複した値を入力できなくするVBAのコード
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count <> 1 Then Exit Sub
If Target.Row > 501 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
If Application.WorksheetFunction.CountIf(Range("A1:A501"), Target.Value) > 1 Then
MsgBox "重複した値です。"
Target.Value = ""
End If
'
'A1:A501 の範囲を重複入力ができないようにしてある。
'重複入力の場合、「重複した値です」というメッセージを表示する。
'表示されたメッセージでOKをクリックすると、入力をキャンセルする。
'手入力だけでなく、コピー貼り付けや =B2 といったセル参照での重複も入力を禁止する。
'「コピーしたセルの挿入」の操作では重複禁止にならない。
'連続した範囲の貼り付けでも重複禁止にはならない。
'
'このコードのままでは、重複禁止ができるのはA列のセルに入力するときだけ。
'別の列を重複禁止にしたい場合は、コードのなかの
'If Target.Column <> 1 Then Exit Sub
'の 1 の部分を列に対応した数値に変えて、
'Range("A1:A501") の部分も重複禁止にしたい列の表記に変える。
'たとえば、B列を重複禁止にするには 1 を 2 に変えて、
'Range("A1:A501") を Range("B1:B501") にする。
'
'A列もB列も重複禁止にするといった複数列での重複の禁止はこのコードではできない。
'
'If Target.Row > 501 Then Exit Sub
'の 501 を書き換えることで、重複禁止の範囲を列方向に広げたり狭めたりできる。
'
End Sub
・追記
過去にも同様の記事を書いていました。
Excelへの入力で、コピー貼り付けでの重複を防ぐ。
同じコードですね。前のコードはどうやったのか覚えてません。たぶんインターネット上のどこかで見つけてコピペしたんじゃないかと……
「自分用の覚書」だなんて書いてくるくせに覚えてなかったという下手な洒落みたいな話です。
2010年の記事ですね。エクセルは2002だと書いてます。あのころは確かにエクセル2002をXP上で使ってました。
VBAのコメントとして書いておくべきことをコメントにしていないところに、当時の勉強不足さがはっきりと表れています。いまはちょっとは勉強を重ねたつもりなんですが。
計らずも、同じコードがエクセル2002と2010の両方で動くことを確認してしまいました。
| 固定リンク
コメント