INDEX関数を使った多シート参照でエラーが発生する問題について

このQ&Aのポイント
  • ExcelのINDEX関数を使って多シート参照をしようとすると、エラーが発生してしまいます。
  • 具体的には、=INDEX(('Sheet1:Sheet3'!C7:D8),0,0,0)のような構文を使用してもエラーが出ます。
  • HELP上では=INDEX((A1:C6,A8:C11),2,2,2)のような例が挙げられていますが、どうやら領域が多シートにまたがる場合はうまく機能しないようです。
回答を見る
  • ベストアンサー

またINDEXについてです

また失礼します、 INDEXです。 なんか変です。 Excel2003でINDEX(範囲,行番号,列番号,領域番号) の構文を使おうと思ったのですが、 =INDEX(('Sheet1:Sheet3'!C7:D8),0,0,0) は、おろか =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),0,0,ROW(A1:A3)) に、始まらず =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),0,0,1) どころか =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),1,1,1) すらも駄目で 数式バー内でPD9をしても#VALUE!になります。 勿論通常のセル表示上でも#VALUE!です。 HELP上では =INDEX((A1:C6,A8:C11),2,2,2) と、云う記載が挙げられているので =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),1,1,1) 位は行けて欲しいところなのですが… 領域が 多シートにまたがっては駄目なのでしょうか? ね~… 2007かも知れませんが、 昔多シート参照 克服した覚えがあるのですが、… 困りました。 ご教示をお願いします。 因みに =INDIRECT("Sheet1:Sheet3!$C$7",TRUE)は#REF! =OFFSET(Sheet1:Sheet3!C7,1,1,1,1)は#VALUE! になりました (※注:数式バー内でのPF9でも です)

  • Nouble
  • お礼率91% (1698/1856)

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

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

#3、5、cjです。 お礼欄へのレスです。 > 例えばVBA的に云うならば > With ThisWorkBook >   Set r = .Sheets(Array(1 to 3)).Range("C5:E7") > End With > 又は、 >   Set r = Array( _ >          Sheets(1).Range("C5:E7"), _ >          Sheets(2).Range("C5:E7"), _ >          Sheets(3).Range("C5:E7"), _ >          ) > なのです☆が… こういう書き方だと、如何にも成立している、動く、コードのように見えますから、 実際に試してしまう人もいると思いますが、 あり得ないですから、ご注意ください。 少し批判しておきますね。 貴方も回答者としてスレに参加することもあるのですから、 誤解を招く言動にはご注意を。 でもまぁ、言いたいこと、求めていることは理解できます。 VBAでも、Rangeオブジェクトにシートを跨ぐ範囲をSetすることはできません。 やるなら、Range型の配列変数に要素毎にSetするとか、 Collectionオブジェクトでシート毎にセル範囲をAddするとか、 ですけど、それでも 纏めて参照したり、関数やメソッドの引数やオブジェクトに指定したりできる訳ではありません。 ないものはない、と諦めるしかないです。 可能性あるとすれば、UDFやサブクラスということになりますが、 これも具体的なニーズに照らしてみないと何とも言えません。 > =CHOOSE(ROW(A1:A2),データ上期!C11:C16,データ下期!B11:B16) > =index(CHOOSE(ROW(A1:A2),データ上期!C11:C16,データ下期!B11:B16),,) > =CHOOSE(INDEX(ROW(A1:A2),,),データ上期!C11:C16,データ下期!B11:B16) > =CHOOSE(INDEX(ROW(A1:A2),,),INDEX(データ上期!C11:C16,,),INDEX(データ下期!B11:B16,,)) > はNG… そりゃあ、 ひとつひとつのニーズに ひとつひとつの各論として応えることは出来るでしょうけれど、 この件については、レスは控えます。 > 因みに今回は > QNo.8072926のla-life様回答向け配列数式用です。 それ、因み、じゃなくて、大前提、ですよ。 スレッドをLeadするのは質問者さんの役割ですから、 後から、そういうの出すのは心証を損ないかねませんので、 次からは最初に書くようにしましょう。

Nouble
質問者

お礼

有り難うございます。 やはり駄目なのですね。

その他の回答 (5)

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

#2、cjです。 一応、補足しておきますね。 例えば、A1:C1に以下の数式を貼ります。 =SUM(INDEX(CHOOSE(COLUMN(),Sheet1!$C$7:$D$8,Sheet2!$C$7:$D$8,Sheet3!$C$7:$D$8),0,0)) これは喩えであって、現実にはINDEX関数を使う必要がありませんけれども、 INDEX関数が配列を返していることは確認できると思います。 おそらく質問者さんはVBAのEvaluateメソッドで扱う配列について調べているのだと思います。 いわゆる普通の配列数式は、一つのセルにひとつの値を返すもの、だとすると、 今問題になっているINDEX関数で配列を返す、というのは、 複数のセルを選択した状態で数式をCtrl+Shift+Enterで確定するタイプの つまり配列を返す配列数式の話であろうとの認識で回答しています。 ワークシート関数の引数に、セル範囲を渡した時に、 その引数を、セル範囲として受けるか、配列として受けるか、 は、受け取る側の関数が決めること、ということだけ、念を押しておきます。 SUM関数のように至れり尽くせりで超Variantな関数こそレアな存在で、 多くの関数は、セル範囲専門、または、配列専門、ということなのです。 もしここに書いてあることの意味が解らないようでしたら、 SUM関数の仕様を調べるとか、SUM関数をUDFで自作してみるとか、 SUM関数をUDFで再現した人の話を聞く(読む)とか、してみるといいと思います。 もう一つ念を押しておきますが、 (A1:C6,A8:C11)のような書き方は ひとつのセル参照です。 ひとつのセル参照の中に複数の領域が含まれています。 paramArrayで複数の引数を列挙しているのとは全くの別物です。 "A1:C6,A8:C11"で、ひとつのセル参照、ひとつのセル範囲、 なのであって、ふたつの範囲をくっつけている訳ではありません。 ワークシート関数についても、 オブジェクトを扱っているのか、非オブジェクトを扱っているのか 区別しないと、今回のような誤解が生じてしまうということなのかも。 以上です。

Nouble
質問者

お礼

有り難うございます。 VBAを知ってまた伸びれた気がします。 にしても ParamArray これも面白いですね、 初めて見ました。 感謝します。 因みに今回は QNo.8072926のla-life様回答向け配列数式用です。 多シート間にまたがる範囲の選択的取得 これがテーマです。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

>=INDEX(('Sheet1:Sheet3'!C7:D8),0,0,0) は、おろか SUM、AVERAGE、COUNT関数などの一部の関数を除けば、INDEX関数を含めて多くの関数の参照範囲に串刺し集計の範囲を指定することはできません。 =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),0,0,ROW(A1:A3)) に、始まらず そもそもINDEX関数やOFFSET関数は(どちらかというと珍しい方のケースですが)、第二引数以下の部分を複数選択しても配列数式と認識されません(配列を返しません)。 >=INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),0,0,1) どころか =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),1,1,1) すらも駄目で 数式バー内でPD9をしても#VALUE!になります。 勿論通常のセル表示上でも#VALUE!です。 そもそも「(」と「)」で複数の範囲をくくって1つの参照範囲のようにできる関数は限定されています。 例えばSUM関数で複数の範囲をカンマでつないでカッコでくくると1つの範囲として認識しますので、2003までのバージョンでは引数の制限以上の範囲を指定することができます。 また、例外的にRANK関数ではカッコでくくった複数の範囲を1つの範囲のように取り扱うことができますが一般的な使い方ではありません。 >HELP上では =INDEX((A1:C6,A8:C11),2,2,2) と、云う記載が挙げられているので =INDEX((Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),1,1,1) 位は行けて欲しいところなのですが… 上記のカッコでくくって複数の範囲をカンマでつなぐという特殊なケースの場合(SUM関数やRANK関数の場合でも)、同じシート以外の範囲は1つの参照範囲として認識できない仕様になっていますので、ご質問のような状況が発生します。 いずれにしろ、配列数式で対応する場合でも関数によって配列が利用できるものもあれば、配列として認識されないものもあるわけです。 さらに参照範囲についてもセル範囲同士を文字列結合した配列を数式の「参照範囲」にできる関数(例:MATCH関数)もあれば、できない関数(COUNTIF関数など多くの関数)もありますので、基本的には試行錯誤してご自分で利用できる範囲を調べて、対応するしかありません。

Nouble
質問者

お礼

有り難うございます。

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

こんにちは。お邪魔します。 #1さんのご回答で答えになっていると私は思っていますが、 納得されていないようなので、、、。 > 領域が 多シートにまたがっては駄目なのでしょうか? はい、駄目なのです。 > =INDEX(('Sheet1:Sheet3'!C7:D8),0,0,0) この構文の第一引数は、セル範囲または二次元の値配列ですが、 ひとつのセル範囲またはひとつの二次元の値配列です。 SUM関数の串刺し合計のように二段階配列は指定できません。 'Sheet1:Sheet3'!C7:D8 これはセル範囲への参照ではなくて、 二段階配列(要素が二次元の値配列)として引数に渡されていますが 関数の側で受け付けません。 おそらく、セル範囲への参照として渡しているつもりなのでしょうが セル範囲はシートのChildですからシートをまたげる訳ないですよね。 複数領域を指定するセル範囲への参照、といった場合、 その参照は、(A1:C6,A8:C11)のように ひとつのセル参照の中に複数の領域が含まれている という考え方が妥当です。 ワークシート関数でのセル参照(値配列ではない!)は そのまま、参照文字列としてVBAでのRangeの引数に使えるものですが Set r = Range("'Sheet1:Sheet3'!C7:D8") という風に書いてみれば、これが矛盾していることは解ると思います。 RangeのParentはSheetですから、 省略している親オブジェクトは、この世のものではないですよね。 で、 今回の課題は =INDEX(CHOOSE(2,Sheet1!C7:D8,Sheet2!C7:D8,Sheet3!C7:D8),2,2) のように列挙して扱うことになるかと思います。 # VBAの方、補足読みました。少し時間ください。

Nouble
質問者

お礼

何時もお世話になります、有り難うございます。 例えばVBA的に云うならば With ThisWorkBook   Set r = .Sheets(Array(1 to 3)).Range("C5:E7") End With 又は、   Set r = Array( _          Sheets(1).Range("C5:E7"), _          Sheets(2).Range("C5:E7"), _          Sheets(3).Range("C5:E7"), _          ) なのです☆が… ところで、 =CHOOSE({1,2},シート2!C11:C16,シート1!B11:B16) これ、面白いですね 有り難うございます。 また、学ばせて頂きました。 でも =CHOOSE({1,2},データ上期!C11:C16,データ下期!B11:B16) はOKですが、 =CHOOSE(ROW(A1:A2),データ上期!C11:C16,データ下期!B11:B16) =index(CHOOSE(ROW(A1:A2),データ上期!C11:C16,データ下期!B11:B16),,) =CHOOSE(INDEX(ROW(A1:A2),,),データ上期!C11:C16,データ下期!B11:B16) =CHOOSE(INDEX(ROW(A1:A2),,),INDEX(データ上期!C11:C16,,),INDEX(データ下期!B11:B16,,)) はNG… 困ったものです、とほほ

回答No.2

>串刺し合計ですね  有り難うございます。  しかしながら  これは配列数式に使えないので…  済みません。 そういう問題ではなくて、エラーと書いてあるところの数式をよく見てくださいということです。あなたは、「INDEX とは無関係に不可能な」記述をしようとしているのではないですか、と言っているのです。

Nouble
質問者

お礼

なるほど! そういう意味でしたか、 失礼しました。 これをINDEXに展開すると、どういうことになるのでしょうか? 済みません、宜しくお願いします。

回答No.1

エラー #VALUE! =sum((sheet1!a1:c3,sheet2!b2:d4)) 成功 =sum((sheet1!a1:c3,sheet1!b2:d4)) =sum(sheet1!a1:c3,sheet2!b2:d4) =sum(sheet1!a1:c3)+sum(sheet2!b2:d4)

Nouble
質問者

お礼

串刺し合計ですね 有り難うございます。 しかしながら これは配列数式に使えないので… 済みません。

関連するQ&A

  • エクセルのマクロで上のセルの数式を相対参照でコピーしたい(フィルみたいに)

    エクセル2002で以下のようなシートがあります。  | A | B | C | D --------------------------- 1 |  1| 10| 100| =C1-1 --------------------------- 2 |    |    |    |  ここで、B2に文字が入力されると、A1とC1とD1をコピー、B2が消されるとA2とC2とD2を消去するマクロを書きました。 現在以下のように書いていますが、これでは入力位置がB2だろうがB3だろうかB20だろうが、D2と同じ数式になってしまいます。B5に入力されたならD5の数式はC5-1にしたいのですが、このような入力をするにはどうすればよいでしょうか。 ちなみにD列の数式は本当はもっと複雑です(この数式ならTarget.Offset(0, -4).Value = Int(Target.Offset(-1, -4).Value + 1でもたぶんいい・・・はず・・・) オートフィルを使えば!と思いましたが、Target・・・では使い方がわかりません。 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target.Column <> 2 Then Exit Sub   //B列以外への文字入力はマクロ停止(のつもり) If Target.Value <> "" Then Target.Offset(0, -1).Value = Int(Target.Offset(-1, -1).Value + 1)   //A1に+1したものをコピー Target.Offset(0, 1).Value = Target.Offset(-1, 1).Value   //C2にC1をコピー Target.Offset(0, 2).Formula = Target.Offset(-1, 2).Formula  //D2にD1の数式をコピー◆ここが問題! Else Range(Target.Offset(0, -1), Target.Offset(0, 4)).ClearContents End If Application.EnableEvents = True End Sub

  • エクセルの=IF(INDEX式の列方向へコピー

    質問番号:6435996の続きです A列      B列             C列         D列   No.       名   前        住    所       金 額 1         佐藤   様       神奈川         5000 2         斎藤   様       東京都         1000 3         高橋   様       千  葉         2000 とエクセルで シート1に入力画面 シート2に印刷用の表を作成致しました。 質問番号:6435996で=IF(INDEX(シート1!B:B,6)="","",INDEX(シート1!B:B,6)) の形式の数式で シート1とシート2のリンクが完成致しました。 ここから100件分のデータを追加する場合 行方向へコピーすると=IF(INDEX(シート1!D:D,6)="","",INDEX(シート1D:D,6)) とセル番号のように数式が変わるのですが 列方向にコピーすると数式がそのままになってしまいます。 列方向へコピーをする場合  =IF(INDEX(シート1!B:B,6)="","",INDEX(シート1!B:B,6))を =IF(INDEX(シート1!B:B,7)="","",INDEX(シート1!B:B,7))のように コピーをセル番を変えて連続で行いたいのですが方法が分かりませんので 宜しくお願いします。

  • INDEX関数で値が正しく表示されません

    Sheet1のメルマガ配信日とそのクリック数、注文数が書かれている表から、クリック数のランク付けをSheet2に呼び出しています。 数式は下記の通りです。 Sheet2!B2=LARGE((Sheet1!$B$3:$B$7,Sheet1!$D$3:$D$7),A2) Sheet2!C2=INDEX(Sheet1!$A$1:$A$7,LARGE(INDEX(((Sheet1!$B$3:$B$7=B2)+(Sheet1!$D$3:$D$7=B2))*ROW(Sheet1!$A$3:$A$7),),COUNTIF($B$2:$B$6,B2)-COUNTIF($B$2:B2,B2)+1)) ※Sheet2!A:Aはユーザ定義「0"位"」 Sheet2!C2の数式のどこを直せば正しく表示されますでしょうか? 現時点では、下記の"Sheet2"の通りに表示されます。 どなたかよろしくお願いします。 "Sheet1"    A    B     C      D    E 1       リンク1       リンク3 2 配信日   クリック数  注文数  クリック数  注文数 3 20080101   10    5       7     2 4 20080115   15    2       45    15 5 20080201   20    3       20    4 6 20080215   10    4       80    5 7 20080301   12    5       20    7 "Sheet2"   A   B     C 1 順位 クリック数 配信日 2 1位   80  20080215 3 2位   45   20080115 4 3位   20   20080115 5 4位   20   20080301 6 5位   20   #REF!

  • ExcelのINDEX関数がうまく参照出来なくなってしまいました

    Excel2000を使用しています。 引き継いだファイルの関数がうまく表示できなくて困っています。 元に戻したいのですが、どのようにしたらもとにもどせるでしょうか? sheet1で、sheet2の住所録を参照して、該当番号に合う住所が表示されています。 Sheet1の数式が入る場所は「=INDEX(住所,A1)」となっています。 A1には、1~300の数字が入っており、その数字を参照して該当住所が表示されるようになっています。 しかし、なぜか280番台以降の住所が、#REF!でうまく参照出来なくなってしまいました。 仕方ないので、関数の挿入でINDEX関数を挿入して、 =INDEX('sheet2'!I1:I300,A1) と入力したら、1~300までの住所はうまく表示出来るようになったのですが、 もとの数式の通りに「参照している部分を”住所”」と表示したいのですが、どのようにしたらいいのでしょうか? 他のINDEX関数を使っているセルは、=INDEX(電話番号,A1)のようになっています。 分かりにくい説明ですみません。よろしくお願いします。

  • INDEX関数を組み合わせた数式で、入力の無いときに「#VALUE!」

    INDEX関数を組み合わせた数式で、入力の無いときに「#VALUE!」を表示させたくない。 度々お世話になっております。 こちらで教えて頂いた数式で、シートの一部に画像のようなものを作ってみました。 Y14とY15に入れる数字によって、組み合わされた文字がAI14に文章になって表示される仕組みです。 AI14に入れている数式は 「=INDEX($Y$3:$AH$3,1,Y14)&"で"&INDEX($Y$11:$AB$11,1,Y15)」となっています。 以下右方向に、AJ15,AK15,AL15・・・と、それに対応した数式をセル6個分に入れる予定です。 質問させて頂きたいのは、 入力がないときに「#VALUE!」を表示させたくないのです。 「=IF(○○○="","",INDEX(○○○・・・・」といった数式で解決できると思ったのですが、 INDEX関数が2つ組み合わされていますので、どのようにしたらよいかわかりません。 ただ、AI14~に表示される結果は、最終的に別シートのセルで参照されて、そちらのシートでプリントアウトさせますので、 そちらで「#VALUE!」が表示されないようにできるなら、それでもかまいません。 よろしくお願いいたします。

  • EXCEL VBA Array要素記述を変更したい

    プログラムの中にセルの値を直接記入しているところがあます。 Select Caseの行の 「Array("101", "102", "103", "104")」のとろです。 プログラムには101, 102, 103, 104ではなくB10~B13を使用したいのですが、うまくできません。 実際には4つだけではなく何十個もあって作業がわずらわしくなるのと、ブックごとに値が異なって 汎用性がないためです。 アドバイスいただけると助かります。 初歩的なことを質問しているかも入れませんが、よろしくお願いいたします。 シート名「表紙」のA列は部品番号(=シート名)でA10:101 A11:102 A12:103 A13:104とします。 これに対応したシートが4つあり、シート名は、「101」「102」「103」「104」とします。 使用者は「表紙」のシートで下記の作業を行います。 B6セルには製造番号(例:AM01-130012)を入力します。 B10~B13セルは「○」「×」を入力規則から選択します ○を選択した隣のC10~C13セルは部品個数で1~9の数値を入力規則から選択します。 ○を選択したのと同じ行のD10~L10、D11~L11、D12~L12、D13~L13セルに、 文字列を入れる場合と入れない場合があります。文字列は左のD列から順に入れます。 下記マクロにて「○」となっているシートのみコピーを作成します。(1) コピーしたシートすべてのB1セルに製造番号を入力します。(2) D列に文字列があれば、コピーした対応するシートの中のH3~P3セルへ貼り付けます。(3) C列の値によって、コピーした対応するシートの中のH3~P3セルの値をクリアします。(4) <表紙のシート>    A     B     C    D     E     F    G    H     I     J     K      L 5 6    AM01-130012 7 8 9  10 101    ×    9 11 102    ○    3 12 103    ○    8  A1-1  A1-2  A1-3  A1-4  A1-5  A1-6  A1-7  A1-8   13 104    ×    9 <プログラム> Sub TestSample() Dim c As Range Dim 製造番号 As String Dim flg As Boolean flg = True With ThisWorkbook 製造番号 = .Worksheets("表紙").Range("B6").Value For Each c In .Worksheets("表紙").Range("B10:B13") If c.Value Like "○*" Then ' ' (1) If flg Then '  初めてなら、○に対応したシートを「新しいブックにコピー」 .Worksheets(c.Offset(, -1).Text).Copy flg = False Else '  それ以外なら、○に対応したシートをアクティブブックの最後にコピー追加 .Worksheets(c.Offset(, -1).Text).Copy After:=Worksheets(Worksheets.Count) End If ' ' (2) ' ' コピーしたすべてのシート(のB2)に製造番号を書き込む Range("B1").Value = 製造番号 ' ' (3) ' ' ○の行のD:L を 対応するシートのH3:P3 へ貼り付け If c.Offset(, 2) <> "" Then '  D列が空でなければ Range("H3").Value = c.Offset(, 2).Value Range("I3").Value = c.Offset(, 3).Value Range("J3").Value = c.Offset(, 4).Value Range("K3").Value = c.Offset(, 5).Value Range("L3").Value = c.Offset(, 6).Value Range("M3").Value = c.Offset(, 7).Value Range("N3").Value = c.Offset(, 8).Value Range("O3").Value = c.Offset(, 9).Value Range("P3").Value = c.Offset(, 10).Value End If End If Next c End With ' ' (4) For Each 各シート In Worksheets With 各シート .Activate Select Case ThisWorkbook.Worksheets("表紙").Cells(Application.Match(各シート.Name, Array("101", "102", "103", "104"), 0) + 9, "C").Value Case "1" '1のときの仕事をする Range("I3:P3").Select Selection.ClearContents Case "2" '2のときの仕事をする Range("J3:P3").Select Selection.ClearContents Case "3" '3のときの仕事をする Range("K3:P3").Select Selection.ClearContents Range("J3").Select Case "4" '4のときの仕事をする Range("L3:P3").Select Selection.ClearContents Case "5" '5のときの仕事をする Range("M3:P3").Select Selection.ClearContents Case "6" '6のときの仕事をする Range("N3:P3").Select Selection.ClearContents Case "7" '7のときの仕事をする Range("O3:P3").Select Selection.ClearContents Case "8" '8のときの仕事をする Range("P3").Select Selection.ClearContents Case "9" 'do nothing Case Else End Select End With Next If flg Then MsgBox "部品番号が選択されていません。" Exit Sub End If

  • INDEXについて

    ご教授出来る方、お願いいたいます。 現状(状況) =INDEX(TimeCard演算結果!$1:$65536,38,10*ROW(A1)+COLUMN(A1)-1) 上記計算式を「関数の引数」で見ると、 配列:TimeCard演算結果!$1:$65536={} 行番号:38           =38 列番号:10*ROW(A1)+COLUMN(A1)-1 =10 上記計算式をDate2(シート名)のF3にリンクを張っております。 F3~F92まで下にドラックすると、列番号が10、20、30・・・900と 変化します。 やりたい事 この数式を使い、G3~G92まで下にドラックをした時に 列番号を最初だけ12、あとは22、32、42、・・・・と10間隔で 計算式を入れたいのですが、どう入力すれば宜しいでしょうか? 下にドラックした時に列番号が10間隔に増えている状態にしたいです。どのように列番号に数式を入力すれば、宜しいでしょうか? よろしくお願いいたします。

  • INDEX関数の値を合計する方法

    =INDEX(Sheet2!C5:C100,MATCH(Sheet3!B4,Sheet2!A5:A100,0)-1) という関数で出た値と、 =INDEX(Sheet2!C5:C100,MATCH(Sheet3!C4,Sheet2!A5:A100,0)-1) という関数で出た値の合計を、Sheet1のセルに入れたいのですが、どのようにすればスマートにいくでしょうか。(検索値である、Sheet3!B4,の部分が違います) =INDEX(Sheet2!C5:C100,MATCH(Sheet3!B4,Sheet2!A5:A100,0)-1)+=INDEX(Sheet2!C5:C100,MATCH(Sheet3!C4,Sheet2!A5:A100,0)-1) とすれば、合計は出るのですが、 Sheet3のB4、C4、D4・・・と、4の行を検索した結果の値を足していきたいのです。 そうなると、 =INDEX(Sheet2!C5:C100,MATCH(Sheet3!B4,Sheet2!A5:A100,0)-1)+=INDEX(Sheet2!C5:C100,MATCH(Sheet3!C4,Sheet2!A5:A100,0)-1)+・・・・・・・・ と、非常に長くなってしまいます。 他の関数でスマートに計算する方法はないでしょうか。

  • 条件で印刷シートを別けたい。

    データシート"みかん・りんご"に入力データがあり、"C列の'りんご(特定)''りんご(その他)''みかん(特定)''みかん(その他)'を検索。 (特定)がついているのは"D列"産地ごとにシート別に記入し、印刷をしたいのです。 ifを使っても2条件しか識別できないので、困っています。 りんご(長野)、りんご(青森)、りんご(その他)の3種類。 みかん(和歌山)、みかん(愛媛)、みかん(静岡)、みかん(その他)の4種類。 別々のシートに入力し印刷するにはどうしたら良いか教えてください。 コマンドボタンは1つにこだわりはないです。(エクセルの添付画面には、1つしかつけてないですが) 途中まで作成したマクロを載せています。 Range("A2").Select '仕入れ番号をこの次の"A3"セルより転記される。 Do '↓ 'アクティブセルを1つ下に移動 ActiveCell.Offset(1, 0).Select '空欄であれば、プログラムを終了する 'Trim関数は前後のスペースを消去する If Trim(ActiveCell.Value) = "" Then Exit Do End If '非表示セルは印刷の対象としない If ActiveCell.EntireRow.Hidden = False Then If ActiveCell.Offset(, 2).Value = "りんご(その他)" Then 'C列でリンゴかみかんの判断をする With Worksheets("りんご(その他)") 'シートへ記入 .Range("C18").Value = ActiveCell.Offset(0, 0).Value '仕入番号 .Range("C19").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("C20").Value = ActiveCell.Offset(0, 3).Value '産地 .Range("E3").Value = ActiveCell.Offset(0, 4).Value '購入日 .Range("F3").Value = ActiveCell.Offset(0, 5).Value '外観 .Range("G5").Value = ActiveCell.Offset(0, 6).Value '重量 .Range("H5").Value = ActiveCell.Offset(0, 7).Value '単価 .Range("D5").Value = ActiveCell.Offset(0, 9).Value '個数 '繰返し処理をしているので一度に印刷される。 .PrintOut End With ElseIf ActiveCell.Offset(, 2).Value = "りんご(りんご(特定)" Then With Worksheets("りんご(特定)") 'シートへ記入 .Range("C20").Value = ActiveCell.Offset(0, 0).Value '仕入番号 .Range("C21").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("C22").Value = ActiveCell.Offset(0, 3).Value '産地 .Range("E4").Value = ActiveCell.Offset(0, 4).Value '購入日 .Range("F4").Value = ActiveCell.Offset(0, 5).Value '外観 .Range("G7").Value = ActiveCell.Offset(0, 6).Value '重量 .Range("H7").Value = ActiveCell.Offset(0, 7).Value '単価 .Range("D7").Value = ActiveCell.Offset(0, 9).Value '個数 .Range("D8").Value = ActiveCell.Offset(0, 10).Value '送料 '繰返し処理をしているので一度に印刷される。 .PrintOut End With End If End If Loop End Sub

  • 連続印刷処理前に確認しOKしてから再開するマクロ

    連続印刷マクロを作成したのですが、印刷の手前で確認を入れたいので、その処理を教えてください。 エクセルの表は項目が14列あり、999行です。 印刷は、2種類のシートに分け印刷できるようになっているのですが、確認は1度だけを考えています。 Sub 印刷_Click() Worksheets("集計・印刷").Activate '作業シート名 Range("A2").Select '番号(001~999)をこの次の"A3"セルより転記される。 Do '↓ ※1度の作業で15個の番号を最大とします。 'アクティブセルを1つ下に移動 ActiveCell.Offset(1, 0).Select '1度の作業で15枚印刷する。 '空欄であれば、プログラムを終了する 'Trim関数は前後のスペースを消去する If Trim(ActiveCell.Value) = "" Then Exit Do End If '非表示セルは印刷の対象としない If ActiveCell.EntireRow.Hidden = False Then If ActiveCell.Offset(, 2).Value = "単品" Then 'C列で単品の判断をする。 With Worksheets("A") 'Aシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 '繰返し処理をしているので一度に印刷される。 .PrintOut End With ElseIf ActiveCell.Offset(, 2).Value = "複数品" Then'C列で複数品の判断をする。 With Worksheets("B") 'Bシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 .Range("C11").Value = ActiveCell.Offset(0, 23).Value '(1)min .Range("C12").Value = ActiveCell.Offset(0, 24).Value '(1)max .Range("F7").Value = ActiveCell.Offset(0, 25).Value '(2)min .Range("F8").Value = ActiveCell.Offset(0, 26).Value '(2)max '繰返し処理をしているので一度に印刷される。 .PrintOut End With End If End If Loop End Sub

専門家に質問してみよう