[[20160208095135]] 『可変行列マトリクスの内容確認』(yuu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『可変行列マトリクスの内容確認』(yuu)

教えてください!

シートをまたがる
列・行数が可変する表(座標:マトリクスとでもいいますか)の
内容チェックをしたいのですが、良案が浮かばず困っています。

条件としては、
商品CDが縦(行)に 店舗CDが横(列)に入っていて、
その売り上げ値が座標軸に明記されている(ようするにピボットのようなもの)があります。

AのシートにはALLデータが
Bのシートには Aのシートの中から一部(例えば「あるグッズを販売している店舗」という条件があるもの)が
Cのシートには A-Bシートが・・・
入っているはずなのですが、
B+C=Aにならないらしく、相互チェックをしたいのです。

尚、Bのシート・Cのシートの行列の配置が
Aのシートとは(対象レコードが異なるため)同じものになりません。
よって、単純に「Vlook」や「Hlook」で確認することができないため、悩んでいるわけです。
※また、何か別の条件も入っているようで、並び順も安易に「番号順」にはなっていません。

しかも、座標になる前のデータからであれば相互チェックも簡単に思えるのですが、
既存のシステムから「座標データ」を直接取り出してしまっているため、それができません。
→システムの見直し・改修をしている時間と予算が厳しいため、
「チェックツール」で今を乗り切りたい!というのが、正直な話です。

良案があれば是非ご教示ください!
よろしくお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


Sub main()
'1行目(B1〜横)に店舗CD、A列(A2〜下)に商品CD
'CDに半角アンダーバー「_」を含まないこと
    Dim Dic, cl As Range
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each cl In Sheets("A").UsedRange
        If cl.Row <> 1 And cl.Column <> 1 Then
        Dic(Sheets("A").Cells(1, cl.Column) & "_" & Sheets("A").Cells(cl.Row, 1)) = cl.Value
        End If
    Next cl
    For Each cl In Sheets("B").UsedRange
        If cl.Row <> 1 And cl.Column <> 1 Then
            If cl.Value <> Dic(Sheets("B").Cells(1, cl.Column) & "_" & Sheets("B").Cells(cl.Row, 1)) Then
                MsgBox "Bシート不整合:商品CD=" & Sheets("B").Cells(cl.Row, 1) & ":店舗CD=" & Sheets("B").Cells(1, cl.Column)
                MsgBox "Aのデータ=" & Dic(Sheets("B").Cells(1, cl.Column) & "_" & Sheets("B").Cells(cl.Row, 1)) & ":Bのデータ=" & cl.Value
            End If
        End If
    Next cl
    For Each cl In Sheets("C").UsedRange
        If cl.Row <> 1 And cl.Column <> 1 Then
            If cl.Value <> Dic(Sheets("C").Cells(1, cl.Column) & "_" & Sheets("C").Cells(cl.Row, 1)) Then
                MsgBox "Cシート不整合:商品CD=" & Sheets("C").Cells(cl.Row, 1) & ":店舗CD=" & Sheets("C").Cells(1, cl.Column)
                MsgBox "Aのデータ=" & Dic(Sheets("C").Cells(1, cl.Column) & "_" & Sheets("C").Cells(cl.Row, 1)) & ":Cのデータ=" & cl.Value
            End If
        End If
    Next cl
    Set Dic = Nothing
End Sub
(mm) 2016/02/08(月) 17:45

mmさん

ありがとうございます。
確認してみます。

取り急ぎ、お礼まで。

(yuu) 2016/02/08(月) 18:05


 横から失礼します。

 マトリックスのシート上の場所が、それぞれ違うのは、元システムのからみで仕方がないとしても
 処理する上では、同じ場所、できれば 左上隅が いずれも A1 になっていたほうが、何かと扱いやすいです。
 チェック目的であれば、このブックをコピーした新規ブックの各シートの行削除、列削除を行い、A1から始まるような形式にして、その新規ブックを処理対象にするほうがいいと思います。

 まぁ、必須ということではありませんが。

 各シート上には、それぞれ、単一のマトリックスが1つだけあり、他には何も存在しないと考えていいのでしょうか?
 それと、縦横の項目を除く、マトリックスの中身は、数値でしょうか?文字列でしょうか?

 で、思い付きですけど、エクセルの統合機能を使い、B と C を統合。
 集計の方法を データの個数 にして統合した結果が、個数、すべて 1 ないしは 空白であること、
 統合した表の縦軸と横軸の項目が A の、それと(順番は異なっても)過不足なく一致する。
 このようなチェックをするのもいいかもしれませんね。

 さらに、マトリックスの中身が数値であれば、集計の方法を合計にしたものも作成し、
 それが(並びは別にして)A と過不足なく合致するというチェックもできそうですね。

 もちろん、必要ならマクロ処理で。

(β) 2016/02/09(火) 09:23


βさん

ご指摘ありがとうございます。

なるほど!
まずBとCを統合(+並び替え)して、Aと比較する・・・ということですかね?
※間違っていたらすみません。

その発想がありませんでした。

ありがとうございます。

(yuu) 2016/02/09(火) 11:02


mmさん

ご教示いただいたコードでは、
配列が異なる場合は全て「異なる」として、メッセージが表示される仕様ですかね?
それですと少し意図が異なってしまうようです。
※確認が遅れ、申し訳ありません。

(yuu) 2016/02/09(火) 11:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.