- ベストアンサー
エクセルで指定した行数毎に行データを抽出する方法
- エクセルで指定した行数毎に行データを抽出する方法について教えてください。
- 現在、条件付き書式と色フィルタを使用して行データを抽出していますが、より簡単な方法はありますか。
- また、セルに条件を入力して抽出する方法があれば教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (7)
- msMike
- ベストアンサー率20% (364/1804)
》 18行目から…3行おきに抽出したい その「おき」という表現ですが、注意が必要なので確認させてください。 1年ごと(毎年)→0年おき 2年ごと→→→→1年おき 3年ごと→→→→2年おき 4年ごと→→→→3年おき ………_→→→→………_ つまり、「お(置)き」は間隔を置く意味なので、抽出する行番号は 18、22、26、30、…行目と考えますが、如何でしょうか?
お礼
ご回答ありがとうごました。 ご指摘の通りです。 尚、必要なデータの入っている行がシート毎に違っているので条件を簡単に変えられればありがたいのですが。
- SI299792
- ベストアンサー率47% (772/1616)
関数でやる方法です。 Sheet1、も度データがあるとします。 Sheet2、1行目に(開始行、最終行、行間隔)を入力します。3行目以下に出力します。 A1: 18 B1: 1500 C1: 3 A3: =IF((ROW()-3)*$C$1+$A$1>$B$1,"",INDEX(Sheet1!A:A,(ROW()-3)*$C$1+$A$1)) 右下へコピペ。 セルの書式設定、ユーザー定義「#」 にすれば、0を非表示にできます。
お礼
いつもお世話になっております。 早々に試してみましたが、実際の表では何故かうまく行かず。(表の不具合の可能性も?) INDEX関数では良くトラブるレベルですみません。(´;ω;`) 汎用性のありそうな式なので何とかしたいと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
前にVBAなどの回答を出した者ですが、思い出して下記を記します。 使用してないので、小生はテスト環境にないが、365や2019,2021を使っておれば、FILTER関数があって(新設)、「=FILTER(配列,含む,[空の場合])」で、配列の部分はセル範囲を指定する。条件は、MOD(ROW(),3)=0 と指定する。行番号(データの上から何番目ではない)が、3で割り切れる場合の意味です。ROW()をROW()ー1、ROW()ー2などにして、やってみて、データ内容的に、正しくなるように、関数のそこを調節する。 テストしてないので、使えない場合は後免。 参考 https://office-hack.com/excel/function-filter/ ExcelのFILTER関数の使い方|必要なデータを抽出する ーーー 2016あたりから、エクセル関数の変革期(急増)に当たると思うので、質問に、エクセル・バージョンを書くべきということが判るでしょう。
お礼
ご丁寧なご回答ありがとうございます。 バージョンが抜けてしまいました、2019です。 お回答の関数が使えれば、非常に有用と思われるので、早々に試した見ましたが、=FILで出てくる関数はFILTERXMLのみでした。 試しに=FILTE( で試してみましたが「その関数は正しくありません」とのことでした。 残念!!
- HohoPapa
- ベストアンサー率65% (455/693)
添付画像と後記コードでいかがでしょうか Option Explicit Sub abc() Const CntlSh = "Sheet2" Dim ShGet As Worksheet Dim ShPut As Worksheet Dim ShCntl As Worksheet Dim SRow As Long Dim ERow As Long Dim iVal As Long Dim i As Long Dim PutRow As Long PutRow = 2 '出力開始行番号 Set ShCntl = ThisWorkbook.Sheets(CntlSh) With ShCntl SRow = .Cells(1, 1).Value ERow = .Cells(1, 2).Value iVal = .Cells(1, 3).Value Set ShGet = ThisWorkbook.Sheets(.Cells(1, 4).Value) Set ShPut = ThisWorkbook.Sheets(.Cells(1, 5).Value) End With i = 0 Do If ((ShGet.Cells(SRow + i, 1).Value = "") Or _ ((SRow + i) > ERow)) Then Exit Do If i Mod iVal = 0 Then ShGet.Rows(SRow + i).Copy ShPut.Rows(PutRow) PutRow = PutRow + 1 End If i = i + 1 Loop End Sub
補足
いつもお世話になります。 今回の課題は似て非なる書式の複数のシートで、フィルター機能では非常に手間がかかる事から一定行数毎に抜けば、各シートにご提案のように1行目に条件を入れることで簡単に色々シュミレーション出来ると思ってHELPさせてもらいました。 早速試してみたのですが、情けない話ですが・・・ ご回答の画像のSheet2の1行目のD、E列の「シート名」の書式?が分かりません。 Sheet1、Sheet2ではなく、例えば「生データ」「結果」というシートの場合、D、E列にはどう入力すれば良いのでしょう? 単純に見た通りの「生データ」では > Set ShGet = ThisWorkbook.Sheets(.Cells(1, 4).Value) が黄色のハイライトで止まってしまいます。 試しに Sheet12(Sheet1) とか試行錯誤してみましたがダメでした。 いつもながらHohoPapaさんの想定を超える無知で恥ずかしくもあり、申し訳なくもありです。
- imogasi
- ベストアンサー率27% (4737/17069)
5条件の問題かな。 その中説明していないのがあるのでは。(2)(5)など。 (1)18行から1500行までの範囲の (2)(1)での、その都度のスタート行はどう指定するのか。 (3)3行おき。 (4)別シートへ抜出。 (5)シートでの行数制限はあるか。 (6)そのつど(1)ー(5)の条件で一部を抜き出したデータをほしいのか、 そのつど(例えば違う日に)、この条件を変えて、数回、作業を行う必要があるのか? そういうことを説明必要と認識できないなら、質問者は、現状では、プログラム向けでない。 ーーー エクセルでの、抜出作業は、関数で組み立てるのは、初心者には、結構むつかしい、のを知らない質問者が多い。内容が、データベース的処理だからだと思う。 あえて関数で回答をもらいますか。 ーー VBAなら、上記(1)ー(5)の条件も、独立して入れればよいので、そんなに難しくない。 (注意)全部(1)ー(6)のすべての条件は盛り込んでないが。 この程度の行数+αだろう。 例データ A列のみ。A2以下500行 A2から a1 a2 a3 a4 a5 ・・ あるとする。最終(最下行)は、A列501行目 a500 ---- VBAコード 標準モジュールに Sub test01() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") lrow = sh1.Range("A100000").End(xlUp).Row ’データ最終行 MsgBox lrow 'ーーー開始期に決めておく定数量データ startrw = 50 'インプットデータの対象開始行 j = 2 'アウトプットの開始行 'ーーー For i = startrw To (lrow - 2) ’ただし、(lrow - 2)は議論在り '--行条件 If (i - startrw) Mod 3 = 0 Then '3行おきなので 'ーー該当行を抜出 sh2.Cells(j, "A") = sh1.Cells(i, "A") j = j + 1 'ーーー End If Next i End Sub 元データで、対象データ列が増えると、sh2.Cells(j, "A") = sh1.Cells(i, "A")以下の、VBAコード行を、A->Bと変えて、類似コードの行を増やせば良い。 結果 Sheet2 A2行以下 a49 a52 a55 a58 a61 a64 a67 以下略。 アウトプットの結果がプラス・マイナス1ぐらい、望みのものと違う場合は If (i - startrw) Mod 3 = 0 Then の辺を+-1ぐらい修正する。
- iyonohanamuko
- ベストアンサー率54% (6740/12373)
=INDEX(A18:A1500,ROW($A1)*3+1) という具合で調整してみてはいかがでしょうか?
お礼
早々のご回答ありがとうございます。 ご回答でうまく行くことを確認しました。 特定のシートを処理する時には使用させていただきます。 また、Bookを必要数コピーして、それぞれのBookでこの式の引数を変えたもので処理できると思いますので助かりました。
- kon555
- ベストアンサー率51% (1842/3559)
vbaで組んでしまうのが1番簡単ではあります。こうしたエクセルでのデータ整理業務が多いなら、習得をオススメします。 また業務環境次第ですが、外部ソフトが使えるなら、マウスとキーボードの操作を記録し再生するキーボードマクロ系統のソフトの使用が、かなり効率化になりますのでオススメです。 vbaを覚えるよりかなりハードルは低いですし。 オススメのキーボードマクロ https://fefnirm.web.fc2.com/soft/himacroex/
お礼
早々のご回答ありがとうございます。 VBAは高齢者の当方にはハードルが高く・・・ お勧めのキーボードマクロは使い方が今一良く分かりません。 確かにVBAが簡単に実行できそうな感じですのでこれから少し勉強してみよと思いますが、残念ながら標準機能の「マクロの記録」との違いもわからないレベルです。
お礼
早々のご対応ありがとうございます。 最初にご回答のようにSheeet10のシート名を”Sheet2”にしてD、E列にシート名をそのまま(ご回答のように)してみて何も起こらない(エラーMsgが出ない)ので色々試行した次第です。 ちなみに以前教えて頂いた「イミディエイト」ウィンドウにも何も表示されないでVBAが一瞬で終わります。 こちらのシート状況だと思うのですが、ここに図が貼れないので説明のしようがないのですが、改めてご回答の図と同じ構成で試してみましたが、何も起こらず、でした。 しばらく時間を貰って、別に試行用のダミーシートでためしてみます。 イヤハヤ御免なさい!
補足
今、落ち着かないのでとりあえず簡単なダミーデータで試した見たらいともあっさり動きました。 これは各シートの不整合部分(項目行追加や列の増減)が一目瞭然で分かるので目的にピッタリの動きです。 よく考えたらこの判定(修正箇所)の簡便化が真の目的とも言えました。 おかげ様で今回も無事解決?です!