- ベストアンサー
エクセルで、複数の行を自動的に選択してコピーして張り付ける方法はないでしょうか?
エクセル関数の使い方で質問があります。 例えば、次のようにエクセルで配列があったとします。 表1 レベル 名前 生年月日 身長 1 A 田中 1954 175 2 B 岸辺 1842 187 3 A 仲居 1983 153 4 C 室井 1934 156 この時に、別の所(表2)に、上の表をレベル別に選択して列を振り分けたいしたいのですが、どうすればいいでしょうか? 例えば、レベルがAの場合、表1に入力しただけで、自動的に表1からレベルAが選択され表2が完成するという感じです。 表2 1 A 田中 1954 175 2 A 仲居 1983 153 ちなみに、VLOOKUPを使ってやってみたのですが、最初の一番目の列(1 A 田中 1954 175)だけができて、2番目の列からできませんでした。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
これも毎日のように出る、条件で「抜き出し問題」です。 このタイプも2つあって。 (1)1つ指定(質問ではA)で該当抜き出して終わり。別の機会には Bを指定。B該当分抜き出し。のように1種抜き出し。 (2)A,B,C・・をシートを分けて書き出し。 本質問はどっちかはっきりしないが、(2)か。 ーー (1)の場合 imogasi方式でGoogle照会すれば沢山過去の同タイプの質問回答例が出ます。 もともと私のやり方につけた名前ですが、他の同様質問例が判ること且つ他の回答者の方法も載っていてわかります。 フィルタもこのタイプに適したものでしょう。 (2)の場合は、関数では、関数を各シートへ入れることになるが、A,B,C・・が多いと大変。 (2)ではimogasi方式ではA,B,Cごとに作業列が要るので実質使えません。 A、B,C・・の列でソートして、VBAなどで各シートに振り分けるプログラムを作ることになるでしょう。 むしろピボットテーブルなどで分類できるので、実を取るほうが良いと思うが、過去の質問者は乗ってこない。関数好き(関数しか知らない)人が多いようです。 作業列を使わない関数でやる方法は、既回答にもあり、imogasi方式で照会して出てくる回答にもありますが、式が長く理解が難しいです。 ーー エクセルの関数は初出の(字またはセル)ものしか見つけられない という特徴を覚えておくこと。 ーー以下用語注意 >エクセルで配列があったとします。 配列 データの並びという意味で使っているのでしょうが、配列には、ほかに特別の意味がある(特にプログラムでは)ので、公の場では使わないように。「表」という方言で良いのでは。 ーー 表1 この意味は「シート1」ということらしいが、表とシートは峻別して使うこと。
その他の回答 (3)
- kuma3f
- ベストアンサー率63% (28/44)
思われていることと違っていましたらすみませんがExcel2007でなければ、参考までに試してみてください。 Altキー押しながらF8キーを押します。 ↓ マクロのダイアログが表示されたらマクロ名に自由に名前を入力してください。(例:抽出) ↓ 名前を入力しましたら、「作成」をクリック ↓ Microsoft Visual Basicの画面が開きますのでSub 抽出()の下に次のコードをコピーして貼り付けてください。 Dim s1cnt, s1max, s2cnt, sw As Long Dim sname, Aname As String sname = ActiveWorkbook.ActiveSheet.Name Aname = InputBox("抽出したいレベルを入力してください。") sw = 0 On Error GoTo skip1 Sheets("抽出シート").Select sw = 1 skip1: If sw = 0 Then Sheets.Add ActiveWorkbook.ActiveSheet.Name = "抽出シート" End If Sheets("抽出シート").Cells.ClearContents Sheets(sname).Select s1max = Application.WorksheetFunction.CountA(Worksheets(sname).Range("A1:A65536")) Sheets(sname).Rows(1).Select Selection.Copy Sheets("抽出シート").Select Sheets("抽出シート").Rows(1).Select ActiveSheet.Paste Application.CutCopyMode = False s1cnt = 2 s2cnt = 2 Do If Trim(Aname) = Trim(Sheets(sname).Cells(s1cnt, 1)) Then Sheets(sname).Select Sheets(sname).Rows(s1cnt).Select Selection.Copy Sheets("抽出シート").Select Sheets("抽出シート").Rows(s2cnt).Select ActiveSheet.Paste Application.CutCopyMode = False s2cnt = s2cnt + 1 End If s1cnt = s1cnt + 1 Loop Until s1cnt > s1max Sheets(sname).Select Sheets(sname).Range("A1").Select Sheets("抽出シート").Select Sheets("抽出シート").Range("A1").Select MsgBox "抽出しました。" '****コピー貼り付けはここまで **** Microsoft Visual Basicの画面を×で閉じます。 使い方は、Altキー押しながらF8キーを押します。 マクロのダイアログが表示されるのでそのままEnterキーを押します。 抽出したいレベルを聞いてきますので、AならAと入力しEnterキーを押します。 抽出シートに抽出されると思います。
- izmlz
- ベストアンサー率55% (67/120)
=IF(ROW(A1)<=COUNTIF($A$1:$A$30,"A"),INDEX(B$1:B$30,SMALL(IF($A$1:$A$30="A",ROW($A$1:$A$30),""),ROW(A1))),"") をCtrl+Shift+Enterで入力、これを二つ隣の列まで、そして適当な行までコピー&ペーストでいかがでしょうか?なお、上記数式は一行目に入力する前提で作成しています。 なお、表2の一番左の列には↓を入力 =IF(ROW(A1)<=COUNTIF($A$1:$A$30,"A"),"A","")
- izmlz
- ベストアンサー率55% (67/120)
表示が同じ所でよければ、メニュー[データ]-[フィルタ]-[オートフィル]が簡単です。 [オートフィルタ]ボタンをメニューバーあるいはツールバーに一回登録しておけば、表示させたい項目(たとえば、この質問の場合だとレベルのA)を選択してから、[オートフィルタ]ボタンをクリック、で特定項目だけを表示させることができるようになります。 ↓が参考ページです。 エクセル技道場-オートフィルタ http://www2.odn.ne.jp/excel/waza/edit.html#SEC19 表示が他の所の場合には、メニュー[データ]-[フィルタ]-[フィルタオプションの設定]を使います。
補足
返信ありがとうございます。 同じ場所ではだめです。重要なことは、表1を作成すれば、後は何も操作せずに、表2ができるというところです。