重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

教えて下さい!
以下のような表があります。

月|日|A担当|コード|サブ|コード|B担当|コード
5  1    田中   1   佐藤   5   鈴木   3
5  2    佐藤   5   鈴木   3   田中   1
5  3    鈴木   3   田中   1   佐藤   5
5  4    佐藤   5   鈴木   3   田中   1

行ごとにかぶっている人がいると”■行の○○さんが重複しています”といったようなメッセージが表示されるようにしたいのです。

行は30行ほどあります。
一つフォームのボタンを作り、それをクリックすることにより重複チェックのマクロが流れるようにするにはどうしたらいいのでしょうか?

A 回答 (7件)

こんばんは。



>私が下に記入してきたような表で列と列の間にいくつかの空白列が含まれる場合

こういう質問は、とても好きですね。(^.^)
頭の体操にはよいのですが、でも、今度こそ、自信がありませんね。

Sub 重複チェック3()
 Dim i As Long, j As Long, LastCol As Long
 Const 最初の行 As Long = 2
 With ActiveSheet
 LastCol = .Cells(最初の行, 256).End(xlToLeft).Column
  For i = 最初の行 To .Range("A65536").End(xlUp).Row
   For j = 3 To LastCol - 1
    If VarType(.Cells(i, j)) = vbString Then '※
     If Application.CountIf(.Range(.Cells(i, j), .Cells(i, LastCol)), _
      .Cells(i, j).Value) > 1 Then
      MsgBox .Cells(i, 2).Value & " 日に " & _
      .Cells(i, j).Value & "さんが重複しています。"
     End If
    End If
   Next j
  Next
 End With
End Sub

解説:
If VarType(.Cells(i, j)) = vbString Then

これで、文字列の時だけ、引数を取るようにしました。でも、その間の場所が空白ならともかく、全角空白では、これではダメですね。例えば、全角文字列だけしか検索値に取らない、という場合は、その部分が、

If .Cells(i, j).Value Like "[ぁ-钁]*" Then

ということになるかと思います。
試してみてください。
    • good
    • 0
この回答へのお礼

御礼が遅くなってしまい申し訳ありません。
あれから色々試行錯誤を繰り返しながら、やっとこ出来ました◎
何度もすみませんでした。
ありがとうございます。

お礼日時:2005/07/15 11:24

froma_a さん、こんばんは。



>田中   佐藤   鈴木   吉田

今度は、3列目から、6列目までですから、前回の理屈からすれば、ひとつ手前までです。しかし、とびとびではありませんので、Step はひとつずつだから、書かなくて良いですね。だから、

# For j = 3 To 5 Step 2

の部分を、このように替えてあげれば、良いことになりますね。

 For j = 3 To 5

試してみてください。

この回答への補足

御回答ありがとうございます。
返事が遅くなって申し訳ありませんでした。

もう一つ質問してもいいですか?

例えば私が下に記入してきたような表で列と列の間にいくつかの空白列が含まれるとする場合、「この列とこの列を見て重複しているかチェックする」といった、参照する列を指定したマクロにする場合はどうしたら良いのでしょうか?
本当度々の質問ですみません。

補足日時:2005/07/01 11:41
    • good
    • 0

froma_aさん、こんばんは。



>”1日に田中さんが重複しています””5日に佐藤さんが重複しています”といったようなメッセージを表示する場合、どうしたらよいのでしょうか?

なるほど、そういう意味なのですか!
それでは、私の解釈が違いましたね。難しく考えすぎました。

”5日に佐藤さんが重複しています”
なお、これは、4日目ですね。

'----------------------------------
Sub 重複チェック2()
 Dim i As Long, j As Long
 Const 最初の行 As Long = 2
 With ActiveSheet
 For i = 最初の行 To .Range("A65536").End(xlUp).Row
  For j = 3 To 5 Step 2
  If Application.CountIf(.Range(.Cells(i, j), .Cells(i, 7)), _
   .Cells(i, j).Value) > 1 Then
   MsgBox .Cells(i, 2).Value & " 日に " & _
      .Cells(i, j).Value & "さんが重複しています。"
  End If
  Next j
 Next
 End With
End Sub
'-------------------------------------

  For j = 3 To 5 Step 2

なお、ここの部分は、もっと列が多いときは、現在は、7列目まで、人名が入れてありますから、そのひとつ手前、5列目までで良いわけです。最後はひとつしかありませんからね。つまり、13列目まであるときは、11列目までで良いことになりますね。

この回答への補足

なるほど。。。
そっか!わかりました◎
まだまだ勉強不足ですね…(*_*;)

ちなみにこれが以下の表だった場合はどの記述を加えたらよいでしょうか??

月|日|A担当|サブ|B担当|サブ|
5  1   田中   佐藤   鈴木   吉田
5  2   佐藤   鈴木   鈴木   佐藤
5  3   鈴木   田中   佐藤   鈴木
5  4   佐藤   鈴木   吉田   田中

2日が佐藤さんと鈴木さんが重複していますよね?
尚且つ、3日には鈴木さんが重複しています。

補足日時:2005/06/28 00:01
    • good
    • 0

>行ごとにかぶっている人がいると”■行の○○さんが重複しています”



A担当  コード  サブ  コード  B担当  コード

の「行ごとにかぶる」という意味は、日付を除いた、その組み合わせが全部同じである行ということだと解釈しました。

つまり、サンプルの表ですと、佐藤さんの5行目に当たりますね。

以下は、わたし流のコードです。一般的には、Dictionary を使う方法や、仮にVBAでも、#1さんのようなCountif を、シートの作業列を設けるのが普通です。
私は、あまり、シートの作業列を設けるのが好きではないので、もし、Dictionary の方法をお使いになりたければ、また、ご指摘ください。バブルソート法などのアルゴリズムを使う方法もありますが、仮にも、Excelですから、そこまでの必要性がないような気がします。VBAでも、Countif が使えたらよいのですが、配列を引数に取れません。

なお、このコードは、時系列から考え、下からチェックするようにできています。

'----------------------------------------------
Sub 重複チェック1()
 Dim i As Long, j As Long, k As Long
 Dim myData() As Variant, buf As String
 Dim rtn As Variant
 Const 最初の行 As Long = 2
 For i = 最初の行 To ActiveSheet.Range("A65536").End(xlUp).Row
  For j = 3 To 8
   buf = buf & "," & Cells(i, j).Value
  Next j
  ReDim Preserve myData(k)
  myData(k) = Mid$(buf, 2)
  k = k + 1
  buf = ""
 Next i
 For k = UBound(myData) To LBound(myData) Step -1
  rtn = Application.Match(myData(k), myData, 0)
  If Not IsError(rtn) Then
   If rtn <> k + 1 Then
    MsgBox k + 最初の行 & "行目の" & _
    Mid$(myData(k), 1, InStr(myData(k), ",") - 1) & _
    "さんが重複しています。"
   End If
  End If
 Next k
End Sub
'-----------------------------------------

この回答への補足

細やかな回答ありがとうございます。
とてもうれしいです。

一つ質問してもいいですか?
例えば、以下のように1行に重複している人がいた場合、

月|日|A担当|コード|サブ|コード|B担当|コード
5  1    田中   1   佐藤   5   田中   1
5  2    佐藤   5   鈴木   3   田中   1
5  3    鈴木   3   田中   1   佐藤   5
5  4    佐藤   5   佐藤   5   田中   1

”1日に田中さんが重複しています””5日に佐藤さんが重複しています”といったようなメッセージを表示する場合、どうしたらよいのでしょうか?
質問ばかりですいません。

補足日時:2005/06/27 22:35
    • good
    • 0

for文で行を順番進ませてA担当、サブ、B担当の内


等しい個所を検索して、ヒットすればその行と
ヒットした名前をメッセージボックスで表示させればいいんじゃないでしょうか?

ソースをここに書いても良いのですが簡単なのでがんばってください。

この回答への補足

回答ありがとうございます。
色々と考えてはみたのですが、中々うまくいきません。
まだ初心者なもので…すいません。

ソースを書いていただいてもよろしいでしょうか?
そこから勉強させていただきます。

補足日時:2005/06/27 22:36
    • good
    • 0

マクロで確認する流れとしてはこんな感じでしょうか。


 ・A担当の情報を取得
 ・サブ、B担当と比較、同じ人が居たら表示。
 ・サブの情報を取得
 ・B担当と比較、同じ人が居たら表示。
 これを行の数だけ繰り返す。(For~else でくりかえす)
 (行数は、先に数えておいたほうが良いですね。)

・自分で確認するだけならピボットテーブルを使って
項目の数を数え、二個以上の重複がないかみるほうが楽かと思います。

担当の数が限られているなら、行のラストに各担当の名前が使われる回数を”COUNTIF”関数で数えても良いと思います。

それぞれの方法はEXCELLのヘルプを参照ください。

この回答への補足

回答ありがとうございます。

マクロで確認する流れとしましては以下のような形だと思います。
・1行目に記載されている名前を取得
・重複している場合エラー”1行目の○○さんが重複しています”
・重複していなかった場合、そのほかの行(2行目以降)を重複チェック

表自体がすでに出来上がっているため、できる限りそれを生かしチェックを行いたいと思っています。
ヘルプを見たり、他のサイトを見たりしたのですが不明確で…

補足日時:2005/06/27 22:38
    • good
    • 0

こんばんは



マクロではありませんが
条件付書式の数式が
=COUNTIF(A:A,A1)>1
書式で目立たせる(例えばセルのパターンを赤くする)
等すれば、入力中に重複に気がつきますし
どのセルが重複しているのかも
一目瞭然だと思いますが

いかがなものでしょうか?

ご質問の
>マクロを使用した重複チェックについて
に対しての回答では無いことをお詫びします o(_ _)o

この回答への補足

回答ありがとうございます。
条件付書式は私も考えました。
できれば今勉強中のマクロを使用し考えたいと思いまして投稿しましたので、これからもまだまだ学習していきたいと思います。

どうもありがとうございます。

補足日時:2005/06/27 22:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!