- ベストアンサー
型が一致しません
いつもお世話になっております。 シートごとに元データの値でフィルタをかけ、 フィルタした各シートのD列の文字列を照らし合わせて整合性を確認したく、 下記のようなVBAをつくりましたが、ここで↓ If name_A <> name_B <> name_C <> name_D Then 型が一致しませんとエラーになります。 どなたかアドバイスをお願いいたします。 Sub 不整合チェック() 'フィルター Worksheets("Aリスト").Select If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter Range("B4").AutoFilter Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3") Worksheets("Bリスト").Select If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter Range("B4").AutoFilter Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3") Worksheets("Cリスト").Select If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter Range("B4").AutoFilter Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3") Worksheets("Dリスト").Select If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter Range("B4").AutoFilter Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3") '整合性チェック Dim name_A As String Dim name_B As String Dim name_C As String Dim name_D As String name_A = Worksheets("Aリスト").Cells(65536, 4).End(xlUp).Value name_B = Worksheets("Bリスト").Cells(65536, 4).End(xlUp).Value name_C = Worksheets("Cリスト").Cells(65536, 4).End(xlUp).Value name_D = Worksheets("Dリスト").Cells(65536, 4).End(xlUp).Value If name_A <> name_B <> name_C <> name_D Then MsgBox "データ不整合を発見しました。 処理を中断します。", vbCritical Exit Sub ElseIf mykouiji_kouji = name_nyukin = name_kokyaku = name_uriage Then MsgBox "問題なし。" End If End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
If name_A & name_B <> name_C & name_D Then MsgBox "データ不整合を発見しました。 処理を中断します。", vbCritical Exit Sub ElseIf mykouiji_kouji + name_nyukin = name_kokyaku + name_uriage Then MsgBox "問題なし。" End If name_A、name_B、name_C、name_Dは文字列のようですが mykouiji_kouji、name_nyukin、name_kokyaku、name_uriageは 数値?、文字列? 数値の場合の比較にしておきました 文字列なら ElseIf mykouiji_kouji & name_nyukin = name_kokyaku & name_uriage Then に変更してね
その他の回答 (4)
- 374649
- ベストアンサー率38% (203/527)
自分もあまり詳しくはありませんのではっきりとは解りませんが! 元データの値(数値)で文字列(文字)との整合性の確認をするというのが理解できません、値が文字列としたらただ単純に文字列が同じということを確認しているのでしょうか。 Dim name_A As String と定義しながら name_A=*******.Value と書いていますがname_AをStringで定義しているのに値はValue(数値)です、これでは全くデータ型が合っていないのでは。 整合性を問うのであれば問われる側と元データのデータ型は同じでなければ、if文などで条件比較をする場合目に見えている文字、数字などでなく コンピュータがどのように処理をするのかを理解するよう自分は心がけています。 条件分岐をする場合も一度に全部やるより一個ずつやって出来たら次を比較する、そのときの値の中身を必ず確認するという風にやってます。 参考になるか判りませんがちょっと思ったので書き込みました。
- imogasi
- ベストアンサー率27% (4737/17069)
>If name_A <> name_B <> name_C <> name_D Then のような書き方はVBでは出来ないはず。 判定したいことを文章で書いてご覧。 回答が出やすいでしょう。 A,B,C,Dで1つでも違うのがあればということなら、一発で判定するなら、 (A-B)^2+(B-c)^2+(C-D)^2+(D-A)^2 という2乗和の値が0で無い とかを判定するのも1方法か(受験数学を思い出したが)。 勘違いならご免。
#1です。 elseifの方は、補足の書き方だと全てが一致したときしかTrueになりません。一組でも同じ物がある時にTrueにするなら、AndをOrに変えます。 でも、元の式とは違いますよね? 質問の式を書き直すなら If name_A <> name_B And name_A <> name_C And name_A <> name_D And name_B <> name_C And name_B <> name_D And name_C <> name_D Then MsgBox "データ不整合を発見しました。 処理を中断します。", vbCritical Exit Sub ElseIf mykouiji_kouji = name_nyukin Or name_kouji = name_kokyaku Or name_kouji = name_uriage Or name_nyukin = name_kokyaku Or name_nyukin = name_uriage Or name_kokyaku = name_uriage Then MsgBox "問題なし。" End If になるはずです。 (というか、本来何がしたかったのかが良く判っていませんが…。)
If name_A <> name_B <> name_C <> name_D Then を力業で、 If name_A <> name_B And name_A <> name_C And name_A <> name_D And name_B <> name_C And name_B <> name_D And name_C <> name_D Then に変更する。これで、全部違うときを判定している。 質問で示された式は、やりたいことは判るけど、あっていません。 条件式が右からか左からかは、忘れちゃいましたが右からだとして、最初に name_C <> name_D が比較されます。比較の結果は「True」か「False」です。次に比較するのは name_B <> True 又は name_B <> False なので、型が一致しません。 (左からの時は、name_Aから考えましょう。)
補足
edomin2004さま さっそくのご回答ありがとうございます! 頂いた通り書き換えたのですが、エラーにはならないですが IF文が素通りされてしまい、比較がされないようです。。。 なにがいけないのでしょうか?? If name_A <> name_B And name_A <> name_C And name_A <> name_D And name_B <> name_C And name_B <> name_D And name_C <> name_D Then MsgBox "データ不整合を発見しました。 処理を中断します。", vbCritical Exit Sub ElseIf name_A = name_B And name_A = name_C And name_A = name_D And name_B = name_C And name_B = name_D And name_C = name_D Then MsgBox "問題なし。" End If
お礼
hige_082さま ご回答ありがとうございます!! 一発で出来ました~!!! また、お忙しい中アドバイスを下さいました edomin2004さま、imogasiさま、374649さま にも大変感謝しております。 皆様、本当にありがとうございました!