• ベストアンサー

マクロ VBA 配列内の比較方法

いつも大変御世話になっております。 WiindowsXP環境にある【D:\】フォルダ内に【マクロ.xls】があります。 そのファイル内にはボタンがあり、 ボタンを押すとマクロが稼働します。 そのプログラムには数字を格納する配列 FLAG(1 to 10) があり 毎回ボタン押すごとに入る数字が違います。 入る数字は 1 と 0 しか入らない仕組みです。 例) 1001101101 や 0110100110 のように毎回違います。 問題はその後のプログラムなのですが 都合上、 (1)3桁目と5桁目が1の場合 (2)4桁目と6桁目が1の場合 (3)4桁目と7桁目が1の場合 (4)7桁目と8桁目が1の場合 であってはいけないので それをチェックするプログラムを作成したのですが、 下記のような長ったらしい文になりました。 ---------------------------コード開始--------------------------- (省略) If FLAG(3) = 1 And FLAG(5) = 1 Then GoTo NG: ElseIf FLAG(4) = 1 And FLAG(6) = 1 Then GoTo NG: ElseIf FLAG(4) = 1 And FLAG(7) = 1 Then GoTo NG: ElseIf FLAG(7) = 1 And FLAG(8) = 1 Then GoTo NG: Else GoTo OK: End If NG: MsgBox "NG" Exit Sub OK: MsgBox "OK" (省略) ---------------------------コード終了--------------------------- もっと綺麗なコード設計は可能でしょうか? もしご存知の方がいらっしゃるようでしたら、お手数ですがご教授願いますでしょうか? 以上、何卒宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

書き方はいろいろありますが。 Ifのところは続けていますが、適当に_で区切ってください。 If (FLAG(3) = 1 And FLAG(5) = 1) Or (FLAG(4) = 1 And FLAG(6) = 1) Or (FLAG(4) = 1 And FLAG(7) = 1) Or (FLAG(7) = 1 And FLAG(8) = 1) Then MsgBox "NG" Else MsgBox "OK" End If

その他の回答 (1)

noname#144013
noname#144013
回答No.2

こんにちは。 判定処理が簡略化されたかどうか判りませんが(逆にめんどくさくなってる?) 判定方法の一例として、以下のような方法を考えてみました。 ■2進値のビットパターンに変換しての判定 乱数で作成する値が[0]と[1]の2種類だけですので、これは2進値の ビットパターンに置き換えることができます。 そこで、作成した乱数の配列を10ビットの2進値に変換し、これを 32ビット整数(Long型)の変数に格納しておきます。 上記の作成パターンと、下記のNGパターンとのAnd(論理積)をとり、 結果がNGパターンと同じであれば"NG"と判定します。  <NGパターン>  No. 16進値イメージ  2進値イメージ    NGパターンの組合せ   1   &HA0&      0010100000    3桁目と5桁目が1の場合   2   &H50&      0001010000    4桁目と6桁目が1の場合   3   &H48&      0001001000    4桁目と7桁目が1の場合   4   &HC&      0000001100    7桁目と8桁目が1の場合  <NG判定>  a) (作成パターン And NGパターン) = NGパターン → NG  b) (作成パターン And NGパターン) ≠ NGパターン → OK NGパターンは4つあるので、これも配列データとすればループ処理で 判定できると思います。 上記の方法であれば、今後、NGパターンの個数とかパターンが変更に なった場合でも、NGパターンの配列の中身と、ループ回数を変更する だけで対応可能かと思います。 以下は、上記の処理を行うサンプルマクロです。 宜しければ、検証してみて下さい。 ※下記マクロは『標準モジュール』に実装して下さい。 ■サンプルマクロ(リンク先参照) http://ideone.com/x0BM4 添付画像は、上記のサンプルを使用してシート上に作成パターン及び 判定結果を表示させた例です。 ※貼れていなかったり、見辛かった場合はすみません。 以上です。

関連するQ&A