• ベストアンサー

エクセルで自動計算結果を抽出させたいのですが・・・

A列に1,000品の商品名、1行目に商品に対する項目がB列~N列にあったとして、それぞれの商品に対する項目には、すべて値があるとは限りません。 それで・・・ご質問ですが・・・    G列の値よりH列の値(ここはすべて値があります)が大きい商品の行すべてを  sheet2へコピーさせたいのですが、そのVBAのコーディングをどなたか教  えてください。 商品名 規格 価格 販売数(1)販売数(2) ・・・・・・ ○○○          ココ  と ココ を比較して条件に該当したらこの行をsheet2へコピー ○○○              ※条件は、販売数(1)< 販売数(2) ○○○   ・   ・   ・ VBAについては、最近勉強し始めたばかりで初心者です。まだ、どういう風に目的にあわせたコーディングすればよい分かりません。が、困ったことに上記のような処理で、3,500品目を5つのパターンで明日までに処理までにしてくれ!と上司より言われ困っています。丸投げでお願いして申し訳ございませんが、よろしくお願いします。

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

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

一応作ってみました。 他のパターンがあるみたいですが、コードの「***」あたりを修正すれば応用できると思います。 これくらい品目が多くなるとExcelを使っていることの是非を検討する必要があると思いますが・・・。Accessとかデータベースは知ってしまえば簡単ですよ。 '条件に合致したらSheet1→Sheet2に書き出し Public Sub Cyusyutu() Dim wk1, wk2 As Worksheet 'Sheet1,2 Dim rg1, rg2 As Range 'Sheet1,2のセルA1 Dim maxRow As Long 'データ行数 Set wk1 = Worksheets("Sheet1"): Set rg1 = wk1.Range("A1") maxRow = wk1.UsedRange.Rows.Count Set wk2 = Worksheets("Sheet2"): Set rg2 = wk2.Range("A1") Dim rw1, rw2 As Long 'Sheet1の行カウンタ Dim cl As Long '列カウンタ '*** 抽出 *** wk2.Cells.Clear 'Sheet2をクリア With rg1 '表題をコピー For cl = 0 To 13 rg2.Offset(0, cl) = .Offset(0, cl) Next 'データを抽出 For rw1 = 1 To maxRow If .Offset(rw1, 6) < .Offset(rw1, 7) Then '*** 抽出条件 *** rw2 = rw2 + 1 For cl = 0 To 13 '*** 指定すれば部分項目を抽出 *** rg2.Offset(rw2, cl) = .Offset(rw1, cl) '書き出し Next End If Next End With End Sub

rurucom
質問者

お礼

nishi6さんありがとうございます。nishi6さんの回答はよく参考にさせてもらってます。とりあえずyuziroさんの補足にも書いていたんですが、VBEにコーディングしたらウィルスになってしまい。取り急ぎ、VBAを使わずにかたづけてしまいました。やっと終わって先ほど帰ってきました。やっぱりVBAはもう少し勉強してからが良さそうですね。 今、本で勉強しているところです。まだ具体的なコーディングのところまでいってないのですが、すこしづつ仕組みが分かってきたとこです。 もっと勉強して、今度こんな無理難題な事を上司から言われても、軽くこなして見せ付けたいです。 とりあえず今日は、疲れたんで寝ます。おやすみなさい。 あっ!もちろん、作っていただいたプログラムは無駄にはしません!!早速、来週から暇になるんで、試してみます。これも勉強ですよね! それでは、また何かあったら宜しくお願いします。ありがとうございました。 あっっ!! もうひとつ! Accessとかデータベース????? 気になるアドバイスですねーっ! Accessってこんなことも出来るんですか?ちょっとこの辺も勉強してみまーすっ それとデータベースとは????? それでは、今度こそおやすみなさい。ZZZ。。。

その他の回答 (4)

  • yuziro
  • ベストアンサー率41% (5/12)
回答No.4

丸投げ質問に答えるのもどうか? という向きもありますし、 この上司もどうか? とも思いますが、一応回答を・・・・ 比較的、理解しやすく記述してありますので、 今後のVBA学習の参考にしてください。 Sub Macro1() Dim I As Integer, J As Integer, 商品数 As Integer 商品数 = 1000 Sheets("Sheet2").Activate Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Rows(1).Copy Sheets("Sheet2").Rows(1).Select ActiveSheet.Paste J = 0 For I = 1 To 商品数 If Sheets("Sheet1").Cells(I + 1, 7) < Sheets("Sheet1").Cells(I + 1, 8) Then J = J + 1 Sheets("Sheet1").Rows(I + 1).Copy Sheets("Sheet2").Rows(J + 1).Select ActiveSheet.Paste End If Next I End Sub

rurucom
質問者

補足

yuziroさんありがとうございました。実は、このプログラムをコーディングして保存したら、ウィルスが発見されました。となってしまい一瞬焦りました。 結局アンチウィルスソフトで削除して事なきことを終えたのですが・・・ とりあえず怖くなったんで、今回はVBAはやめました。自分でウィルスを作ってしまったようですね!というより壊れたプログラムをつっくたのでしょうけど・・・ はぁ!VBAってむずかしいですね!でもやっぱり、めんどくさがりの私にとっては、習得したいものです。これにめげずにこれからも勉強します。 また、なにかありましたら宜しくお願いします。 ところで・・・その後の処理として、ウィルスになってしまったファイルを削除してウィルスチェックもして「検出されませんでした」ってでたんですが、これで大丈夫ですよね?

  • 134
  • ベストアンサー率27% (162/600)
回答No.3

 関数でもできそうに思います。 例えば、g2<h2で、シート1のa2にある商品名を、シート2のa2に表示させるとき、このセルに下式を入力。 =if(sheet1!$g2<sheet1!$h2,sheet1!a2,"") ここで、g2≧h2のとき、何も表示されない状態になります。 このあと、オートフィルターで商品名(a列)を「空白以外」に設定することで、h列がg列より大きいものの一覧表ができると思います。  カーソルを右下にあわせ、ドラッグすることで、コピー可能なはずです。 ま、参考程度に…

rurucom
質問者

お礼

134さんありがとうございます。あんまり難しく考えないほうが早かったみたいでした。

  • pappa
  • ベストアンサー率31% (18/57)
回答No.2

再びです。 右上のボックスは「より大きい」ではなく、「以上」でした。失礼しました。 (危うく会社を首にするとこでした・・・?)

  • pappa
  • ベストアンサー率31% (18/57)
回答No.1

それほど複雑な処理ではないので、VBAでなくてもいいのでは? G列とH列の比較と言うことで、ここではI列に空白の列を挿入しましょう。 で、I列2行には(=H2-G2)として、それをすべてI列にコピーします。 次に、1行目を選択して(どの列でもOK)「データ」の「フィルタ」の「オートフィルタ」を選択します。 すると1行目にプルダウンのメニューが出てきます。 目的のI列のメニューを見て、「オプション」を選びます。 出てきたところの、左上のボックスに「1」、右上は「より大きい」を選び、OKボタン。 すると、この条件を満たすものだけが抽出されているはずです。 後は全部選択してコピーして、Sheet2にペースト。 手作業ですが応用が利くはず。 悩んでないで、すぐ始めないと間に合わないよっ!

rurucom
質問者

お礼

pappaさんありがとうございます。とりえずいろいろ考えず、この方法でさっさと片付けました。VBAはもう少し勉強してからにします。 ほんとに悩んでたら終わらないとこでした。とりあえず無事に終わりました。 いっぱい残業つけてきた!あはは・・ どうもありがとうございました。

関連するQ&A

  • エクセル データーの抽出

    エクセル2000を使用しております。 4000件ほどのデーターが縦に並んでおり 1個のデーターには12個の項目(L列)が入っております。 文字数は不規則なA列のデーターの 末尾 Hがある データー(A-L列全部)のみ抽出して別のシートに コピー処理を行いたいです。 VBAを使用してもいいのですが何か良い方法は ありますでしょうか?

  • Excelでのデータ抽出

    Excelに複数シートがあり、各シートには以下の内容が記載されてます。  A列 伝票No.  B列 日付  C列 担当者  D列 型番    ・    ・    ・ B列で任意の日付を検索し該当する値があれば、その行(A~D…列)を別シートにコピーし抽出したいのです。 VBAを使ってやりたいのですがどうしたらよいでしょうか? よろしくお願いします。

  • Excel VBA 外部データ(CSV)の自動読込について 

    VBAに関して昨日基本書を読み始めたばかりの初心者です。 業務の効率化が急務であるという手前勝手な都合により、 さっそくの他力本願で失礼とは思いますが 以下のケーススタディについてアウトラインだけでも助言をいただけないでしょうか。 帳票[yyyymmdd].csv ←末尾に年月日 日毎にCSVファイルが存在する A1:A10 B1:B10 C1:C10 の範囲の値を 期間集計.xlsx のそれぞれシート別のyyyymmdd列1行~10行にコピーする sheet1の[yyyymmdd]列1行:10行 ←A1:A10の値 sheet2の[yyyymmdd]列1行:10行 ←B1:B10の値 sheet3の[yyyymmdd]列1行:10行 ←C1:C10の値 過去数年分の日毎帳票を一括で自動処理したいと思い、 マクロの記録機能を使用したのですがどうしてもうまくいきませんでした。 特にわからないポイントが ・CSVファイルを開かずに参照する処理  (Excelで開かずにどうしてセルの範囲を指定できるのかという矛盾が生じてる気はするのですが・・・) ・自動的に帳票[yyyymmdd].csvを昇順に参照する処理 ・それをyyyymmddに対応した列にコピーする処理  以上のVBA処理についての助言をいただけますようよろしくお願いします。 Excelのバージョンは2007です。

  • オートフィルターで一つずつ抽出したものを....

    Bの行にオートフィルターをかけ、列の11で一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですがどうやれば良いですか? 見出し『商品』として抽出されるもの全て新規シートにそれぞれコピーしたいです。 VBAの場合、初心者ですのでわかりやすくお願いします。 わかる方には面倒な事ばかりで申し訳ありませんが宜しくお願いします。 エクセル2010です。

  • 複数シートからのセルの抽出

    複数シートからのデータの抽出をしたいのですが、教えてください。 [処理] あるEecelBookに含まれる全てのsheetに対して、シートの1行目とA列のあるセルの値が1995または1996である場合はその当該行をコピーし、新しく作ったsheetに集計する。 説明が下手で住みませんが、よろしくお願いします。

  • エクセルを用いて商品データを処理しています。

    エクセルを用いて商品データを処理しています。 ある特定の列に「-(ハイフン)]が含まれるものがあり、 その行を毎回手作業 検索などで見つけて その後 その行をコピーしたりしてなど下記処理を行っているのですが、 この作業をVBAなどで簡単に行える方法を教えて下さい。 ・行数は毎回不定。 ・列の数は固定で特定文字が含まれる列も毎回同じ。 ・特定の列には半角英数で製品の管理番号が入っており、  例えば0001とか00466など入っていて、その中で0001-0023みたいに[-]で  くくられたものを探して、その行をコピーしてから  上の行(元々の行)の特定文字が入っていた箇所に前の製品番号(0001)、  コピーして挿入した次の行にはうしろの製品番号の0023を列に入れ  それ以外の内容はもともとの行の内容をコピーしたものにする。 列の項目は、左から管理番号,商品名,管理番号,数量・・・固定項目で30項目ぐらい それぞれの行に半角8桁,全角半角混在,半角英数と一部に-くくり,半角・・・ 行数は処理するカテゴリによって増減あり。 このC列の管理番号に含まれる[-]でのくくりをバラバラにして処理みたいな感じです。 この繰り返しを行う方法です。 もちろん条件書式などで色つけしたりして探してはいるのですが、 コピーして書き換えて・・・の処理が多いので大変困っているのでお願い致します。

  • エクセルでの値の自動代入

    エクセルでワークシートのセルからでもユーザーフォームからでもいいのですが、違うワークシート上の表(列が項目、行が日付)の当日日付のセルにマクロで作ったボタンを押すと値が挿入されるような方法はありますか? アクセスで値の代入のようにできればいいのですが。 マクロでもVBAでもいいのですが、できる方法はあるでしょうか?

  • エクセルの抽出なんですが

    すみません、エクセルの抽出について 以前ここで質問させて頂いたんですが、また新たに別の抽出をしたいのですが・・・ VBAでも簡単であればいいのですが、 できれば数式で教えていただけないでしょうか? 内容ですが、 シートA(データ用)の B列に受注番号があります。 C列にその受注番号の詳細として商品名が入っており、 D列にはC列に対しての値段が入っております。 さらに、C列の最後には消費税の項目があり、 同じD列にその消費税の価格が入っています。 これが受注番号ごとに記載があり、 商品の個数は受注番号によって異なります。 これを基にシートB(抽出用)で 受注番号に対して(打ち込めば) その商品の値段を個数分全て抽出させ、最終は合計額が知りたいのですが、 でも、最後にある消費税は除外させたいです。 消費税の抜き方は個数に対して最後なのでこの条件から抜くのがいいでしょうか? 別の列にコード欄があり、消費税のコードは決まっていますので この条件を使ってできますでしょうか? オートフィルタとは違った考え方かなと思ったので こちらで質問させていただいたのですが 本当に申し訳ありませんが、どなたか教えてもらえないでしょうか? 宜しくお願いします。

  • excelで自動リンクを計算で作成

    お世話になります。 EXCEL2003で質問があります。 まず、用途ですが、365個(1年分)のエクセルファイルがあり、それらのファイルには必ず30シートありそれぞれのシートのフォーマットは決まっています。 それで、その中のそれぞれのシートの中から決まったセルの値を読み込みたいのですが、とりあえずの方法が 1.indirect 2.自動リンク の2種類があるかと思います。 しかし、これらにはそれぞれ問題点があります。 indirectでは、365個のファイルを全て開かなければいけない。(10ファイルほど開き吸い出したら値をコピー、開いたのを閉じて別ファイルを開き値を貼り付け・・・繰り返し・・・にしても量が多い) 自動リンクでは、ほしいデーターを選択するのがめんどくさい・・・ なので、自動リンクの形式である、 ='ドライブ:\フォルダ[ファイル.xls]シート'!セル を計算で作成しました。 さらにそれではやはりダメでしたのでコピーして値を貼り付けてもダメでした・・・ですが、その値となったセルでF2→enterとすると値が出ました!! しかし、読みたいセルが合計で8760行×30列=262,800セルあり、いちいちF2→enterなどできません(T_T) どうにかして、一度に変換?して一気に数値読み出しできませんでしょうか? 尚、申し訳ございませんがVBAがまだわからないためできれば使用したくありません。 不明な点がございましたらご指摘下さい。 よろしくお願い致します。

  • エクセルでの抽出処理について

    環境:windows7 EXCEL2010 社内で物流業務を行っているのですが Excelのシート1内には 列に項目(品番 品名 発注数 発注バラ数 出荷先) 行に(各数値、名称) が入っているのですがこれをもとに出荷表をある程度の整形をしたいと思っています。 (今までは手動でしたが対応に手間がかかる為) 具体的には シート2以降に同じレイアウトで印刷したいフォーマットに作っておきます (最大20社ほどなのでこのレイアウトはあらかじめ作成しています) シート一つにつき出荷先一つ作る前提で 出荷先A の内容をシート2(出荷先Bはシート3・・・出荷先Cはシート4)に転記したいと考えております。 ・シート2の具体的な転記 見出し(出荷先を代入)があり 列には 品番 品名 発注数 発注 バラ数  行には列に対応した出荷先の数量 を入れたいと思っています。 問題なのが 出荷先が行列にAAAAAA、BBBBBB、CCCの様にバラバラではなく連続して並んでいるのですが 発注する品目が増えると行数が増える為、転記するにも起点となる座標がなくて関数をどうしたらいいかと見出しの代入から含め正直わからない所です。 ここからどのようにしたらよろしいでしょうか? よろしくお願いいたします。 ※画像添付しておりますがVBAにていらない行列は削除する処理はいれており 列の項目については記載しました内容のみとなっております。

専門家に質問してみよう