• ベストアンサー

VBAの複数条件の検索について

お世話になります。 VBAでEvaluate("SUMPRODUCT((棚卸!$A$1:$A$300=LEFT(C" & i & ",2))*(ISNUMBER(FIND(LEFT(D$1,3),棚卸!$B$1:$B$300)))*(ISNUMBER(FIND(D$2,棚卸!$C$1:$C$300))),棚卸!$F$1:$F$300)")という構文があります。 現在困っていることは、ISNUMBER(FIND(LEFT(D$1,3)のD$1をE$1、F$1、G$1としたいのですが、どのようにすればよいか分りません。 初歩的な質問で申し訳ありませんが、ご教示のほど宜しくお願いいたします。

  • dq03
  • お礼率100% (1/1)

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 仮に、   For i = 1 to 10    ' ご提示の記述を含む記述。   Next i  ということなのだとして、  i の増加に伴って   i = 1 -> D$1   i = 2 -> E$1   i = 3 -> F$1   i = 4 -> G$1     .   .     .   .     .   .  のように参照先を遷移させたい ということでしたらば、一例として  ret = Evaluate("SUMPRODUCT((棚卸!$A$1:$A$300=LEFT(C" & i & ",2))*(ISNUMBER(FIND(LEFT(" & Chr(67 + i) & "$1,3),棚卸!$B$1:$B$300)))*(ISNUMBER(FIND(D$2,棚卸!$C$1:$C$300))),棚卸!$F$1:$F$300)") という形で対処してみるのもアリかと思います。 (変数 i のstart値が 1 ではない場合は、  Chr(67 + i) の 67 を 【68 - start値】で求まる値 に 変えて調節します) 他に、 Evaluateメソッドの引数に充てるExcel数式の一部としてOFFSET()関数を用いて OFFSET()関数の引数をVBA側から指定する方法もアルかと思います。 以上、ご質問の趣旨に即しているか疑問はありますが、直接的な回答です。 (ご提示の記述がどのような条件でどんな結果を返すのか確認はしていません) もう少し全体として、ソース、条件、求める結果などのイメージがわかれば、 また違った方法も提示出来るかとは思うのですが。 ちょっと余談になります。、 私は Evaluateメソッド を使うことに(PCスペックの進化に伴い、今は、) 他に類を見ないほど積極的な人(?)なのですが、 反面、Evaluateメソッド のデメリットにも敏感な性質(?)だったりもします。 今回のように例えばメンテナンスにお困りになるようでしたら、 (すぐにいくつかの回答が得られるような)一般的なVBA記法にしておいた方が 何かと安心なのではないでしょうか? 今回のご質問とは別に、将来的に、ご検討されることをおすすめしておきます。 余計なことでしたら、すみません。

dq03
質問者

お礼

cj_mover 様 ご回答有難うございました。 私が行いたいことはcj_mover様のお答えで解決することができました。 確かにcj_mover様の言われている通り、特殊な記述になっているためメンテナンスができないといったこともあり、これからは一般的なVBA記法に基づいたプログラミングを行うよう努力したいと思っております。 本当に有難うございました。

関連するQ&A

  • Evaluateを使ってマクロに記述した関数に変数を使う方法

    Evaluateを使ってマクロに記述した関数に変数を使う方法 "=SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))" という関数を普段使用しています。 ふとこの関数をマクロで実行させようと思い(理由はありません、思い付きです)、 Range("D1").Value = Evaluate("SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))") としてみました。うまくいきました。 次に、 Dim i As Long For i = 1 To 5 Range("D" & i).Value = Evaluate("SUMPRODUCT((ISERROR(FIND(A1,B1:B100))=FALSE)*(C1:C100<=10))") next としてみました。ここで考えたのですが、 FIND(A1,B1:B100) この部分の「A1」を「i」を使って(つまりRange("D" & i)に連動させて)変数にすることは出来るのでしょうか? ご教示願います。 今回は単なる好奇心で普段使っている関数をマクロで表現できないかなと思った次第で、どうしても知りたい!必要だ!というわけではありません。 お暇なときにお願いします。

  • 文字列AかBを含むセル数をSUMPRODUCT関数で求める場合

    文字列AかBを含むセル数をSUMPRODUCT関数で求める場合 エクセル2000です。 A1:A10のセル範囲だとして =SUMPRODUCT(ISNUMBER(FIND({"A","B"},A1:A10))*1) とすると、同一セルにA、Bの両方があった場合、重複してカウントされてしまいます。 重複を除外するために、 =SUMPRODUCT(ISNUMBER(FIND({"A","B"},A1:A10))*1)-SUMPRODUCT(ISNUMBER(FIND("A",A1:A10))*ISNUMBER(FIND("B",A1:A10))) と、重複してカウントされた数から両方が存在するセルの数を減じて求めましたが、以下のようなより簡素な式でも求められことがわかりました。 =SUMPRODUCT((ISNUMBER(FIND("A",A1:A10))+ISNUMBER(FIND("B",A1:A10))>=1)*1) この式でなぜAB両方があるセルが重複カウントされないのかどうもわかりません。 ご教示いただければ幸いです。 なお、SUMPRODUCTではなく =SUM(COUNTIF(A1:A10,{"*A*","*B*"}))-SUM(COUNTIF(A1:A10,{"*A*B*","*B*A*"})) でもできることは存じておりますが、今回はSUMPRODUCTの疑問として質問いたしました。

  • Excel関数:文字を含む複数条件の合計 (2)

    「AA」の文字を含むA社の合計(=8)、しかし、そのうち「例外」の文字が含まれている場合(該当4) は合計から除く方法を教えていただけますでしょうか。      A          B    C   D    E    F   ――――――――――――――――――――――――― 1 |商品名        A社  B社  C社   A社  B社 2 |AA           1    1    1    1    1 3 |BB           1    1    1    1    1 4 |ab AA         1    1    1    1    1 5 |ab BB         1    1    1    1    1 6 |ab AA 例外     1    1    1    1    1 7 |ab BB 例外     1    1    1    1    1 8 |ab AA 12 例外  1    1    1    1    1 9 |ab BB 12 例外  1    1    1    1    1 つい先日、「AA」の文字を含むA社の合計(=8) については教えていただき解決することができました。 =SUMPRODUCT((ISNUMBER(FIND("AA",A2:A9)))*(B1:F1="A社")*(B2:F9)) 今度はこれに 「例外」の文字が含まれる値は合計せず、「4」を導き出す数式は可能でしょうか。 ※件数カウントではありません。 よろしくお願いいたします!

  • VBAで複数条件検索どうすればよいですか?

    【Sheet1】 発注日   品番    ロットNo      納品日   A     B      C          D 1 3/11  553  111-111-1111   3/17 2 3/11  123  222-222-2222 3 3/11  223  333-333-3333 4 3/12  123  444-444-4444   3/17 5 3/12  553  555-555-5555 【Sheet2】  納品日  品番   ロットNo    A    B     C 1  3/17  553  111-111-1111 2  3/17  123  444-444-4444 3  3/17  223  666-666-6666 エクセル2010・VBAで、【Sheet2】の品番とロットNoの条件に合う行を【Sheet1】より探し、【Sheet1】D列に納品日を入力し、その行のロットNoを明るい緑で塗りつぶす。 【Sheet2】の条件が【Sheet1】にないなら【Sheet2】の行のロットNoを、赤で塗りつぶす。 【Sheet1】は発注リスト、【Sheet2】は納品リストになります。 納品日は検索した日の日付になります。 Findを使い試行錯誤しましたが、思うように動かず、スキル不足で困っています。どなたか、ご教授願います。宜しくお願い致します。

  • エクセルで文字列検索の関数

    エクセルのワークシート関数で質問です。 「A1セルに、文字列、A、B、Cの何れかを含み、かつCDを含まない」ことを調べる関数です。 素直に、 =AND(ISNUMBER(FIND("A",A1)),ISNUMBER(FIND("B",A1)),ISNUMBER(FIND("C",A1)),NOT(ISNUMBER(FIND("CD",A1)))) と長ったらしく書けば取得できることはわかるのですが、もっと簡潔なやり方がありそうな気がします。 どうか教えてください。

  • 検索VBAを教えてください。

    VBAの勉強中です。 超初心者です。 シート1のB3に入力した値を、シート2のデータベースのC列から検索して、その検索した値と同じ行のD列・E列・F列の値を、シート1のB4・ B5・B6に表示したいと思います。 <シート1>    A     B     C     D 1 2     3       あああ ←ここを入力すると 4       aaa   ←表示したい! 5       bbb   ←表示したい! 6       ccc   ←表示したい! <シート2>    A    B    C      D     E     F 1           あああ    aaa     bbb     ccc 2           いいい      eee     fff      ggg 3           ううう      hhh      iii       jjj 4           えええ     kkk      mmm     nnn 5             おおお     ooo     ppp     qqq findを使えばいいと聞きましたが、使い方がよくわかりません。 例を読みましたが、どう自分に生かせばいいのかわかりませんでした。 どなたか未熟な私に教えていただけませんか? どうぞよろしくお願いいたします。

  • VBA複数セルで検索

    VBA複数セルで検索 VBA初心者です。 1つのシートにA列氏名1、B列番号1、c列エラー、D列氏名2、E列番号2と並んでます。 例) a*1001* *a*1001 a*1005*該当なし *a*1002 a*1000* *c*1003 c*1003* *e*1005 c*1005*該当なし *d*1004 以下続く(*はセル区切り) 氏名1と番号1の組み合わせが氏名2、番号2にあるかどうかチェックして ないものは、C列に「該当なし」とエラーを表示させたいです。 Find関数を使用してやってみたのですが、氏名と番号をセットで検索する方法がわかりません。 氏名と番号をくっつけて検索すればいいのでしょうか?

  • 複数条件の設定(EXCEL)

    次のような表を作っています。 A列     B列    C列      D列 営業担当  金額  サポート担当  金額  Aさん   ○○円  Dさん     ○○円  Bさん   ○○円  Eさん     ○○円  Cさん   ○○円  Fさん     ○○円  Aさん   ○○円  Fさん     ○○円  Bさん   ○○円  Dさん     ○○円 「C列がFさんで、A列がAさんかBさんの場合、D列を返す」 というものです。 SUMPRODUCTを使ってやってみたのですが、良くわかりません。 回答よろしくお願いします。

  • EXCELで複数条件の検索

    6人(A,B,C,D,E,F)で麻雀を打つことになりました。 全員と打てるようにするには6C4で 15通りの組み合わせが出来ます。 で、表を作りました。 C,D,A,Fの組み合わ(要するにA,C,D,F)の試合番号を求めるには、 どうすれば良いですか? ※A,C,D,Fの並びは順不同です

  • Excel 特定の文字を含む時に隣セルを表示した

    D列とE列は一覧データです。 A列とB列の文字列を含むものをE列で探して、見つかったらE列の隣のD列の文字列をC列に表示する関数を組みました。 ・関数 =SUMPRODUCT((ISNUMBER(FIND(A1,$E$1:$E$5)))*(ISNUMBER(FIND(B1,$E$1:$E$5)))*$D$1:$D$5) C列の数値が倍になっている箇所があるのですが理由がわかりません。 わかる方がいらっしゃいましたら教えていただきたいです。 例 A列  B列  C列  D列 E列 ○○  ××  111  111 ○○★×× ○○  ××  111   112 △△★◎◎ ○○  ××  111  113 ▽▽★☆☆ △△  ◎◎  112  114 ■■★◎◎ △△  ◎◎  112    115 ●●★××