
sheet1の、”B3”に年、”D3”に月、”F3”に日、そして”F5”に担当者名が入力されます。
他にも様々な項目がsheet1にあり、それらを日計として別のsheet2に転記します。
(sheet1に設置した入力ボタンを押すと、sheet2に転記されます)
sheet2には、各担当者が日計を入力し、下記のように日々新しいデータが蓄積されていきます。
(sheet2は、A列に年、B列に月、C列に日、D列に担当者名となっています)
年 月 日 担当 ・・・その他項目色々・・・
2022 10 5 A
2022 10 5 B
2022 10 5 C
2022 10 9 A
2022 10 9 C
現状ですと、新たにsheet1からsheet2への登録の際、
同一年月日かつ同一担当のデータが既にある場合でもsheet2の最終行に追加されてしまいます。
同じ年月日で同じ担当のデータがある場合、
「同じデータがあります」等、何らかのメッセージボックスで警告したいのですが、
複数の一致データ(年、月、日、担当者)の検索方法がよくわかりません。
お知恵を頂けると幸いです。
No.3ベストアンサー
- 回答日時:
No1の方のアドバイスに従い、WorksheetFunction.CountIfsを使用してチェックを行う関数を作成しました。
Public Sub 重複判定()は確認用のプロシージャです。
実際には不要です。
あなたのマクロに、Private Function check_dup() As Boolean
を組み込んで使ってください。
重複があれば、Trueを返します。(重複無はFalseを返します)
Sheet1,Sheet2のレイアウトは添付図のようになっている前提です。
レイアウトが異なる場合は、その旨、補足してください。
添付図では青色の行が重複するので、「重複してます」が表示されます。
Option Explicit
Public Sub 重複判定()
If check_dup() = True Then
MsgBox ("重複してます")
Else
MsgBox ("重複してません")
End If
End Sub
Private Function check_dup() As Boolean
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim yyyy As Long
Dim mm As Long
Dim dd As Long
Dim name As String
Dim count As Long
Dim rgY As Range
Dim rgM As Range
Dim rgD As Range
Dim rgNM As Range
Dim maxrow As Long
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
yyyy = sh1.Range("B3").Value
mm = sh1.Range("C3").Value
dd = sh1.Range("F3").Value
name = sh1.Range("F5").Value
maxrow = sh2.Cells(Rows.count, "A").End(xlUp).Row
Set rgY = sh2.Range("A2:A" & maxrow)
Set rgM = sh2.Range("B2:B" & maxrow)
Set rgD = sh2.Range("C2:C" & maxrow)
Set rgNM = sh2.Range("D2:D" & maxrow)
count = WorksheetFunction.CountIfs(rgY, yyyy, rgM, mm, rgD, dd, rgNM, name)
If count > 0 Then
check_dup = True
Else
check_dup = False
End If
End Function

ご丁寧にコードまで記載いただき、ありがとうございます。
とりあえず、エラーなく実行できました。ただ、重複が有っても、重複無しとしてメッセージが出て、データも追加されてしまいます。
Private Functionはまだ使ったことがないので、呼び出し方に間違いが有るのかも知れません。また、そもそも、Private Functionを記載する位置が悪いのかも・・・そのへんをもう少し調べつつ取り組んでみます。
No.5
- 回答日時:
No4です。
追伸
sheet2にフィルターがかかった状態でマクロを実行していませんでしょうか。フィルターがかかっていると、正しく動作しません。
フィルターを解除した後、マクロを実行してください。
No.4
- 回答日時:
No3です。
>ただ、sheet2に重複データが有っても、”重複してません”とメッセージが表示され、データも追加されます。上記のような関数の呼び出し方ではマズイのでしょうか?
呼び出し方はあっています。
sheet2に重複データがあっても、check_dupが重複と認識できていないようです。
sheet1,sheet2のデータがこちらの想定と違っている可能性が考えられます。
①sheet2のレイアウトは私が提示した画像と同じでしょうか。
年、月、日、担当のセルには、値が設定されtますか?
それとも関数式が設定されていますか?
②sheet1のB3,D3,F3,F5は値でしょうか。それとも、関数式でしょうか。
③重複する場合の下記項目の具体的な値を提示していただくことは可能でしょうか。
sheet1のB3,D,F3,F5
sheet2の重複する行のA列、B列、C列、D列の値
できれば、画像で提示していただければありがたいです。
No.2
- 回答日時:
No1です。
>worksheetfunction.matchでやってみましたが、~
Machは基本的に一つの条件を検索するための関数なので、今回のご質問内容に対して、わざわざMachを使う理由がわかりません。
ヒットしても、さらに他の条件をチェックする必要がありますし、二番目のヒット、三番目のヒットを探す必要が生じます。
>しかも不思議なことに、重複データが有る時には正しく~~
不思議ではありません。
シート関数でも、検索値が存在しない場合にはエラー表示になります。
ワークシート関数の場合、エラー値を返してくれればまだ扱いやすいのですが、エラーを発生させます。
ですので、エラー処理を加えれば、判定できないことはないでしょうけれど、上記の問題をどうするおつもりなのでしょうか?
もしも、ワークシート関数を利用するのなら、そのような面倒も無く、かつ、複数条件をまとめてチェックできるものをご紹介しておいたはずなのですけれど・・・???
回答有難うございます。
WorksheetFunction.CountIfsでの方法を例示頂きましたので、そちらで取り組んでみました。
ただ、関数の呼び出し方が悪いのか、記載する位置が悪いのか、いまだ思うように動いておりません。
これまで、Private Functionなどは使ったことが無いので、そのあたりをもう少し学習してみます。
No.1
- 回答日時:
こんにちは
>複数の一致データ(年、月、日、担当者)の検索方法がよくわかりません。
ループで回して各行をチェックする方式なら
IF A列が一致 And B列が一致 And C列が一致 And D列が一致 Then
みたいな形式でチェックすれば、判別可能と思います。
一気にチェックするのであれば、
WorksheetFunction.CountIfs
を利用して、(A列の範囲,A列の検索値,B列の範囲,B列の検索値・・・)として1以上の値が返れば重複していると判定できるのではないでしょうか?
https://learn.microsoft.com/ja-jp/office/vba/api …
A列が一致、B列が一致・・・の様に順番にチェックするため、worksheetfunction.matchでやってみましたが、worksheetfunctionクラスのmatchプロパティを取得できませんとエラーが出ます。しかも不思議なことに、重複データが有る時には正しく(?)追加データが入力されます・・・。
if 条件1 and 条件2 and 条件3 and 条件4 then
(メッセージボックスで警告)
else
(重複がない時に実行したいプログラム)
end if
としてあるのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- Visual Basic(VBA) VBA 別sheetからの転記なのですが 2 2023/05/22 15:55
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) 【Excel質問】別シートにある複数の同型の表から、同じ行項目にある数字を集計する 4 2023/02/16 00:14
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) このプログラムなんですがsheetにデータを置いて表示できるようにしてありますがsheetに101を 2 2023/02/23 20:13
- Excel(エクセル) エクセルの日付抽出 2 2023/02/03 15:02
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルマクロ:複数列 重複があった場合、メッセージと印入れる方法
Excel(エクセル)
-
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
-
4
Excel VBA 空白セルがあったらメッセージボックスで知らせたい
Visual Basic(VBA)
-
5
VBAでEmpty値って何ですか?
Excel(エクセル)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
8
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
9
EXCELで2列を参照し、重複するものを横に並べたい
Excel(エクセル)
-
10
条件に一致したときに画像を表示したいのですが・・。
Excel(エクセル)
-
11
エクセルでユーザーフォームの入力時に重複チェックしたいのですが・・・。
Excel(エクセル)
-
12
エクセルVBA:毎月名前が変わるエクセルファイルを毎月異なるフォルダから開く
その他(コンピューター・テクノロジー)
-
13
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
14
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
15
メッセージボックス 1度だけ表示したい
Excel(エクセル)
-
16
Excel VBAでオートフィルタで抽出した列データを別シートの最終行にコピーするには
Visual Basic(VBA)
-
17
エクセル 重複したデータを別シートに抽出させる
Excel(エクセル)
-
18
VBAで重複データを合算したい
Excel(エクセル)
-
19
VBAでのリスト不一致抽出について
Visual Basic(VBA)
-
20
エクセルのVBA 特定のセルでエンターキーでマクロ実行
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
【Excel VBA】 B列に特定の文字...
-
エクセルvbaについて教えてくだ...
-
エクセルVBAでデータ転記
-
URLのリンク切れをマクロを使っ...
-
Changeイベントでの複数セルの...
-
[ASP+SQL]絞込み済みのレコード...
-
リストビューのコンボボックス
-
Worksheet_Change(ByVal Target...
-
find next
-
1行づつデータを移動させたい
-
重複データの合算(VBA)
-
エクセル 2つの表の並べ替え
-
VBA 列が空白なら別のマクロへ...
-
Access VBA を利用 連番(+1...
-
エクセル VBA ユーザーフォー...
-
エクセルVBAにて =A1=B1とすれ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
【VBA】2つのシートの値を比較...
-
Changeイベントでの複数セルの...
-
VBAで指定範囲内の空白セルを左...
-
【Excel VBA】 B列に特定の文字...
-
データグリッドビューの一番最...
-
VBAで、特定の文字より後を削除...
-
文字列の結合を空白行まで実行
-
VBAを使って検索したセルをコピ...
-
二つのリストを比べて部分一致...
-
マクロについて。S列の途中から...
-
マクロ 最終列をコピーして最終...
おすすめ情報
回答有難うございます。
同一標準モジュールの冒頭にコードを記載しました。
(Private Function check_dup() As Boolean〜End Functionまで)
そして、下記のようにプロシージャに組み込みました。
sub 日計転記()
If check_dup() = True Then
MsgBox ("重複してます")
Else
MsgBox ("重複してません")
※ここに新たな日計データを追加する文を記載。
End If
endsub
これで実行すると、重複していない時には、メッセージが出て、日計にデータが追加されます。
(希望した通りの動作です)
ただ、sheet2に重複データが有っても、”重複してません”とメッセージが表示され、データも追加されます。上記のような関数の呼び出し方ではマズイのでしょうか?
ご親切にありがとうございます!
①sheet2のレイアウトは私が提示した画像と同じでしょうか。
年、月、日、担当のセルには、値が設定されtますか?
それとも関数式が設定されていますか?
②sheet1のB3,D3,F3,F5は値でしょうか。それとも、関数式でしょうか。
↑
同じレイアウトだと思います。
sheet1も2も、該当セルに関数はなく、sheet1に入力した値をsheet2に転記する仕様です。
③重複する場合の下記項目の具体的な値を提示していただくことは可能でしょうか。
sheet1のB3,D,F3,F5
sheet2の重複する行のA列、B列、C列、D列の値
できれば、画像で提示していただければありがたいです。
↑
B3は、今年は2022
D3は、当該月(今は10)
F3は、入力該当日(1〜31)
F5は、漢字で2〜3文字(鈴木とか佐藤とか)
画像を添付いたします。
度々のご回答、恐縮に存じます。
フィルターは、sheet1も2も使っておりません。
該当部分のソースを添付します。
(sheet1と2については、実際のシート名に変更してございます)
度々のご回答、恐縮に存じます。
フィルターは、sheet1も2も使っておりません。
該当部分のソースを添付します。
(sheet1と2については、実際のシート名に変更してございます)
Private Function check_dup() As Booleanの中も、下記のように修正済みです。
Set sh1 = Worksheets("個別日計入力")
Set sh2 = Worksheets("店舗日別明細")
何が問題なのか調べようと、色々と動作テストをしております。
If check_dup() = True Thenの、True を False にすると、「重複しています」が表示されます。
ということは、sheet2に重複データが有る時も無い時も、check_dup()の戻り値がFalseになっているということでしょうか?
重複か否かは、下記のような理解でいますが、それでよろしいでしょうか?
年月日および、担当が同一ものが有る・・・重複あり
年月日は同一のものが有るが、同担当のものはまだ無い・・・重複なし
出来ました!
ありがとうございます!!
sheet1の”月”を判断するセルが、”C3”になっていました。
正しくは、”D3”なので、そこを修正したら意図したように動きました!
何度もお手数をおかけしましたが、おかげさまで作業が前に進められます!!
最初のソースコードを付けてくださった回答をベストアンサーにしようと思います。