• ベストアンサー

大至急!教えてください!エクセルで金額の入っている行だけ抽出

表題の件なのですが、過去質問を探しても見つからなかったので教えてください。 Sheet1   |A |B |C |D  |商品|項目|収入|支出 1|◇ |事務|   |200 2|○ |備品|300 | 3|■ |事務|100 | シート1に上記のような表があります。(まだまだ続きますが…) シート2に「収入」が入っている行だけを抽出するということはできますか? 金額だけでなく、行ごと抽出させたいです。 項目別はオートフィルタの操作をマクロ登録、ボタンを作成し、クリックひとつで出来るようにしたのですが、違う項目のときに一度抽出結果を削除してから新しい項目を入力、ボタンをクリックとその場しのぎなので、こちらも何かいい方法があったら教えてください。(いちいち削除しなくても、抽出結果が出るなど) たくさん書き、見づらくてすみません…。 当方はエクセルは中級、マクロは初級です。 使用者はエクセル自体触ったことの無い人なので、できるだけボタン一つでできるようにしてあげたいと思ったので。 よろしくお願いいたします!m(__)m

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

  • ベストアンサー
  • Dona1d
  • ベストアンサー率58% (10/17)
回答No.2

問題は解決しているのかも知れませんが… 「オートフィルタ」ではなく「フィルタオプション」を使用する方法はいかがでしょうか? 例に沿って解説すると… (1)A1:D1のテーブルをコピー (2)任意の場所(別Sheetでも構いません)に検索条件用と抽出用に2箇所へ貼り付け。 (3)コピーした検索条件用のテーブル「収入」の下行に「<>」と入力(「」は入力しません) (4)メニュー「データ」→「フィルタオプションの設定」  抽出先:「指定した範囲」にチェック  リスト範囲:[Sheet1!$A$1:$D$4]  検索条件範囲:(2)の位置をドラッグ(条件<>の行も含みます)  抽出範囲:(2)の抽出用のテーブル(1行のみ)をドラッグ (5)OK この作業をマクロの自動記録等で記録しておけばボタン一つで条件を変える事ができます。 (毎回削除しなくても、自動的に元の抽出データは削除されます) いかがでしょうか?

bincho-tan
質問者

お礼

早々にありがとうございます! 「オートフィルタ」ではなく「フィルタオプション」を使っていました…失礼しました。 今回も抽出条件に「<>」を入れて操作してみると…出来ました♪d(^∀^*) 早速マクロに登録してボタン操作にしました! 「<>」がポイントだったんですね… 勉強不足でした。 本当にありがとうございました☆m(__)m

その他の回答 (4)

  • NCU
  • ベストアンサー率10% (32/318)
回答No.5

オートフィルタは使いません。ご参考。 Sub 抽出()   Application.ScreenUpdating = False   Sheet2.Range("A1").CurrentRegion.ClearContents   Sheet1.Columns("C:C").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True   Sheet1.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy   Sheet2.Range("A1").PasteSpecial Paste:=xlPasteValues   Sheet1.Cells.EntireRow.Hidden = False   Application.CutCopyMode = False End Sub

bincho-tan
質問者

お礼

お答えいただきまして、ありがとうございました。 なんとか作ることができましたが、やはりきちんとマクロを組んで作ったほうが便利なものが作れそうですね! いただいたお返事を参考にして、勉強していきたいと思います。 本当にありがとうございました♪m(__)m

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#03です。簡単にできそうなことを書いてしまいましたが、Sheet1はオートフィルタがかかっている可能性があるのですね。 フィルタで非表示の行があると上手くコピーできない可能性がありましたので、それを考慮したマクロにしてみました。Sheet2のシートモジュールにコピーしてください。 データの行数が多いと時間がかかりそうなので、シートごとコピーしてC列にフィルタをかける方が正しいやり方かもしれませんが(^^;) Option Explicit Private Sub Worksheet_Activate() Dim CopyRow, PasteRow, LastRow As Long On Error GoTo ERR0 PasteRow = 1 Application.ScreenUpdating = False With Worksheets("Sheet1") If .AutoFilterMode Then LastRow = .AutoFilter.Range.Row + _ .AutoFilter.Range.Rows.Count Else LastRow = .Range("a65536").End(xlUp).Row End If Range(Cells(1, 1), Selection.SpecialCells(xlCellTypeLastCell)) _ .ClearContents For CopyRow = 1 To LastRow If .Cells(CopyRow, 3) <> "" Then .Rows(CopyRow).Copy ActiveSheet.Rows(PasteRow).Select ActiveSheet.Paste PasteRow = PasteRow + 1 End If Next End With ActiveSheet.Rows.Hidden = False ERR0: Application.CutCopyMode = False Application.ScreenUpdating = True End Sub

bincho-tan
質問者

お礼

再度、ありがとうございます! ごめんなさい。説明が間違えていました。 項目別は【「オートフィルタ」ではなく「フィルタオプション」で別シートに表示させる】操作をマクロ登録したので、最初にお答えいただいた「<>」を使い無事、ボタンひとつで操作が出来るようになりました♪ 本格的に使う際はやはりマクロが一番よさそうですね。 勉強していきたいと思います。 お気にかけていただきまして、ありがとうございました。m(__)m

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

マクロは組めるということですので、「Sheet2がActivateになったときにSheet1のC列が空白ではない行をSheet2にコピーする」という手段の方が、操作者は迷わないのではないでしょうか。 処理は 1)Sheet2全体をクリア 2)ペーストする行カウンタに1をセット 3)SHeet1の最終行を求めて、1行~最終行をFOR文で回す  4)C列が空白ではないならその行をCOPY  5)Sheet2のペースト行を選択し、ペースト  6)ペースト行に1加算 というような手順になります。

bincho-tan
質問者

お礼

早々にありがとうございます。 マクロは…登録するくらいで、あまり作ったことがなく自信がないのです。(T_T) コレを機にマクロも勉強しなくちゃなと思いました。 勉強になりました!ありがとうございました☆m(__)m

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

A列を抽出用にお借りします。 1列挿入してください。 で、A2セルに =if(D2:$D$2<>"",max(a1:$a$1)+1,"") と入力し、下まで関数をコピーします。 ついで、シート2のA2セルに =if(iserror(vlookup(row()-1,sheet1!$A$2:$E$100,2,0)),"",vlookup(row()-1,sheet1!$A$2:$E$100,2,0)) と入力すると、商品名が抽出されると思います。 2を3,4,5…と変更することで、項目、収入、支出が抽出可能。 項目別は、ピボットテーブルを使用するのが もっとも簡単かと思います。「データの更新」をすれば、新たな項目が追加されますし。 もし、関数にこだわるのであれば、 =if(countif($C$2:c2,c2)<>1,"",max($A$1:a1)+1) (C列に項目のデータ、A列は抽出用に挿入した列) とすれば、同様のやり方で抽出も可能です。

bincho-tan
質問者

お礼

早々に、ありがとうございます。 実は抽出先は1箇所で書類を作っているものなのです。説明不足ですみません…(T_T) 実際操作する人も「簡単に!」と言っているので…なるべく簡単にという方法を探していました。 こちらは自分の勉強になりました。 まだまだ勉強不足で恥ずかしいです。 ありがとうございました!m(__)m

関連するQ&A