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も見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
エクセルマクロ:複数列 重複があった場合、メッセージと印入れる方法
Excel(エクセル)
-
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
Excel VBA 空白セルがあったらメッセージボックスで知らせたい
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
6
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
7
VBA 重複チェック後に値をワークシートに転記する方法を教えてください。
Visual Basic(VBA)
-
8
エクセルでユーザーフォームの入力時に重複チェックしたいのですが・・・。
Excel(エクセル)
-
9
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
10
エクセル 重複したデータを別シートに抽出させる
Excel(エクセル)
-
11
エクセルVBAにて、重複データ処理の高速化を実施したいのですが、いい方法はありますでしょうか? G列
Excel(エクセル)
-
12
VBA 重複文字列 色付け
Visual Basic(VBA)
-
13
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
14
VBA別シートの最終行の次行へ転記したい。
Visual Basic(VBA)
-
15
Excel VBA マクロ ある列の最終行迄を参照し、別の列の空白セルに値を入力したいです
Visual Basic(VBA)
-
16
VBA 別ブックからコピペしたいのですが、軽くしたいです
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
URLのリンク切れをマクロを使っ...
-
B列の最終行までA列をオート...
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
targetをA列のセルに限定するに...
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAコンボボックスで選択した値...
-
rowsとcolsの意味
-
期限を超えた日付に警告のメッ...
-
マクロ 最終列をコピーして最終...
-
データグリッドビューの一番最...
-
VBAで指定範囲内の空白セルを左...
-
ExcelVBAで配列2つを結合させ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
VBAコンボボックスで選択した値...
-
データグリッドビューの一番最...
-
セルに値が入っていた時の処理
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAで指定範囲内の空白セルを左...
-
マクロ 最終列をコピーして最終...
おすすめ情報
回答有難うございます。
同一標準モジュールの冒頭にコードを記載しました。
(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”なので、そこを修正したら意図したように動きました!
何度もお手数をおかけしましたが、おかげさまで作業が前に進められます!!
最初のソースコードを付けてくださった回答をベストアンサーにしようと思います。