• 締切済み

EXCELでマクロを使った検索・一覧抽出の方法を教えてください。

社内文章の表を作成しているのですが、あまりにもデータ量が多く、関数での算出が難しくなってきたので、 マクロを導入したく思っているのですが、検索しても当てはまるものが無く、困っています。。。  | A  | B  | C  | D  | E  | F  | G  | H  | I  | J  | K  | 1|名称1|名称2|数量 |種類1|数量1|種類2|数量2|種類3|数量3|条件1|条件2|・・・ 2|    |    |    |    |    |    |    |    |    | (1) | (1) |・・・ 3|*****|*****|*****|***** |***** |*****|*****|*****|*****| (2)  | (2)  |・・・ 上記のような表があり、今までは関数にて、(1)のセルに検索条件を入力し、(2)のセルに「=SUMIF(D2:H2,A2(1),E2:I3)という式を入れ計算していました。 種類1~種類3に入力されている情報と(1)が合致したら、数量1~数量3を合計した値を(2)へ記入したいのです。 この検索条件が60項目あり、行数も2000行を超えているのですが、、全てのセルに関数を入れている状態です。

みんなの回答

回答No.5

#2さんへのお礼欄を読むと、各行ごとに合計をとれば良いというように見えます。 なので、まず3行目だけ考え もしD3がJ2と同じなら変数(合計)にE3の数量を足す もしF3がJ2と同じなら変数(合計)にG3の数量を足す もしH3がJ2と同じなら変数(合計)にI3の数量を足す と言う処理を行います。 で、この変数(合計)の値をJ3に書きこみます。 たとえば… If Cells(3, 4) = Cells(2, 10) Then a = a + Cells(3, 5) こんな感じとか。 後は、J列→xなどの変数にしてFor~Loopで60列 3行目→yなどの変数にして同じくForで2000列回せばOKだと思います。 aを毎回リセットするのを忘れずに!(a=0で良いかと) こんな感じでマクロを書いてみて下さい!

  • 135ok
  • ベストアンサー率34% (26/75)
回答No.4

No.3です。 私の回答で良ければ、次のような方法があるかと。 一例ですので、ご参考程度で。 添付資料を参照ください。 目的は、条件に合った値を表から検索し値を表示する。として 表は、添付資料の通り作成し C2 =IF(B2="","",IF(COUNTIF($E:$F,$B2),VLOOKUP($B2,$E:$F,2,0),IF(COUNTIF($G:$H,$B2),VLOOKUP($B2,$G:$H,2,0),VLOOKUP($B2,$I:$J,2,0))))    *B列が空欄の時は空欄。以外は、条件の値を種類1から3の中から検索し、値を表示。条件が無い場合はエラー。    *下にコピー これで、関数の数は60個になるので作業が早くなると思います。 指定の書式で検索しなければいけないのであれば、的外れの回答です。

ACO_AG
質問者

お礼

ありがとうございます。 ただ、表のフォーマット変更は残念ながら社内共通フォーマットの為、出来ないので、断念させていただきます。

  • 135ok
  • ベストアンサー率34% (26/75)
回答No.3

違っている気もしますがとりあえず。 的外れの場合は、スルーしてください。 J3 =IF(J$2="","",IF(J$2=$D3,$E3,IF(J$2=$F3,$G3,IF(J$2=$H3,$I3,""))))    *J2に入力した値に対し、各種類の中から値に一致するものを選び、右の値を表示する。    *表示させたい範囲にコピー

ACO_AG
質問者

お礼

回答ありがとうございます。 したい事はあっています。 質問が悪くすみません。 式の形状は違いましたが、このような式を 60列×2000列=12000セルに入力している為、データが重く困っています。。。 なので、これをマクロで実行するなどして、軽くする方法はないかなと。。。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問の表現がすっきりしないため、誤解箇所があるかもしれないが(下記最後に疑問点を書いた) 例データ A-E列 B,D列は他のデータ(=数量)が入っている場合(下記では数量データ略) X Y Z a aa bb s a s d f g h i a r r g a v a A,C,E列のaを検索できる。 こういう3列のどれかにaが見つかれば、該当有りとする問題か? ーーー そうならVBA云々を言うなら、検索操作のマクロの記録を採って勉強を始めたらどうです。 Range("A:A,C:C,E:E").Select Selection.Find(What:="a", ・・・ のようにすれば離れた列も1度に検索できる。 そのときある行でaが見つかったら、他の列(A、C,E)は見ず、次の行の検索に行くようにする。 このFindメソッドはFindNextと対で、検索終了のタイミングや見つからない場合の捉え方が、初心者には難しいよ。 見つかったらその行の集計したい列を足しこめば良い。 ーーー 上記aに当たる60語句について繰り返すのも良いが、処理時間が何分か、かかるかも。 60語句はどうしてシートに出されるのか(手入力か). 一斉にやるにはシートのどこかに60語句があるほうが良いが。 ーー 抜き出しはデーターフィルターフィルタオプションの設定で出来るのではないか。それをVBAにする。マクロの記録を採って見ればコードの骨格は判る。 条件は X Y Z a - - - a - - - a のようにする。-は空白で左詰防止のため入れたもので実際は空白。 結果 X Y Z a aa bb s a s h i a a v a のようになる。各行にaが最低1つ現れる。 ーーー 本格的にやるには、ACCESSのSQLか、その系統のエクセルのMSクエリが 良いと思う。SQL文でOR条件を書けるので、簡便だか、そこにいたる勉強が大変。 ======== 質問表現について =SUMIF(D2:H2,A2(1),E2:I3) の(1)とはなに? A2セルのこと?だったら(1)は書かないこと。ややこしい。 >、(1)のセルに検索条件を入力し 具体的にA2とか書いたら。 しかし、60語句を処理するときは、A2に順次語句を入れたのか 関数では1箇所をA2を見るが、A2は時どきに変化させ、そのときどき の結果を別行に出していくのは出来ないはず。この辺の今やっている 内容が、質問に説明されていない。 >検索条件が60項目あり この60項目=60語句(私の上記例でa)はどうして決まり、何処にあったのか。都度A2セルに入れていたのか? >あまりにもデータ量が多く、 >行数も2000行を超えているのですが とイメージ的に合わないが。言うほどの量でもないと思うが。

ACO_AG
質問者

補足

説明が悪く申し訳ありません。。。 >本格的にやるには、ACCESSのSQLか、その系統のエクセルのMSクエリが >良いと思う。SQL文でOR条件を書けるので、簡便だか、そこにいたる勉強が大変。 ⇒ACCESSですか。。。別途検討が必要ですね。 ============================ すみません、根本的に質問内容がおかしいですね。。。 検索条件はJ2,K2,L2...と60項目あり、下記表のように式を入力しています。 これが、検索条件60で2000行ですので、120000セルに式が入っている状態です。  |        J        |        K       |・・・ 1|    条件1(表題)    |    条件2(表題)    | 2|   検索条件(手入力)  |   検索条件(手入力)  | 3|「SUMIF(D2:H2,J2,E2:I2)」|「SUMIF(D2:H2,K2,E2:I2)」| 4|「SUMIF(D3:H3,J2,E3:I3)」|「SUMIF(D3:H3,K2,E3:I3)」| ・ ・ ・ 検索したい内容は、J3セルで説明すると、 D3がJ2と一致すれば、E3の値をJ3へ表示。 F3がJ2と一致すれば、G3の値をJ3へ表示。 H3がJ2と一致すれば、I3の値をJ3へ表示。 という風に検索したいのです。

回答No.1

マクロを組むよりも、アクセスにデータを流し込んだほうが 手っ取り早い印象を受けます。 エクセルのデータからなら、簡単にインポートできますし。

関連するQ&A

  • エクセル 別シートから一覧を抽出したい

    部品一覧表を作成しているのですが、2シートあり 1入力シート・2部品コードシートとあります。 部品コードシートにはB列に部品番号・C列部品名・D列部品番号・E列部品名と2行ずつ使い番号・品名がB~Wまで47行分入力されています。 B1:C47、D1:E47…と2列47行にはそれぞれ【A】、【B】、…とセルの名前の定義をつけました。現在【H】までありますが、今後増える可能性があります。 入力シートに、セルの名前を指定したときに部品コードのシートから 一覧を抽出したいのですが、どの関数を使えばよいのかわかりません。 入力シート                 |部品コードシート G   H                  | A Bコード C部品名  Dコード E部品名 4式入力用にあけています。     |1 1800  ユニットA   1501 電源A 5コード 部品名             |2 1801  ユニットB   1502 電源B 6                       |3 G4に関数を入れてG6~G52まで部品コードのシートA1~A47を一気に表示 させたいのです。部品コードシートの行数が変わることはありません。 マクロを使わないと、関数では難しいでしょうか?

  • エクセル関数 複数条件での抽出について

    エクセル関数について質問です。 行と列の交差する位置の値を取り出す方法に困っています。 添付の表があり、表の下の各セル、種類1(セルB15)、種類2(セルB16)、種類3(セルB17)に検索したい番号、記号をそれぞれ入力すると、3つの条件と合致する果物がセルB18に表示されるようにしたいのですが、 例)種類1「1」、種類2「2」、種類3「B」と入力→果物「りんご」 セルB18に=INDEX(C2:F13,MATCH(B15,A2:A13,0),MATCH(B16,B2:B13,0 ),MATCH(B17,C1:F1,0))の数式を入れるとエラー値 #REF! が返ります。 DGET関数も試しました。お手上げです・・ どうか教えていただけますでしょうか。エクセルのバージョンは2010を使用しています。 説明下手で申し訳ありません。よろしくお願いします。

  • ExcelのSUMIF関数についてです。

    ExcelのSUMIF関数についてです。 下記のような表を使用して、 商品コードが一致する商品数の合計をD2セルに入力したい。 (※A2,A3,A4...とA列の中でコードが一致したら、その数量の合計を出す)       A        B       C    D 1     商品コード  商品名   数量   計 2     PD0001    AAA     50 3     PD0019    BBB     20 4     PD0009    CCC     150 5     PD0001    AAA     1 6     PD1004    DDD     15 7     PD1027    EEE     50 8     PD0009    CCC     40 9     PD0019    BBB     30 :      :         :       : :      :         :       : sumif関数を使用して、 D2に =SUMIF(A:A,A2,C:C) を入力コピーすると     D     計 2   35 3    1 4   50 5   45 6    0 7    0 8    0 9    0  :    : :    : となってしまいます。     D     計 2   51 3   50 4   190 5   51 6   15 7   50 8   190 9   50  :    : :    : という出力にするにはどうしたらいいでしょうか? ちなみに、コードではなく商品名で D2に =SUMIF(B:B,B2,C:C) を入力コピーするとうまくいきます。 初歩的なことなのかもしれませんが、 商品コード数も数量もかなり膨大なものを計算するので困っています。 宜しくお願いします。

  • エクセルで複数sumifの検索範囲の連動

    画像のように太線での区切りごとの合計金額を算出したいと思います。 一旦品名ごとに お菓子Aは100円 お菓子Bは20円 ガムは… と小計を算出してから、ワンクッションおいてそれらを合計してもいいのですが、 紙面のスペースの関係上1セルで合計したいと思います。そこでD列のセルには =SUMIF(A2:A5,$A$16,B2:B5)*$B$16+SUMIF(A2:A5,$A$17,B2:B5)*$B$17+   以下略 =お菓子Aの数量*お菓子Aの単価+お菓子Bの数量*お菓子Bの単価   以下略 とSUMIFで品名ごとに数量を合計してから*その品の単価を足していきたいと思います。 そうするとこの場合一つのセルにSUMIFが四回使われ、検索範囲の設定が面倒です。 1セル中の全てのSUMIFの検索範囲を統一する便利な方法はないでしょうか。 或いは別の関数を使ったまったく異なる方法でも構いません。 どなたかご教授いただければ。

  • エクセルのVLOOKUP関数で…(複数条件?の抽出)

    ●シート2、A列に部品正式名称、B列に部品略称の一覧表(部品の種類は約500点) ●シート3、A列に略称、B,C,D,E,F,G列と続けて寸法などの詳細を記した一覧表 があります。 ●シート1に検索一覧表として、B列(B3~B8)は項目、セルC3~C8にVLOOKUPでシート3の情報が抽出されるようにしてあります。 C1で略称を入力し抽出するのはOKなのですが、正式名称で入力しても同じようにシート3の情報を抽出するようにしたいです。 (IFを使って思いつく関数を組合わせてみたりしたのですが、うまくいきませんでした(TT) できたら関数で何か良い方法ありますでしょうか? 宜しくお願いします。

  • エクセルである品名だけを抽出してその合計を算出したい

    エクセル初心者です。よろしくお願いします。 会社の表なんですが、A列に日付、B列に製品名、C列に数量、D列に単価、E列に金額の表があります。 B列の製品名には何種類もの製品があり、(例えばですが)プリンを抽出してそのプリンだけの合計金額を所定のセルに入力したいと思っています。 自分なりに色々関数を調べてみたのですがわかりません。 そのような計算式はないのでしょうか?教えて下さい。 お願いします。。m(_ _)m

  • SUMIF関数で、「ブランク以外を合計」を指定したい

    SUMIF(範囲,検索条件,[合計範囲]) の、検索条件部分に、 「セル内に数字、文字をとわず、とにかく何か入力されていたら合計する」 といった意味合いの条件を指定したいのですが、その方法がわかりません。 画像で説明させていただくと、 A2のセルにSUMIF関数を用いて、 文字が入力されているc,d,e列の数値を合計し、 90という結果が欲しい、ということです。 どなたかご教授をお願いいたしますm(__)m

  • excelのデータ抽出

    縦軸の条件と横軸の条件からデータを抽出する方法を教えてください。 以下のような表があります。    A  B   C   D   E  ・・・・ 1    0.5  2.5  3.1  5.5 2 40   2  5   10  3 3 55 4 35 1行およびA列の値を別セルに入力して、クロスするデータを出したいのですが、例えば別セル(1)に40と入力し別セル(2)に5.5と入力すれば、別セル(3)に3と抽出したいです。 また、出来れば別セル(2)に入力する値が表にない場合、入力した値より大きな値で一番近い値を読み取れればベストなんですか。 例えば別セル(2)に5.4と入力した場合には5.5の列を抽出 なにか良い方法はありますか? よろしくお願い致します。

  • エクセルで文字をカウントしたいのですが…

    どの関数を使えばいいのか分からなかったので質問させて頂きました。 例えばA1セル~D1セルに 1,2,3,4と入力した場合E1セルに「4」 1,1,1,2と入力した場合E1セルに「2」 2,2,3,4と入力した場合E1セルに「3」 となるような関数はないでしょうか? ようはA1,B1,C1,D1の4つのセルに何種類の数字が あるかをE1セルに出したいのです。 宜しくお願いします。

  • エクセルsumifで検索条件に月を指定

    購入した豆の帳簿をエクセルでつけている者です。 下の表で、sumifなどの関数を使って 購入した豆数量の月ごとの合計を出すことはできるのでしょうか? (1月は合計○個、2月は合計△個購入・・・という具合に) ----------- 別の質問http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1317382203で、 =SUMIF(A2:A5,">=2008/4/1",B2:B5)-SUMIF(A2:A5,">2008/4/30",B2:B5) のように検索条件に「年/月/日」を使う方法が紹介されていたのですが、 この表は次年度も使いまわしたいと考えているので、 検索条件に年の指定はしたくないのです。 sumifでは不可能なのかなと思い、 似たような質問http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1437742649 を参考にして、月のみを検索条件にする下の式を作ってみたのですが、 #VALUE!エラーが出てしまいました。 =SUMPRODUCT((MONTH(テーブル1[日付])=1)*テーブル1[豆数量]) --------- なにかうまい手はないでしょうか。ご指南ください。

専門家に質問してみよう