Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1692 / 13646 ツリー ←次へ | 前へ→

【72599】入れ子 杏子 12/8/28(火) 8:07 質問[未読]
【72600】Re:入れ子 kanabun 12/8/28(火) 9:06 発言[未読]
【72601】Re:入れ子 kanabun 12/8/28(火) 9:12 発言[未読]
【72609】Re:入れ子 UO3 12/8/28(火) 11:59 発言[未読]
【72610】Re:入れ子 UO3 12/8/28(火) 12:31 発言[未読]
【72611】Re:入れ子 杏子 12/8/28(火) 12:50 お礼[未読]

【72599】入れ子
質問  杏子  - 12/8/28(火) 8:07 -

引用なし
パスワード
   おはようございます。
すみませんが、今回も朝から急ぎの質問をさせていただきます。

Range("K" & intDataCnt).Formula = "=IF(I" & intDataCnt & "=J" & intDataCnt & ",""○"",""×"")"

上記のコードに右側のIF関数の"I"列と"J"列の部分に入れ子で

Range("I" & intDataCnt).Formula = _
  "=CONCATENATE(A" & intDataCnt & ",B" & intDataCnt & ",C" & intDataCnt & ",D" & intDataCnt & ",E" & intDataCnt & ",F" & intDataCnt & ",G" & intDataCnt & ",H" & intDataCnt & ")"

Range("J" & intDataCnt).Formula = "=VLOOKUP(I" & intDataCnt & ",オーダ明細!A:A,1,0)"

を組み込みたいのですが、そのまま入力してもエラーになってしまいます。

【72600】Re:入れ子
発言  kanabun  - 12/8/28(火) 9:06 -

引用なし
パスワード
   ▼杏子 さん:


>Range("I" & intDataCnt).Formula = _
>  "=CONCATENATE(A" & intDataCnt & ",B" & intDataCnt & ",C" & intDataCnt & ",D" & intDataCnt & ",E" & intDataCnt & ",F" & intDataCnt & ",G" & intDataCnt & ",H" & intDataCnt & ")"
>
>Range("J" & intDataCnt).Formula = "=VLOOKUP(I" & intDataCnt & ",オーダ明細!A:A,1,0)"
>
>Range("K" & intDataCnt).Formula = "=IF(I" & intDataCnt & "=J" & intDataCnt & ",""○"",""×"")"


プロシージャの最初で文字列定数を3つ宣言しておく

 Const ssI = "=CONCATENATE(A●,B●,C●,D●,E●,F●,G●,H●)"
 Const ssJ = "=VLOOKUP(I●,オーダ明細!A:A,1,0)"
 Const ssK = "=IF(I●=J●,""○"",""×"")"

と、
上の3行は
Range("I" & intDataCnt).Formula = Replace(ssI, "●", intDataCnt)
Range("J" & intDataCnt).Formula = Replace(ssJ, "●", intDataCnt)
Range("K" & intDataCnt).Formula = Replace(ssK, "●", intDataCnt)

と記述することができます。

本来は 別スレでもアドバイスあるように、
ループする必要などないと思いますけど。
また、
> =VLOOKUP(I●,オーダ明細!A:A,1,0)

一列のVLOOKUP 式ももったいないので、MATCH とINDEXでまとめる
ことが出来そうに思いますけど。



【72601】Re:入れ子
発言  kanabun  - 12/8/28(火) 9:12 -

引用なし
パスワード
   > 別スレ
excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=154454&rev=0

【72609】Re:入れ子
発言  UO3  - 12/8/28(火) 11:59 -

引用なし
パスワード
   ▼杏子 さん:

こんにちは

何度か示唆しているんですが、kanabunさんが記載された別板のトピ以外にも
同様のコードをベースにした質問が、私の知り限り、杏子さん、machikoさん、マリエさん。
もしかしたら、他にもいらっしゃったかもしれません。

同じ方ではなく、おそらく、同じ職場で、それぞれのパートを担当範囲として受け持って
分業で、対応しておられるのかもしれませんね。

でも、同じ方ではないとしても、これまでの一連のトピで、様々な回答者さんから
・文字列の記述の仕方、
 特に、その中での " という文字列の扱い および 定数 と 変数 の連結方法
・セル.Formula に格納する文字列の形は、どういうものなのか。

これらについて、それぞれのトピでわかりやすい説明がアップされています。
それを、個人のものにせず、グループでお仕事をしている皆さんすべての共有財産に
されると、非常にお仕事もはかどると思いますよ。

で、しつこいようですが、これら一連のコードで、ループさせながら式をいれている。
これは
・VBA処理しないで最初からシートに式をいれておく
・VBAでやるにしても、複数行のセルに、1行で式を埋めることができる。
・式ではなく、VBAらしく(?)値をセットすることもできる。

といった、いずれかの方式のほうがよろしいかと思いますよ。

【72610】Re:入れ子
発言  UO3  - 12/8/28(火) 12:31 -

引用なし
パスワード
   ▼杏子 さん:

こんにちは

↑でリコメンドしたことは横に置き、今回のテーマの扱い方としては
kanabunさんのコードのようなReplace処理が非常にわかりやすいですね。

ただ、杏子さんにとって、かえって理解がしにくい、あるいは既存のコード資産が
アップされたような構成になっていて、がらっと変更するのががこわいということも
あるかもしれません。

たとえば、以下のような手順で、セル.Sormula に入れる文字列を作られてはいかがでしょう。

1.まず、シートの上で、任意の行で、実際の式を入れる。
  これはできますよね。今回の例ではないですけど、仮に、それが
  =IF(I1=J1,VLOOKUP(I1,オーダ明細!A:A,1,0),"×")
  だったとします。
2.このセルを選択して、先頭に ' (クォーテーション) を入れて文字列にします
3.このセルを Ctrl/c 。メモ帳などに Ctrl/v で貼り付けます。
4.メモ帳の上で
  1)まず、変数部分を ●に変えます。
    =IF(I●=J●,VLOOKUP(I●,オーダ明細!A:A,1,0),"×")
  2)次に " を "" に変えます。
    =IF(I●=J●,VLOOKUP(I●,オーダ明細!A:A,1,0),""×"")
  3)次に ● と それ以外を & 連結します。
    =IF(I & ● & =J & ● & ,VLOOKUP(I & ● & ,オーダ明細!A:A,1,0),""×"")
  4)次にに、●以外の部分の最初と最後に " をつけます。
    "=IF(I" & ● & "=J" & ● & ",VLOOKUP(I" & ● & ",オーダ明細!A:A,1,0),""×"")"
  5)最後に、● を実際の変数名に変えます。
    "=IF(I" & intDataCnt & "=J" & intDataCnt & ",VLOOKUP(I" & intDataCnt & ",オーダ明細!A:A,1,0),""×"")"
5.こうして出来上がったものをコードの Range("K" & intDataCnt).Formula = の後にくっつけます。

  Range("K" & intDataCnt).Formula ="=IF(I" & intDataCnt & "=J" & intDataCnt & ",VLOOKUP(I" & intDataCnt & ",オーダ明細!A:A,1,0),""×"")"

【72611】Re:入れ子
お礼  杏子  - 12/8/28(火) 12:50 -

引用なし
パスワード
   kanabunさん、U03さん

焦っており一部コードがぐちゃぐちゃになっていました。

でもお二人の丁寧な解説のおかげでより理解を深めることが出来ました。
ありがとうございました。

1692 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free