質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

5169閲覧

重複データのチェック

hajihaji

総合スコア18

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/08/28 01:27

編集2018/08/28 01:34
Sub 重複() Dim rng As Range, r As Range, chkVal As Integer Set rng = Range("A1:A30") Set ist = Range("B1:B30") For Each r In rng For Each s In ist chkVal = Application.CountIfs(rng, r, ist, s) If chkVal > 1 Then s.Offset(0, 1).Value = "重複" End If Next s Next r End Sub ```リスト内でA列B列で複数の条件で重複がある場合にチェックが入るようにしたいのですが、 ひとつでも重複がみつかれば、それにかかる全ての行にチェックが入ってしまいます。 例:  A列 B列 一行目 ●  △ 重複  二行目 ●  △ 重複 三行目 ●  ■ としたいのですが、現状三行目まで"重複"と入ってしまいます。 なにが原因なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2018/08/28 01:35

今どのように処理しているのか書かないと原因も何もわかりまへん。
hajihaji

2018/08/28 01:46

すみません。コードの挿入を忘れておりました。
ExcelVBAer

2018/08/28 01:54

VBAでやる理由が分かりません。数式だけの問題でしょう?
guest

回答4

0

関数を分離してAND条件に変更したらどうですか?

変更前:
chkVal = Application.CountIfs(rng, r, ist, s)
If chkVal > 1 Then

変更後:
chkVal1 = Application.CountIf(rng, r)
chkVal2 = Application.CountIf(ist, s)
If chkVal1 > 1 And chkVal2 > 1 Then

投稿2018/08/28 01:52

paolo.ahn

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajihaji

2018/08/28 02:05

ご回答ありがとうございます。 変更してみましたがやはり同じ動作のままです。 なにがいけないのでしょうか。
paolo.ahn

2018/08/28 02:16

再度見たら、Loopが間違っていました。次のソースをコピーペで! Sub 重複() Dim rng As Range, r As Range, chkVal As Integer Set rng = Range("A1:A30") Set ist = Range("B1:B30") For Each r In rng chkVal1 = Application.CountIf(rng, r.value) chkVal2 = Application.CountIf(ist, r.offset(0,1).value) If chkVal1 > 1 And chkVal2 > 1 Then r.Offset(0, 2).Value = "重複" End If Next r End Sub
guest

0

ベストアンサー

ループの仕方がまずいかと。
行の固まり毎に処理をしたいという前提が崩れています。

下記のようにすればどうでしょう

Dim rng As Range, r As Range, chkVal As Integer set rng = Range("A1:B30") Dim arng as Range: set arng = Range("A1:A30") Dim brng as Range: set brng = Range("B1:B30") dim row for each r in rng.rows chkVal = Application.CountIfs(arng, r.Range("A1"), brng, r.Range("B1")) If chkVal > 1 Then r.Range("B1").Offset(0, 1).Value = "重複" End If next

投稿2018/08/28 01:47

編集2018/08/28 02:51
n_takapyon

総合スコア443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajihaji

2018/08/28 02:13

ありがとうございました。 うまくいきました。
hajihaji

2018/08/28 02:29

よく見ますと、重複のチェックが入る列がひとつ多いようです。 原因がわかりましたらご教示ください。
n_takapyon

2018/08/28 02:50

元のコードにかかれていたチェックのやり方を残したつもりですが。 やりた事は各行において、A列に現在の行のA列の値が存在していて、B列に現在の行の値が入っている事を確認することだと思ったのでそのように書きました。 あと、すみません、訂正が1箇所あります。 s.Offset(0,1).value = "重複"としていましたが変数がありませんので、r.range("B1").offset(0,1).value = "重複" に修正しておきます。
hajihaji

2018/08/28 03:40

ご回答ありがとうございました。 失礼しました私自身がわかっていませんでした。
guest

0

For Each を2回かけているのは何故でしょうか?

投稿2018/08/28 02:10

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単純にCellsを使って、

VBA

1Dim i As Long ' for文で使うため 2For i = 0 To 100 3 If Cells( i, 2 ).Value = Cells( i - 1, 2 ).Value Then ' 指定列が同じ値なら 4 Cells( i, 3 ).Value = "重複" 5 End If 6Next

みたいにしてやればいいのでは?

今回の場合は

A列, B列 の組み合わせも重要だから、もうちょっとひねる必要はあるが。

投稿2018/08/28 01:50

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajihaji

2018/08/28 02:14

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問