アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルのマクロで以下のシート1とシート2を比較して表を作成したいのですが
上手くいきません。

シート1は比較元データ、シートは例は一つですが、シート3・・・・と
ひとつずつ比較、それぞれシートを分けて印字したいです

① 比較元シート1の「氏名1氏名2」と比較先シートの「氏名1氏名2」を比較します。
(「氏名1氏名2」はセットで比較します)

② 氏名を検索、合致したら項目同士を比較します。→⑤、⑥へ

③ 氏名を検索し、比較先シートに該当なしならば、末尾シートに「キャンセル」と表示し、比較元シートの当該行を記入します。

④ 氏名を検索し、比較元シートに該当なしならば、末尾シートに「追加」と表示し、比較先シートの当該行を記入します。

⑤ 項目が全て合致の場合は①に戻り次の氏名1氏名2を検索します。
⑥ 項目が不一致の場合は「不一致」と表示し比較元シート、比較先シート1の氏名、不一致項目を2行に表示します。

比較した結果は、シート1とシート2の結果、シート1とシート3の結果といった風に、末尾のシートに追加していきます。
初心者です。(項目の並び順は変えられません)
宜しくお願いいたします。
似たマクロを見つけました。これを修正するとしたらどうしたらいいですか?

Sub test06()
‘  Dim t As Single
‘  t = Timer
  Dim myDic As Object
  Dim myV, myV2, myW, myX, myY
  Dim i As Long, uw As Long, uv As Long
  With Sheets("Sheet1")
    myV = .Range("A2", .Cells(Rows.Count, "C").End(xlUp)).Value
  End With
  With Sheets("Sheet2")
    myW = .Range("B2", .Cells(Rows.Count, "G").End(xlUp)).Value
  End With
  uv = UBound(myV)
  uw = UBound(myW)
  ReDim myV2(1 To uv, 1 To 1) As String
  ReDim myX(1 To uw, 1 To 1) As String
  ReDim myY(1 To uv, 1 To 1) As String
  Set myDic = CreateObject("Scripting.Dictionary")
  For i = 1 To uv
    myV2(i, 1) = myV(i, 1) & "!" & myV(i, 2) & "!" & myV(i, 3)
  Next i
  For i = 1 To uw
    myDic(myW(i, 5) & "!" & myW(i, 6) & "!" & myW(i, 1)) = i
    myX(i, 1) = "非対象"
  Next i
  For i = 1 To uv
    If Not myDic.Exists(myV2(i, 1)) Then
      myY(i, 1) = "再発行"
    Else
      myX(myDic(myV2(i, 1)), 1) = "対象"
    End If
  Next i
  Application.ScreenUpdating = False
  Sheets("Sheet2").Range("AF2").Resize(uw, 1).ClearContents
  Sheets("Sheet2").Range("AF2").Resize(uw, 1).Value = myX
  Sheets("Sheet1").Range("G2").Resize(uv, 1).ClearContents
  Sheets("Sheet1").Range("G2").Resize(uv, 1).Value = myY
  Application.ScreenUpdating = True
‘  Debug.Print Timer - t
End Sub

「初心者です!!至急教えてください。エクセ」の質問画像

A 回答 (1件)

こんばんは。


急いでいるということですが、内容を検証してみました。おそらく、これはしばらく時間がかかってしまうと思います。

質問を、VBAにそって考えながら、チェックしてみました。
マクロ自体は、問題なく作成できるとは思いましたが、その表自体に少し問題があるのではないかと思いました。

つまり、名前のキャンセルや追加に関しては、氏名 の比較では、問題があるように思われます。

おそらく実務で使うとなれば、本来、「一意の番号」の管理でないと無理だと思います。

確かに、Sheet1側には、グループ番号とNOはありますが、Sheet2 側は、単なる通し番号のみですから、比較はできません。

言い換えれば、絶対に同姓同名がないとは限りません。同じグループ内さえも、同姓同名の可能性もあります。そうすると、プログラムでは、どちらがどちらだとかは区別がつきません。これでは、マクロ処理では、間違った答えを導きだす可能性があることがわかりました。もう一度、考えなおしたほうが良いかもしれません。

なお、ご質問に出ている、VBAコードはまったく参考にはしませんでした。
    • good
    • 1
この回答へのお礼

ありがとう

有難うございます。確かにSheet1はグループ別に番号です。伝わりにくい書き方ですみませんが、Sheet2はグループ毎の塊です。他のグループのデータは混ざってません。例えばSheet2はGP1、Sheet3はGP3、Sheet4はGP2・・・といった具合です。GPの並びはランダムです。
もう少し、考えてみます。なにか方法があったらお知恵を貸していただけたら助かります。

お礼日時:2015/07/26 21:41

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