- ベストアンサー
エクセルVBAでつまずいています
- エクセルVBAで要素を追加し、条件に応じて値を書き込むコードがありますが、別の列にも同じような関数を設定したいです。
- 特定の条件に合致するデータを抽出し、新しいブックに貼り付けた後、追加項目の列に関数を設定していますが、その方法がわかりません。
- 具体的には、VLOOKUP関数を使用して、参照先の範囲に基づいて特定の条件を追加したいですが、うまくできません。どのようにすれば良いでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 マクロとしては、良く書かれていると思います。こういう段階は、VBAを実際にやっている人なら、誰でも経験があるコードだと思います。 とりあえず、回答ですが、 >A1形式ですが、例えば、 >参照先がD2、A2:J100として >=VLOOKUP(D2,A2:J100,5,FASE) そのような数式は、循環参照にはならないけれども、データ範囲と検索範囲が重なり合っているわけだから、ありえないことだけれども、以下のようになると思います。 For i = 1 To 4 Range("K1").Offset(i - 1).FormulaLocal = _ "=VLOOKUP(D2,A2:J100," & i + 4 & ",FALSE)" Next i >.FormulaR1C1 = _ >"=IF(RC[-25]=""AAA"",""aaa""," & _ >"IF(RC[-25]=""BBB"",""bbb""," & _ >"IF(RC[-25]=""CCC"",""ccc""," & _ >"IF(RC[-25]=""DDD"",""ddd"",""xxx"") なお、エラーが出るはずです。最後の部分は、こうなるはずです。 "IF(RC[-25]=""DDD"",""ddd"",""xxx""))))" ただ、数式なら、もう少し縮めて、 .FormulaLocal = _ "=IF(SUMPRODUCT(EXACT(I2,{""AAA"",""BBB"",""CCC"",""DDD""})*1),LOWER(I2),""xxx"")" としてもよいと思います。それから、プロシージャの中のコードは半分ぐらいに分けて、分散化させたほうがよいです。修正しやすくなります。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。#1のWendy02です。 もともと、数式の立て方の問題ですね。 =VLOOKUP(D2,A2:J100,5,FASE) '←FASE ではなく、FALSE ですね。 ↓ =VLOOKUP(D2,A2:J100,5,FALSE) 検索値 D2 は、A2:J100 の範囲の中にありますから、そこを直さないといけません。 5が始まりですから、 E -> J までですから、 (5)...(10) 実際は、 For i = 1 To 6 '←数を増やせばよいです。 Range("K1").Offset(i - 1).FormulaLocal = _ "=VLOOKUP(D2,A2:J100," & i + 4 & ",FALSE)" Next i ということになります。
お礼
Wendy02さんこんばんは。いろいろなことをお教えいただきありがとうございます。For~Nextの方法を教えていただきありがとうございます。 ただ、私の設定の仕方が悪いのか、4つの処理で終わってしまいます。これは For i = 1 To 4なので、当然の結果でしょうか。 参照先がD2、参照元A2:J100として(例が循環していました。スミマセン) =VLOOKUP(D2,A2:J100,5,FASE) =VLOOKUP(D2,A2:J100,6,FASE) =VLOOKUP(D2,A2:J100,7,FASE) と、結果により参照参照元の5、6、7列目を参照するということを、データののある最後の行までやっていきたいのですが、・・・。試してみたものの分かりませんでした。この例ではわかりづらいでしょうか?