みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル2003の質問です

エクセルでの質問です。
 シート1にA1商品コード、B1に商品名、C1に在庫数、D1に生産者とした時に
    A       B       C       D
1 商品コード 商品名  在庫数 生産者
2 1234   みかん1   3   太郎さん
3  456   みかん2   5   次郎さん
4  234    りんご1   1   太郎さん


となっていて、シート2に太郎さんシート3に次郎さんとした時にシート1にランダムにデータを入力
した時、シート2、シート3へ反映させる方法が知りたいです。
シート2、シート3の表はシート1と同じです。
と以前、質問して回答をいただき下記の数式を教えていただきました

シート1のE2セルには次の式を入力して下方にドラッグコピーします。

=IF(D2="","",D2&COUNTIF(D$2:D2,D2))

シート2やシート3での作業は次のようにします。
A1セルにシート2では太郎さん、シート3では次郎さんと入力します。後の操作はすべてシート2と同じです。
A2セルには商品コード、B2セルには商品名、C2セルには在庫数と項目名を入力します。
A3セルには次の式を入力してC3セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。
=IF(COUNTIF(Sheet1!$E:$E,$A$1&ROW(A1))=0,"",INDEX(Sheet1!$A:$C,MATCH($A$1&ROW(A1),Sheet1!$E:$E,0),COLUMN(A1)))

このような数式を使い大変便利に使用していたわけですが、行数が1000、2000、3000と増えて行く
うちにエクセルの再計算処理時間が増加化の傾向に有ります。
原因としては(多分)思い当たる事として、
1、シート1のデータが3000行になっている
2、シート2、3、4、5、の行数も1000行にしてある
3、登録シートがVBAで作ってある
4、パソコンが7年前に購入した物で古い(これに関しては変更できませんが)
ですので今度は、シート2の所を、使い
「A2」には商品コード、「B2」には商品名、「C2」には在庫数として
「A1」に「太郎さん」だったり、「次郎さん」だったりと入力すると、「A3」からシート1のデータ
を全て一覧で呼出し出来る様にする事が知りたいです。
なお、この表に関しては、実際に使用する物と項目の名称だけ違うだけで使用してます。
また、コピーしてオートフィルかけたりとかは自分は出来ますが、年配の方が使用するので
出来れば簡単にと思っています。
 よろしくお願いします。

投稿日時 - 2013-04-13 10:33:43

QNo.8040744

困ってます

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

まぁ、単純に速さ比べをするなら確かに
E1に
=IF(A1="","",COUNTIF(Sheet1!D:D,A1))
を記入、

E4に
=IF(ROW(A1)>$E$1,"",MATCH($A$1&ROW(A1),Sheet1!E:E,0))
以下コピー

A,B,C4以下は回答1の通り
といった具合にすることで、更に速くなります。

投稿日時 - 2013-04-13 22:31:12

お礼

回答ありがとうございます 
      すごく助かりました。

投稿日時 - 2013-04-16 18:24:37

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

 回答:No.1様の方法よりも更に再計算処理に要するコンピュータの負荷を軽減する事が出来る方法です。

 Sheet2やSheet3のレイアウトを少々変更しまして、例えばSheet2のA1セルに「生産者名:」、A2セルに「商品種類数:」等と入力して下さい。(このA1セルとA2セルに入力する項目名に関しては、別の適当な名称に変更されても構いません)
 次に、Sheet2のB1セルに「太郎さん」等の生産者名を入力して下さい。
 次に、Sheet2のB2セルに次の関数を入力して下さい。

=IF($B$1="",0,COUNTIF(Sheet1!$D:$D,$B$1))

 次に、Sheet2のA4セルに次の関数を入力して下さい。

=Sheet1!$A$1

 次に、Sheet2のB4セルに次の関数を入力して下さい。

=Sheet1!$B$1

 次に、Sheet2のC4セルに次の関数を入力して下さい。

=Sheet1!$C$1

 次に、Sheet2のA5セルに次の関数を入力して下さい。

=IF(ROWS($5:5)>$B$2,"",INDEX(Sheet1!$A:$C,MATCH($B$1&ROWS($5:5),Sheet1!$E:$E,0),MATCH(A$4,Sheet1!$A$1:$C$1,0)))

 次に、Sheet2のA5セルをコピーして、Sheet2のB5~C5の範囲に貼り付けて下さい。
 次に、Sheet2のA5~C5の範囲をコピーして、同じ列の6行目以下に貼り付けて下さい。

 最後に、Sheet2のコピーシートを生産者の人数分だけ複製して、そのコピーシートのB1セルに入力している生産者名を、各生産者の名前に変更して下さい。


 それから余談ですが、この方法でも未だ再計算処理時間が長いようでしたら、計算処理の設定を[自動]ではなく、[手動]にしておきますと、セルに入力しただけでは再計算が行われなくなりますので、1つのセルに入力する度に「再計算が終わるまで次の入力が行えない」という事態を避ける事が出来、入力を速やかに行う事が出来ます。
 そして、全ての入力を済ませてから、[F9]キーを押す事で、再計算処理をまとめて行う事が出来る様になります。

【参考URL】
 給与計算・事務代行カンパニー JIMCOMPANY【ジムカン】 > Excel教室 > 無料のWEB教室 > 計算方法の自動⇔手動
  http://www.jimcom.co.jp/excel/basic_setting/000001.html

 又もしも、たった1回の手動計算であっても時間が惜しいという場合には、ワークシート関数ではなく、Sheet1のE列の処理を廃止した上で、VBAを使った方法に変更する事も検討された方が良いかも知れません。

投稿日時 - 2013-04-13 15:03:02

ANo.2

ごめんなさい誤記ました。

シート2のE4に
=IF(COUNTIF(Sheet1!E:E,$A$1&ROW(A1)),MATCH($A$1&ROW(A1),Sheet1!E:E,0),"")
と記入、以下コピー

です。失礼しました。
実際にはこのシート2のE列は,状況に応じてA列でもどこでも好きな場所に配置して構いません。

投稿日時 - 2013-04-13 14:58:26

ANo.1

たとえば。

シート2のA1に「太郎さん」を記入
シート2のE3に「行位置」と記入
シート2のA3以降に「商品コード」「商品名」「在庫数」を記入

E4に
=IF(COUNTIF(Sheet1!E:E,$A$1&ROW(A1)),MATCH(Sheet1!E:E,$A$1&ROW(A1),0),"")
と記入、以下コピー

A4に
=IF($E4="","",INDEX(Sheet1!A:A,$E4))
を記入、右にコピー、下にコピー

といった工夫で軽減できます。

投稿日時 - 2013-04-13 13:53:13

あなたにオススメの質問