プロが教えるわが家の防犯対策術!

何枚ものワークシートを「IF」で一覧表に
参照するまでは、なんとかできましたが、
次の問題点にぶつかってしまいました。

参照元のデータ途中に行を挿入しても、
参照先であるデータには「自動的に」反映されません。
手動で新たに設定しなおせば、もちろん反映はされるのですが、
元の行データを操作した際に、一覧のデータまで「自動的」に反映させたいです。
これを解決する方法はありますか?

A 回答 (6件)

元のシートに挿入された行が2行目以降でしたら、


数式のあるシートの一番上の数式が入っているセルの右下の小さな四角を
マウスポインタでポイントしますと+の形になります。
そこでWクリックしますと、セル参照も上から連続して入力されます。

あとはINDIRECTという関数を使ったり、ROWという関数を使ったりすれば上記の操作をしなくてもすみますが、
これは再計算関数なのでどこかのセルに何か入力したりするたびにExcelは再計算をしてくれて
結構もたもた重いファイルになってしまいます。

この回答への補足

度々のご回答、感謝!です!!

元のデータ行を増やした時に、一覧表の方は自動的に行が増える....というリアルタイムリンクのような事は、できても、データそのものが重くなってしまうという事ですね。

一覧表の方に各月少しずつ余行を持たせて対応するのが、一番簡単な方法でしょうか?

補足日時:2004/01/31 17:52
    • good
    • 0

一覧を表示するシートを算式で設定する方法は、ある意味限界があるでしょう。



#1の補足に、
>元のデータ行を増やした時に、一覧表の方は自動的に行が増える....というリアルタイムリンクのような事は、できても・・・

これは、算式が設定してあれば表示することができるかもしれませんが、自動的に行は増えないでしょう。
500行目まで一覧を表示するように算式を設定してあっても、1000行目に入力されたら表示できません。

『一覧』の内容が不明でこの質問の回答としては、 hirorin2004さん の『これもケースバイケースという事になります』が正解だと思います。一覧表の内容が分からないのが難点です。

例えば、列単位にまとめるなら、
  A2=INDEX('1月'!$C:$C,ROW())
  B2=INDEX('2月'!$C:$C,ROW())
  C2=INDEX('3月'!$C:$C,ROW())
のようにして、下にコピーします。書式をユーザー定義で『#;#;』としておけば、0は表示されません。
しかし、算式を登録していない箇所は表示できません。

INDIRECTを使えば、=INDIRECT("A2") や =INDIRECT("'1月'!A"&ROW()) ですが面倒ですね。


一覧という意味から、各シートをパターン的に処理することになるでしょう。
以下、下の例をVBAで表示してみます。

[シート1月]
   A  B   C   D
1 種類 項目1 項目2 1月計
2 あい  1  10  11
3 うえ  2  22  24
4 おか  4  44  48

のようなシートが12ヶ月あって、種類と月計をワークシート『一覧』に一覧表示してみます。

Private Sub Worksheet_Activate()
  Dim ichiranWs As String '// 一覧を表示するワークシートのシート名
  Dim Ws As Worksheet   '// ワークシート
  Dim WsCot As Integer   '// ワークシートカウンタ

  ichiranWs = ActiveSheet.Name

  For Each Ws In Worksheets
    If Right(Ws.Name, 1) = "月" Then
      WsCot = WsCot + 1
      '// このあたりは例
      Ws.Columns("A").Copy Destination:=ActiveSheet.Columns((WsCot - 1) * 2 + 1)
      Ws.Columns("D").Copy
      Worksheets(ichiranWs).Columns(WsCot * 2).PasteSpecial Paste:=xlValues
    End If
    ActiveSheet.Range("A1").Select
  Next
End Sub

※条件
 各月のシートはシート名『**月』

ワークシート『一覧』のコードウインドウに貼り付けます。
『'// このあたりは例』以下の3行のように処理すれば、簡単でしょう。特に算式は必要ありません。
このコードは、ワークシート『一覧』をアクティブにするたびにワークシート『一覧』を更新します。
    • good
    • 0
この回答へのお礼

詳しく教えていただいてありがとうございました。
シートの目的を明記していなかったので、ご回答いただくのに解りづらくて申し訳ありませんでした。
教えていただいたものを、少しずつ整理して勉強しなおしてみます。
ありがとうございました

お礼日時:2004/02/01 15:02

いえ、ROW関数とCOLUM関数については自動再計算関数かどうかわかりません。


混乱させてしまったようでしたらすみません。
ただ、INDIRECTは確かに自動再計算関数です。
    • good
    • 0
この回答へのお礼

前回の質問から引き続き度々のご回答、ありがとうございました。
自動再計算関数についても多々勉強になりました。
しかしデータがどんどん重くなっていってしまいそうですね、ちょっと欲張りすぎたかもしれません。
少し簡素なデータに押さえておこうと思います。ありがとうございました。

お礼日時:2004/02/01 14:59

ちょっと余談になってしまいますが、


先ほど自動再計算関数のことについて少し触れました。
下記は、Sheet1のA1の値を引っ張ってくる数式です。
Sheet1のA1の上にセルを挿入してみてください。
この数式は新しいA1の値を引っ張ってきてくれます。
列も同様です。

=INDIRECT("Sheet1!"&ADDRESS(ROW(),COLUMN()))

INDIRECTだけではなくてROWやCOLUMNも自動再計算関数じゃなかったかなと思います。
この数式には自動再計算関数が複数使われていますので、
この数式が1000ほどのセルに埋め込まれていますと、
どこかに数値を入力するたびに(自動再計算関数が3つだとして)3*1000=3000回の再計算がいちいち行われる事になり
スペックの充分ではないマシンにとって辛いものがあります。
    • good
    • 0

(1)例えば、Sheet1のA3に=Sheet2!A3といれ、Sheet1上でA10まで式を複写します。


これでSheet2のA3:A10までの値の変化は即座にSheet1のA3:A10の各セルに反映されます。
(2)Sheet2のA8で1行、行挿入するとSheet1のA8:A10は=Sheet2!A9とかに変化して以前の設定がおかしくならないようにしてくれます。
(3)しかしSheet2に行挿入したからといって、Sheet1にまで行挿入する機能(操作メニュー)はありません。
また関数式によっては、行挿入や削除はできません。
関数式は1つのセルの「値しか」設定できません。
(4)VBAで考えようとしましたが、INSERTメソッドで行挿入を行うのは簡単ですが、(A)INSERTされたイベントを捉えるとか(B)挿入された後からこのセル(この行)が挿入されたものかどうかの痕跡を調べる方法がないと思うので、VBAでも難しいようにおもう。
UsedRangeなどが増加することを捉える方法も
削除と挿入をされると見分けがつかない。
(5)「範囲」の定義とかを使ってどうにかできないか
と思うが判りません。
やや質問の主旨を推定しています。上記のような質問でなければ、お許し下さい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
関数式に対してちょっと欲張りな事をイメージしてしまったようです。
可能性をいろいろとご指摘いただいてありがとうございました。
今後の勉強の役立てます!

お礼日時:2004/02/01 14:54

> 一覧表の方に各月少しずつ余行を持たせて対応するのが、一番簡単な方法でしょうか?



データ入力が歯抜けになっていても、支障が無ければそれでいいと思います。
ただ、関数によっては合計範囲に空白があるとエラーになるものもありますので
ケースバイケースですね。

元のデータの並び順が整然としていなくても、
参照先のシートで整頓する事もできます。
詳細な情報がありませんので、これもケースバイケースという事になります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!