• 締切済み

vbaで特定の番号から番号の表データを抽出

任意の範囲で表からデータを抽出することができるのでしょうか? 行は100行で列は7列、1行めは項目行で、1列目の2行目から1番から99番までが割り当てられています。1行目の2列目から7列目まで項目が割り当てられています。その他のセルには数値や文字データが入力されています。 こんな表から、任意に、例えば10行目から35行目までのセルデータ全てを別シートに取り出すそんな抽出方法があるのでしょうか?皆目検討がつきません。もし可能ならどなたかお教え頂けませんか?

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.7

#3です。 end-uさん、情報をありがとうございました。 下記の様なコードで別シートへの抽出が出来る事を確認いたしました。VBAの場合はコピー先がアクティブでなくても良いのですね。 Sub Macro4() Sheets("Sheet2").Range("B1:C21").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("Sheet2").Range( _ "F1:G2"), CopyToRange:=Sheets("Sheet3").Range("B24:C24"), Unique:=False End Sub

  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

>任意に、例えば10行目から35行目までのセルデータ全てを別シートに取り出すそんな抽出方法があるのでしょうか? そのようなケースの場合、『抽出』ではなく『コピー』と考えると、シンプルになるのではないでしょうか。 以下はActiveSheetからSheet2のA1セルにコピーする例。 Sub test()   Dim s As String   Dim r As Range   s = InputBox("コピーしたい行を 10:35 などのように。")   With ActiveSheet     On Error Resume Next     Set r = .Range("A2:G100").Rows(StrConv(s, vbNarrow))     On Error GoTo 0     If r Is Nothing Then MsgBox "不正値": Exit Sub     'Sheets("sheet2").UsedRange.ClearContents     Union(.Range("A1:G1"), r).Copy Sheets("sheet2").Range("A1")   End With   Set r = Nothing End Sub 見出し行が不要な場合は差し替えです。 >Union(.Range("A1:G1"), r).Copy Sheets("sheet2").Range("A1") r.Copy Sheets("sheet2").Range("A1") コピー先が一定の場合、前回データをクリアする処理が必要です。 Sheets("sheet2").UsedRange.ClearContents など #以下余談ですが >mitarashiさん AdvancedFilterメソッドは別シートへの抽出もできます。2000や97でも。 手動操作時にエラーが出るからそう思われる方もいらっしゃるようなのですが、 手動操作の場合は最初に抽出先のシートをActiveにして実行する事がキモです。

Hiro2010jp
質問者

お礼

今回、多くの方に丁寧に質問を頂きました。ありがとうございます。vbaも一つの方法だけでなく、いろいろなやり方があるのだということも分かりました。一生懸命に勉強してみます。end-uさんの方法も試させて下さい。ありがとうございました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.5

オートフィルターを使った一例です。 Sub test()   Dim Ws1 As Worksheet, Ws2 As Worksheet   Dim myStartRow As Long, myEndRow As Long   Set Ws1 = Sheets("Sheet1")   Set Ws2 = Sheets("Sheet2")      myStartRow = 10   myEndRow = 35   Ws2.Cells.Clear   With Ws1     If .AutoFilterMode Then       .AutoFilterMode = False     End If     With .Range("A1").CurrentRegion       .AutoFilter Field:=1, Criteria1:=">=" & myStartRow, _               Operator:=xlAnd, Criteria2:="<=" & myEndRow       .SpecialCells(xlCellTypeVisible).Copy Ws2.Range("A1")     End With      .AutoFilterMode = False   End With      Set Ws1 = Nothing   Set Ws2 = Nothing End Sub

Hiro2010jp
質問者

お礼

コピーして貼り付けたら出来ました。ほんとにありがとうございます。

  • makho
  • ベストアンサー率39% (49/123)
回答No.4

あなたの環境と私の環境が違うと思いますのでコードは提示しません。 OS・バージョン エクセルバージョン等によりVBが正常に動きません。 で、まずは親切なVB解説ページが多数ありますので検索してご自分でコードを書いてみてください。 わからないところを質問すれば適切に回答がつくと思いますよ。 私も独学でデータ加工したり別シートに抽出するコードを書きました。 時間はかなりかかりましたが身につくとスキルとなりますから、回答ではなくアドバイスですいません。

Hiro2010jp
質問者

お礼

おっしゃるとおりです。反省してます。でもこれを機会に徹底的にVBAを勉強してみます。ありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

番号の列が設けてあるなら、フィルタオプションが良いでしょう。 http://allabout.co.jp/gm/gc/3501/3/ などをご参照下さい。 マクロを自動記録し、その次からは抽出条件だけ人力で書き換えた後、自動記録したマクロを実行すればOKです。 下記は自動記録の例 抽出条件設定をF1:番号、G1:番号、F2:>=10、G2:<=35等と設定すれば良いでしょう。残念ながら、同一シート内にしか抽出できません。(少なくとも、XL2000では) Sub Macro1() Range("B1:C21").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "F1:G2"), CopyToRange:=Range("B24:C24"), Unique:=False End Sub

Hiro2010jp
質問者

お礼

ありがとうございます。挑戦してみます。結果は又お知らせします。 まずは、お礼を!

noname#99913
noname#99913
回答No.2

次のコードを試してください。 初めに開始行と終了行を聞かれます。指定した行の間を、Sheet2の1行目からに書き込みます。r2の初期値を変えれば、書き込む行を変えられます。 Sub GetData() Dim r1 As Integer Dim c1 As Integer Dim r2 As Integer Dim c2 As Integer Dim s As Integer Dim e As Integer s = Val(InputBox("開始行?")) If s = 0 Then End e = Val(InputBox("終了行?")) If e = 0 Then End r2 = 1 For r1 = s To e c2 = 1 For c1 = 1 To 7 Sheets(2).Cells(r2, c2).Value = Sheets(1).Cells(r1, c1).Value c2 = c2 + 1 Next c1 r2 = r2 + 1 Next r1 End Sub

Hiro2010jp
質問者

お礼

なにやら、難しそうですが、挑戦してみる価値ありそうです。その結果は・・・又、お知らせします・・ありがとうございます!

  • gun_boxer
  • ベストアンサー率18% (2/11)
回答No.1

Hiro2010jpさんのやりたいことと、お持ちのスキルと、運用に添える形での実装が見えないのですが、VBAでいつも僕がやる方法を書いて見たいと思います。 最近のバージョンはわかりませんが、エクセルにはマクロ(=VBA)の記録、と言うものがあります。 (メニュー→ツール→マクロ→マクロの記録) マクロの記録を開始させ、やりたい動作を行ない、終了と押すと、VisualBasicEditerにその操作のプログラムコードが書かれています。 記録ボタンを押してから、セルを選択したら、選択したセル範囲がプログラムソースのどこかに書いてあるはずなので、そこを都度変えるとか、A1とB1に書いたセルの範囲をコピーする、と言う指示に書き換えたらいかがでしょうか? セル選択後にマクロの開始を押したら、selectedのエリアを、とか言う記録になりませんかね。こっちの方が実用的かも? 貼り付けるシートが同じであれば、そのシートクリックしてからコピペ操作をすればいいし、毎回新しいシートにコピーすればいいなら、シートを新規作成する動作ごとコピペしてしまえば、あとはソースみて修正するだけ、と言う話になってきますが、いかがでしょうか? 回答になってますでしょうか?

Hiro2010jp
質問者

お礼

こんな早く回答頂けるとは全く思っていなかったんでホントビックリ!、そして感謝!です。できるかどうかとにかく試してみます。ありがとうございました!!

関連するQ&A

  • データ抽出について

    エクセル初心者です。 エクセル2003を使っています。 sheet1に元データとなる表があります。 ・データセル内は数値データです。 ・行方向へは200程度 ・列方向へは1500程あります。  A   B    C    D   E     F  1日付 項目1 項目2 項目3 項目4 項目5 ・・・ 2 3 4 5 6 この元データからsheet2へ日付をキーにして行データを抽出したいのです。 抽出先のsheet2のA列に予め目的の日付データのみ1200程入っています。 最初Vlookupでやり始めたんですが無理と分かりました。 フィルタオプションで試みたのですが、「検索条件範囲」の式の書き方が 分からず困っております。 OKWaveの関連したQAを参考に試行錯誤を続けていましたが、進展がありません。 お詳しい方よりのご回答をお待ちしております。

  • (VBAにて)日付でデータを抽出するやり方

    一度質問をしたのですが言葉足らずで説明不足でしたので、再質問させて頂きます。 (一度見た方も、もう一度お付き合い願います。) 全くマクロを知らないのですが、上司にマクロ作成を依頼され困っています。(無茶な...。) 下記に内容を記しますので、教えて下さい。 お願いします。 (概要) Excelで「元データシート」にて管理している障害管理表のデータを、 「まくろシート」を作成して「元データシート・D列:発生日時」をキーにして 任意の「開始月:yyyy/mm」と「終了月:yyyy/mm」をそれぞれ指定したセルに入力して、コマンドボタンを押したら、「sheet3」シートにその指定した範囲内のみのデータを表示するようにして欲しい。 ・sheet1について →・「元データ」にシート名を変更しています。  ・「元データ」には障害を管理しているデータが入力されています。    (管理表はこんな感じです)→項目名:3行目・データ:4行目~  ・セルA3~Y3が項目名(セルD3の項目名→発生日時)     ・セルA4~Y303がデータ(セルD4~D303→yyyy/mm/dd hh:mm:ss) ・sheet2について →・「まくろ」にシート名を変更しています。  ・ セルA2(開始月)とセルB2(終了月)に任意の年月(yyyy/mm)を入力してセルA5にある「コマンドボタン」を押す  ・ キーは「元データシート・D列:発生日時」のデータ部分です。      ・sheet3について →・コマンドボタンを押した結果、「sheet3」にマクロの実行結果を反映する。 (A1~Y1行目に項目名が・A2行目~Y(X)行目にデータが表示される) ・A4で印刷するのでA4用紙のサイズに設定する。 以上です。 宜しくお願いします。

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

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

  • excelのVBAを利用し検索抽出を行う方法

    検索というよりデータの抽出の方が正しいかもしれません。 現在、顧客情報を種類別でシートに分けて表で管理しています。 情報には名前などの文字列、日付、時間などが含まれます。 この表の形式を説明すると、 ・列 … B~AI まで項目があります。(A列は使用していません) ・行 … 1行で1つのデータとなります。 ・行数…シートにより行数は異なります。 この形式の表が全部で14シートあります。 このシートのB列に「未・済」のステータスがあるのですが、 すべてのシートの「未」である行のデータを"Sheet1"に抽出させたいと考えています。 さらに、抽出されたデータの"D"列の日付にソートされるようにしたいのですが、 説明がわかりづらかったら申し訳ありません。 VBA初心者のためご教授いただければと思います。 よろしくお願いします。

  • Excelでデータ抽出!

    かなり切羽詰ってます。助けてください。 excelで3×15の表を作ってそこからデータを抽出したいのです。列と行の数値はそれぞれ別のセルからの参照にしたいのですが...。ifとかvlookupとかいろいろ使ってみたのですがうまくいきません。エクセルでゆーところの'B3'を出したいだけのことなのですが...。誰か助けてください。

  • エクセルで項目抽出

    エクセルで下記のような表から項目を抽出したいのですが うまくいきません A列 りんご みかん りんご ぶどう みかん と入力されていて任意のセルに、A列に入力されている項目から 重複分を除き抽出したいです 具体的には任意セルに「りんご、みかん、ぶどう」と抽出したいのです。 オートフィル機能を使いやってみましたが、 A列に後からデータを追加すると追加データまでは拾えませんでした。 よろしくお願いいたします

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

    エクセルの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 VBAでオートフィルタで抽出したデータの一部だけ貼り付けるには(第2弾)

    今週質問タイトルの件で回答いただき解決したのですが、更なる操作を希望したく質問させていただきました。内容は Sheet2にあるデータに複数条件でソートをかけ、ある数字(1から18まで)を入れたら、オートフィルタでE列のデータの選択部をSheet1のある部分に1行貼り付けるという作業です。以下のInputBoxに数字を入れるところからです。 (ソート後、どの数字を入れるか判断) ↓ InputBoxにある数字"○"(1から18まで)を入れる ↓ オートフィルタE列「"○-"で始まる」or「"-○"で終わる」 ↓ 抽出されたデータの右隣のF列(1列だけ)のデータ(上から17個分)を選択 ↓ 選択部をコピー ↓ Sheet1を選択。Sheet1の"K5"セルに行列を入れ替えて貼り付け というものでしたが、これはできました。ここから先です。 Sheet1のU5セルに先ほどインプットした数字"○"(1から18までのどれか)を入れる ↓ Sheet2にてオートフィルタE列「"○-"で始まる」or「"-○"で終わる」によって抽出されたデータの一番上の文字列から「"○-"」もしくは「"-○"」を除いて残った数字(○を除く1から18までの数字)をSheet1のW5セルに(先ほどのセルとは1個飛ばして)入れる ↓ 以下抽出されたデータの上から2番目の文字列を同様に操作し、1個飛ばしのセルY5に入れる。これがBC5セルまで続く というものです。難しいとは存じますが、どなたか教えていただけませんか? よろしくお願いいたします。

  • エクセル フィルタオプションで 特定の文字列を含む行を全て抽出する方法がわかりません

    エクセル2002を使用しています。 エクセルフィルタオプション設定で、特定の文字列を含む行を全て抽出する方法がわかりません。 たとえば sheet1    A    B    C    1 項目1 項目2 項目3  2  あ   い    う    3  う        あ    4  え        い 5      う       Sheet2   A         B         1 抽出文字列 2 あ  3   4 (計算式) 5 (以下抽出結果)   上記のようなデータがあり、sheet2!a5以降に「あ」が該当する行を全て抽出するといった式を組みたいのですが、 Sheet2 a2に抽出文字を入力し、a4に「=or(sheet1!a2=a2,sheet1!=a2,sheet1!=a2)」といった検索条件式を組み、フィルタオプションで、 ・リスト範囲 Sheet1!$a$1:$c$5 ・検索条件範囲 $a$3:$a$4 ・抽出範囲 $a$5  と指定するのですが、うまく抽出できません。 ちなみに抽出対象が文字列でなく数字なら(たとえばSheet1のデータの文字をあ→1 い→2のように全て数字に置き換えてSheet2!a2に1を入力)抽出できるのですが・・・ 文字列をセル参照して条件式を組む場合に何か気をつけることがあるのでしょうか?文章が長くなってしまい申し訳ありません。良い方法があればご教授お願いします。

  • EXCELのDATAを抽出して日別の表を作る式は

    最近は自分で表などを作る機会が少ない高齢者ですが、 目的は、Office2013 EXCELで AH2セルに、1日,鹿児島,山口,広島 AH3セルに2日熊本,大分,長崎   という文字列をそれぞれ一つのセル(AH2セルからAH32)に書き出したいのです、 EXCELの表の1行目にB列からAF列まで1から31までの一ヶ月の日付を書き入れ、 A列の2行(A2セル)から21行(A21セル)に氏名を書き入れている表の、 DATAとして、 B2セルからAF21セルの、不特定のセルの★や☆の記号を、 一番目に、 B2~B21のなか(仮にB3セル)に ★☆の記号が有ったら、  その行の該当氏名(鹿児島(A3セル))をWORD文字列に、書き出し、 二番目に、 B2~B21のなか(仮にB5セル)に ★☆の記号が有ると、 その行の該当氏名(山口(A5セル))をWORD文字列に、書き出すことを、 一ヶ月すべての日付(B1セルからAF1セルに該当)の★☆がある列 (B2セルからAF21セルのすべて)から抽出して、 AH2セルからAH32セルに書きだす  式 / 関数のご指導お願いいたします。

専門家に質問してみよう