エクセルで指定した行数毎に行データを抽出する方法

このQ&Aのポイント
  • エクセルで指定した行数毎に行データを抽出する方法について教えてください。
  • 現在、条件付き書式と色フィルタを使用して行データを抽出していますが、より簡単な方法はありますか。
  • また、セルに条件を入力して抽出する方法があれば教えてください。
回答を見る
  • ベストアンサー

エクセルで指定した行数毎に行データを抽出したい

いつもお世話になっております。 最近データ処理で何度も表題にある処理をしているのですが、何とか簡単にできないかと質問させて頂きます。 決まった書式のデータシートから、指定した行から指定した行までの間で指定した行数置きに別のシートに抜出したいのですが。 例えば、18行目から1500行目迄の間で、3行おきに抽出したい、というような感じです。 現在は、条件付き書式で=MOD(ROW(),3)=1というような式でセルに着色して、色フィルタで不要な行を削除してそれを別シートにコピペして・・・ で何とか処理しています。 尚、贅沢を言えば、シート上の決まったセル(A1、B1、C1・・)に上記の条件(開始行、最終行、行間隔)を入力して、「新規Sheet」に抽出出来れば最高です。 また、例えば手作業で簡単に出来る作業(空白行を削除したシートで・・)等はその旨の条件付きで全くOKですのでよろしくお願いします。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.8

>Sheet1、Sheet2ではなく、例えば「生データ」「結果」というシートの場合、D、E列にはどう入力すれば良いのでしょう? 添付画像のような指定をします。 また、上記指定値たちの埋まったシートの名前を Const CntlSh = "Sheet2" この行に指定します。

akira0723
質問者

お礼

早々のご対応ありがとうございます。 最初にご回答のようにSheeet10のシート名を”Sheet2”にしてD、E列にシート名をそのまま(ご回答のように)してみて何も起こらない(エラーMsgが出ない)ので色々試行した次第です。 ちなみに以前教えて頂いた「イミディエイト」ウィンドウにも何も表示されないでVBAが一瞬で終わります。 こちらのシート状況だと思うのですが、ここに図が貼れないので説明のしようがないのですが、改めてご回答の図と同じ構成で試してみましたが、何も起こらず、でした。 しばらく時間を貰って、別に試行用のダミーシートでためしてみます。 イヤハヤ御免なさい!

akira0723
質問者

補足

今、落ち着かないのでとりあえず簡単なダミーデータで試した見たらいともあっさり動きました。 これは各シートの不整合部分(項目行追加や列の増減)が一目瞭然で分かるので目的にピッタリの動きです。 よく考えたらこの判定(修正箇所)の簡便化が真の目的とも言えました。 おかげ様で今回も無事解決?です!

その他の回答 (7)

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.7

》 18行目から…3行おきに抽出したい その「おき」という表現ですが、注意が必要なので確認させてください。 1年ごと(毎年)→0年おき 2年ごと→→→→1年おき 3年ごと→→→→2年おき 4年ごと→→→→3年おき ………_→→→→………_ つまり、「お(置)き」は間隔を置く意味なので、抽出する行番号は 18、22、26、30、…行目と考えますが、如何でしょうか?

akira0723
質問者

お礼

ご回答ありがとうごました。 ご指摘の通りです。 尚、必要なデータの入っている行がシート毎に違っているので条件を簡単に変えられればありがたいのですが。

  • SI299792
  • ベストアンサー率48% (713/1473)
回答No.6

関数でやる方法です。 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を非表示にできます。

akira0723
質問者

お礼

いつもお世話になっております。 早々に試してみましたが、実際の表では何故かうまく行かず。(表の不具合の可能性も?) INDEX関数では良くトラブるレベルですみません。(´;ω;`) 汎用性のありそうな式なので何とかしたいと思います。

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

前に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あたりから、エクセル関数の変革期(急増)に当たると思うので、質問に、エクセル・バージョンを書くべきということが判るでしょう。

akira0723
質問者

お礼

ご丁寧なご回答ありがとうございます。 バージョンが抜けてしまいました、2019です。 お回答の関数が使えれば、非常に有用と思われるので、早々に試した見ましたが、=FILで出てくる関数はFILTERXMLのみでした。 試しに=FILTE( で試してみましたが「その関数は正しくありません」とのことでした。 残念!!

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.4

添付画像と後記コードでいかがでしょうか 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

akira0723
質問者

補足

いつもお世話になります。 今回の課題は似て非なる書式の複数のシートで、フィルター機能では非常に手間がかかる事から一定行数毎に抜けば、各シートにご提案のように1行目に条件を入れることで簡単に色々シュミレーション出来ると思ってHELPさせてもらいました。 早速試してみたのですが、情けない話ですが・・・ ご回答の画像のSheet2の1行目のD、E列の「シート名」の書式?が分かりません。 Sheet1、Sheet2ではなく、例えば「生データ」「結果」というシートの場合、D、E列にはどう入力すれば良いのでしょう? 単純に見た通りの「生データ」では > Set ShGet = ThisWorkbook.Sheets(.Cells(1, 4).Value) が黄色のハイライトで止まってしまいます。 試しに Sheet12(Sheet1) とか試行錯誤してみましたがダメでした。 いつもながらHohoPapaさんの想定を超える無知で恥ずかしくもあり、申し訳なくもありです。

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

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ぐらい修正する。

回答No.2

=INDEX(A18:A1500,ROW($A1)*3+1) という具合で調整してみてはいかがでしょうか?

akira0723
質問者

お礼

早々のご回答ありがとうございます。 ご回答でうまく行くことを確認しました。 特定のシートを処理する時には使用させていただきます。 また、Bookを必要数コピーして、それぞれのBookでこの式の引数を変えたもので処理できると思いますので助かりました。

  • kon555
  • ベストアンサー率52% (1748/3350)
回答No.1

 vbaで組んでしまうのが1番簡単ではあります。こうしたエクセルでのデータ整理業務が多いなら、習得をオススメします。  また業務環境次第ですが、外部ソフトが使えるなら、マウスとキーボードの操作を記録し再生するキーボードマクロ系統のソフトの使用が、かなり効率化になりますのでオススメです。  vbaを覚えるよりかなりハードルは低いですし。 オススメのキーボードマクロ https://fefnirm.web.fc2.com/soft/himacroex/

akira0723
質問者

お礼

早々のご回答ありがとうございます。 VBAは高齢者の当方にはハードルが高く・・・ お勧めのキーボードマクロは使い方が今一良く分かりません。 確かにVBAが簡単に実行できそうな感じですのでこれから少し勉強してみよと思いますが、残念ながら標準機能の「マクロの記録」との違いもわからないレベルです。

関連するQ&A

  • データ抽出

    VBA初心者です。 エクセルで2枚のシートを練習用で作成しました。 画像上段がシート1で元データです。 下段が転記先の表で、シート2です。 シート2は、今はデータが参考に貼りつけてありますが 普段はマクロで作業後は消去して、空白にしています。 今したい処理が 元データをINPUTBOX関数を使って抽出し、 NO,購入日付、分類、感想、備考のデータを下段画像シート2のように 転記したいのです。 抽出条件のキーになるのは、主に「購入日付」と「分類」です。 どこかのセルに、日付を範囲指定で入力すれば、条件に当てはまる データをシート2に表示させたいです。 四半期ごとのデータを検索したいためです。 INPUTBOX関数でなくても、どこかの特定のセルに範囲指定する日付を入力 して、抽出してもかまわないです。 あと、分類は割と「飲料水」を抽出して、印刷する頻度が多いのですが 今後の参考に、全部の分類を抽出できるスタイルが望ましいです。 現在は、一行一行日付と分類を目視で確認しながら シート2にコピペ作業しているので 時間がかかります。 エクセルの機能でフィルタ等をしてみたのですが、 関数やVBAで素早くしたいのですが、なかなかコードが思いつきません。 お願いします。

  • エクセル人事データの行の削除・抽出

    莫大な人事データがあります。A列には部門コード10桁 B列には部署名1 C列には部署名2 D列には名前・・・基本給・手当・住所・連絡先等々列だけでも100はあります。行は個人別に並んでおり、名前は重複しませんが、部門コードは重複します。 10005500 財務 10005550 人事 10006000 総務 といった形でデータマスターは完成させました。部署も300ほどあるので、オートフィルタで行を抽出することは困難に近いです。チェックボックスをクリックしまくるのは億劫とミスの元です。 さて、そんなデータがあるなか、シート2に部門コード表を作成し、シート1のマスターのうち部門コードに該当する列だけを抽出したいのです。 難なく使える機能はLOOKUP関数、条件付き書式、フィルタ、条件書式などです。 大量の複数条件を指定して、マスターをいじることはできますか。 よろしくお願いいたします。

  • エクセルで、データのある行だけを抽出したい。

    エクセルのSheet1にデータが入っており、セルが空白でない行のデータのみを、Sheet2に抽出したいと思っています。 Sheet2にあらかじめ関数を入れておく方法にしたいため、関数について教えてください。 タイムテーブルで予定を管理するような表で、A~Hまでにデータが入っています。 予定を入れる際にはE列には必ず入力をするため、E列が空白でない行のみを抽出したいです。 A|B|C|D|E|F|G|H 月|日|時間|… 11|22|10:00|… 11|22|10:30|… 時間枠は10:00~17:00の30分刻みで、1日15行使用するので、1年で5475行まで使用します。 1行目はタイトル行なので、データは2行目から入力しています。 フィルタオプションで抽出する方法や、それをマクロで登録しておく方法は分かったのですが、あとから予定を追加することがあるため、マクロを実行する度にデータが置き換わると困ってしまいます。 また、抽出したSheet2のI列以降には備考などを入力したいため、やはり後から列がずれると困るため、A~H列に関数を入れておく方法で実行したいと思います。 よろしくお願いいたします。

  • 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の列を抽出 なにか良い方法はありますか? よろしくお願い致します。

  • VBAのデータ抽出(間引き)について

    VBAのデータ抽出(間引き)について 当方VBA初心者なのですが、 VBA(EXCEL2007)を使用してグラフ作成をしようと思っています。 元データの書式は以下の通りでデータ行は30秒間隔で 一カ月分(8万行)あります。 2010/08/01 01:00:34     1112.83 2010/08/01 01:01:04     1110.43 2010/08/01 01:01:34     1111.87 2010/08/01 01:02:04     1112.23 2010/08/01 01:02:34     1112.43 2010/08/01 01:03:04     1112.03 2010/08/01 01:03:34     1110.83 2010/08/01 01:04:04     1112.43 2010/08/01 01:04:34     1110.63 ・・・ データ量が多すぎるので間引きしようと思っています。 間引き(抽出)条件は以下の様に考えています。 10行毎(5分毎)に値の最大値の行を抽出して別シートへコピー。 VBAマクロで処理するにはどの様な コードで実現可能でしょうか? 教えて頂きたく。よろしくお願いします。

  • エクセルでデータの抽出方法

    Windows7、エクセル2010を使用しています。 エクセルで、指定したセルのデータを抽出する方法についての質問です。 エクセルに60000行×1列のデータがあるとして、 その中から99行目、199行目、299行目、・・・59999行目のデータを抽出しなければなりません。 手作業でコピーするのは時間的に非現実的なので、なにか抽出する方法はないでしょうか? 100行単位で列を変えれば、99行目のみをコピーし、行と列を置き換えればいいと思うのですが、そんなことは可能なのでしょうか? そのほか、何か方法があれば教えてください。

  • Excelにおけるデーター抽出

    Excelのシートに記載されている内容は次の通りです。 (1) セルA5~A60の間に1~56の昇順の番号 (2) セルB5~B60には氏名 (3) セルC5~C60には○、×、△の記号 このシートからC列が ○ の記号が付与されている者だけの氏名を別のシートのB7~B**の間に抽出するのですが、抽出したシートの行に空白ができないようにするには式をExcel関数で作成することは可能でしょうか? 若し、不可能でしたらマクロで行う場合のプログラムを教えて下さい。

  • データ抽出のコピーの仕方を教えてください。

    エクセル2007で表を作っています。 シートAに、1行目が項目で2行目以降データです。350行ほどあります。 シートAのそのデータにフィルタを使って、3件ほど、抽出しました。 シートBに抽出したデータと1行目の項目を列幅やセルの色などそのままコピーしたいのですが、 コピー→貼り付けだと、書式がコピーできません。 項目と抽出したデータをそのまま、まるっとコピーできないでしょうか?

  • EXCEL抽出?についてご指導ください。

    シート1にあるデータをシート2に抽出したいのですが・・・ シート1にあるデータの2列目と3行目で交差する「A」を シート2のA1セルに「2」A2セルに「3」と入力すると 指定したセル(たとえばB1セルに「A」と表示(抽出)させたいのですが、ご存知の方教えていただけませんか? (シート1)   1 2 3 4 5 1 2 3    A 4 (シート2)   A  B  C 1 2  A 2 3 3 よろしくお願いします。

  • エクセルで抽出データを削除修正する方法

    エクセルで在庫管理データ(ファイルA)の中からLOOKUPで指定条件に見合うデータのみを抽出し、リンク貼り付けで一覧表(ファイルB)を作成ております。 指定条件データで抽出したデータを修正したり、行毎削除したいと考えております。 何か方法がありますか? 当方初心者なため関数で処理できれば助かります。

専門家に質問してみよう