- ベストアンサー
エクセルでデータ抽出
こんにちは、royroyです。 エクセルで、シート1の収支データの特定科目を抽出して シート2にコピーしたいのです。 シート1のデータは 日 付 科 目 収入 支出 5/1 食費 2500 5/3 衣服代 3000 5/3 雑費 200 5/6 食費 1200 5/7 雑費 500 5/8 給料 20000 で、この中から食費の行をすべて抽出して シート2に 5/1 食費 2500 5/6 食費 1200 のようにしたいのです。 VBAを使う方法でもいいです。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>▼ボタンをクリックし、結果をシート2へ >コピペする方が早いのではないかな? その行程もマクロに追加すればいいんです。「マクロの記録」で十分足ります。 Selection.Copy Sheets("Sheet2").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Sheet1").Select Range("A1").Select >以前にマクロで記述した範囲もその都度変えなければ >ならないという面倒なことにならないのかな? Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select の記述で、カレントセルからデータの最終セルまでの範囲を選択できます。 記述範囲が連続している(途中にカラの行がない)限り、データが増減してもきちんと選択できます。
その他の回答 (6)
- Hageoyadi
- ベストアンサー率40% (3145/7860)
>ActiveCell.SpecialCells(xlLastCell) マクロの記録で、CTRL+Endのキー操作を記録するのと同じです。 アタシのは前後にオマケがついてまして、コレはCtrl+Shift+Endと同じことになります。 Application.SendKeys ("+^{end}") と記述するやり方もあります。 ほかにも Range("A1").CurrentRegion.Select では、連続するデータで空白セルに囲まれた範囲を選択 なんてのもあります。 >シート2に張り付けられた位置はD12でした。なぜA1ではないのかな? あ、D12を以前選択しておいたからでしょうね。 Sheets("Sheet2").Select の後に Range("A1").Select の記述を加えるとA1から貼り付けられます。 ってアタシもマクロの記録+αしか知らないのであまりえらそうなこといえないんです。 imo・・・さんとかnishi・・・さんなんかの足元にも及ばないので。
お礼
hageoyadiさん、ありがとうございます。 >あ、D12を以前選択しておいたからでしょうね。 なるほど、そういうことですか。 色々教えていただいてありがとうございます。
- Hageoyadi
- ベストアンサー率40% (3145/7860)
#1です。 VLOOKUPについては#1での参考URLを見ていただくとして、「ボタン一発で」の方法はマクロを使うことになります。 構文がややこしくなりますが、とっつきやすい方法は、マクロの記録を使うことです。 あくまでも一例ですが、 オートフィルタを設定した状態で Sub Macro2() msg = "検索する 科目名 を入力して下さい" dat = InputBox(msg, "種類名入力") Range("a1").Select Selection.Autofilter Field:="1", Criteria1:=dat End Sub これをボタンに登録すると科目別のオートフィルタ結果が導き出せます。 この作業に抽出データをコピーしてシート2に貼り付ける作業までを追加すればご希望のことがボタンに登録できます。 マクロの記録については参考URLへ。
補足
Higeoyadiさん、ありがとうございます。 お教えいただいた方法試してみました。 >Selection.Autofilter Field:="1", Criteria1:=dat は、食費がB列にあるので Selection.Autofilter Field:="2"で成功しました。 しかしこの方法より オートフィルタを設定して、手作業でB1にある食費の セルにある▼ボタンをクリックし、結果をシート2へ コピペする方が早いのではないかな? また、もとの出納帳の内容が日々増えることを 考えると、同じ食費に限ってみても、オートフィルタの 結果をコピーする範囲が変わるので、以前にマクロで 記述した範囲もその都度変えなければならないという 面倒なことにならないのかな? せっかく教えてもらったのに気を悪くしないで下さいネ!
- nihonjinn
- ベストアンサー率39% (79/200)
>F2に1,2,3と数を並べて は F2からF列に1,2,3と入力していく という意味です。訂正します。
- nihonjinn
- ベストアンサー率39% (79/200)
作業列を作ってしまいましょう。 データが二行目から始まっているとするとE2に =IF(B2="食費",ROW()-1,"") と入力し,下にコピーします。 次にF2に1,2,3と数を並べてG2列に =IF(ISERROR(SMALL(E:E,F2))),"",OFFSET(A1,SMALL(E:E,F2),0)) これで日付を抽出できます。 まずE列で上から何番目に一致するデータがあるかを抽出し、 SMALL(E:E,F2) でE列の中からF2番目に小さい数を指定します。 OFFSET($A$1,SMALL(E:E,F2),0) でセルA1から「SMALL(E:E,F2)」行下で「0」列右側のセルを指定できます。科目、収入を抽出するなら「1」列右側,「2列」右側と指定してやればいいです。 IF(ISERROR(SMALL(E:E,F2))) としているのはエラー対策です。
補足
nihonjinnさん、こんにちは。 お教えいただいた、 =IF(ISERROR(SMALL(E:E,F2))),"",OFFSET(A1,SMALL(E:E,F2),0))は SMALL(E:E,F2)))の最後のカッコが1つ多かったですが うまくいきました。 ただ私の場合、シート2に食費を抽出したいので、 シート2に上記式を各行にはりつけていくことに なると、かなり手間がかかりそうです。 実は、シート3には被服代、シート4には雑費 シート5には光熱費などのように複数シートに科目を分けて抽出したいと思っています。 それを、シート1のボタンを1回押すだけで出来るよう にする方法はないでしょうか よろしくおねがいします。
- shigechama
- ベストアンサー率30% (237/768)
データをすべて選択して、 メニューバーのデータ→フィルタ→オートフィルタで 科目の列に出る▼をクリックして、食費を選択すると 食費の行のみ抽出されます。 抽出されたものを右クリックでコピー、 新しいシートに貼り付けでどうでしょうか。
補足
>メニューバーのデータ→フィルタ→オートフィルタで >科目の列に出る▼をクリックして、食費を選択すると >食費の行のみ抽出されます。 >抽出されたものを右クリックでコピー、 >新しいシートに貼り付けでどうでしょうか。 なるほど、これでうまくいきました。 ところで、同じ事を自動的にしたいのですが シート1にボタンを付けて、ボタンを押すと 自動的にシート2に抽出できないでそうか?
- Hageoyadi
- ベストアンサー率40% (3145/7860)
単純にオートフィルタをかけた後コピーして張り付けるのは手順が多すぎてダメですか? でしたら、 VLOOKUP関数をシート2に適用するのも手です。
補足
Higeoyagiさん、ありがとうございます。 Shigechamaにもおしえていただいたとおり うまくいきました。 ところで、VLOOKUP関数をシート2に摘用するとは 具体的にどのようにするのでしょうか? また、同じ事を自動的にしたいのですが シート1にボタンを付けて、ボタンを押すと 自動的にシート2に抽出できないでしょうか?
補足
Hageoyajiさん、ありがとうございます。 > Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select 【注】 > Selection.Copy >Sheets("Sheet2").Select >ActiveSheet.Paste >Application.CutCopyMode = False >Sheets("Sheet1").Select >Range("A1").Select でうまくいきました。 【注】のところは > Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select >の記述で、カレントセルからデータの最終セルまでの範囲を選択できます。 と有ったので、それを入れてみました。 ところで 1. ActiveCell.SpecialCells(xlLastCell)はどういう意味でしょうか 2. シート2に張り付けられた位置はD12でした。なぜA1ではないのかな? 張り付ける位置は上記コードのどれのことでしょうか? いろいろお聞きしてすみませんが、最後に上記だけ教えて下さい。 よろしくお願いします。