• ベストアンサー

Excel:相対参照で変数は使えますか?

こんにちわ くろすけです。 自身の力足らずで調べきらず、 皆様のお知恵ご拝借!お願いしたくカキコしています。 どうぞ、宜しくお願いします。 ご質問) sheet2のR1C1に=sheet1!R1C30 sheet3のR1C1に=sheet2!R1C30 というようにいれたいのです。 これを =(sheet(自身のワークシート-1)!R1C30) と言う形で表わせたら簡便でいいなと思うのですが Excelで可能でしょうか? つまり、表題のとおり相対参照時にシート名やR1C1の1の部分に 数式を入れられるのか、それとも数値しか入れられないものなのか、 ご存知の方がいらしたら その可否、また、方法について教えていただきたいのです。 やりたいこと) 1.目的としては、月ごとにシート分けしたデータ (x軸:時間、y軸:実績) について、 本月1日目に前月30日目のデータを参照したい。 2.できるだけマクロを使わず、 Excel表計算機能を利用してできる限り高速に計算を進めたい。 環境) windows2000,Excel97 アドバイスお待ちしております。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

シート名は、Sheet1、Sheet2、Sheet3・・・・・となっているとします。 下の式は各シートのR1C1(A1)に入力する算式です。 見易くするため4行で書いてますが、つなげて入力します。 =INDIRECT(    "Sheet"&(MID(CELL("filename",R1C1),FIND("Sheet",CELL("filename",R1C1))+5,3)-1)    &"!R1C30"    ,FALSE) 2行目は算式のあるシートのシート名を求め、『Sheet』の文字を除いた番号を求め『-1』しています。 >表題のとおり相対参照時にシート名やR1C1の1の部分に数式を入れられるのか・・・ 上の式で、シート名は数式で計算できるのが分かったと思います。 セル番地(例では"!R1C30")については、  "!R1C"&(29+1) のように書けるので、こちらも数式で表現できます。 >2.できるだけマクロを使わず、 >Excel表計算機能を利用してできる限り高速に計算を進めたい。 この方法が『高速』かどうかは不明です。 1つ前のシート番号を求めるのが一番面倒な感じです。1つ前のシート番号を直接手入力していたほうが速いかもしれません。 ※以下は参考に書いてみました。 Sheet1、Sheet2、Sheet3が1月、2月、3月に対応しているとします。閏年は別として、 =INDIRECT(    "Sheet"&(MID(CELL("filename",R1C1),FIND("Sheet",CELL("filename",R1C1))+5,3)-1)    &"!R1C"     &CHOOSE((MID(CELL("filename",R1C1),FIND("Sheet",CELL("filename",R1C1))+5,3)-1)          ,31,28,31,30,31,30,31,31,30,31,30,31)    ,FALSE) で各月(Sheet2からの)共通の算式になります。前月末日を自動計算しています。 1つ前のシート番号(SheetXのX)を返す次の算式をR1C100にセットしておくと、 (R1C100は邪魔にならない位置の意味です)   R1C100 : =(MID(CELL("filename",R1C1),FIND("Sheet",CELL("filename",R1C1))+5,3)-1) これで、   =INDIRECT("Sheet"&R1C100&"!R1C"&CHOOSE(R1C100,31,28,31,30,31,30,31,31,30,31,30,31),FALSE) のようにすっきり?書けます。

kurosukechan
質問者

お礼

お礼 大変遅くなってしまい誠に済みません。 大変丁寧なご回答有難う御座いました。 私の力量不足で上記を忠実に再現することはできませんでしたが お蔭様で、INDIRECT関数を使えるようになり、 目標どおりのものを作成することが出来ました 大変助かりました。 本当に有難う御座いました。

その他の回答 (1)

回答No.1

同じ式で参照先を切り替える、いわゆるポインタ的な方法だと思うのですがINDIRECT関数を使えばいいのではないでしょうか。

kurosukechan
質問者

お礼

お礼 大変遅くなってしまい誠に済みません。 アドバイス大変有難うございました。 INDIRECT関数を使い 目標どおりのものを作成することが出来ました 大変助かりました。 ありがとうございました。

関連するQ&A