- ベストアンサー
Excl並び替えマクロについて
誰かお願いします。 人事のデータで並び替えのマクロを作成したいです。 誰かが入社した場合 (今の人事データ) 営業部 営業課 松井秀喜 営業部 営業課 鈴木一郎 営業部 営業支援 高橋慶喜 開発部 開発課 中田英寿 開発部 開発課 中村俊輔 こーいった人事データがあるとして(実際もっと他にも 部、課、社員があります) ここに 営業部 営業支援 小野伸二 が入社したとします。あとから入社した人を先にいる人の次の行(高橋の後)に挿入したいです。 どなたかご鞭撻よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 質問を読ませていただいた感じでは、「あとから入社した人を先にいる人の次の行」に入れるのであって、それは、Excelの「並べ替え」の範囲とは、違ったものだと解釈しました。 それも、営業部ではなくて、営業部+営業支援という並びで探さなくてはならないわけだと思います。Findメソッドで、2重検索は、補助列を作らない限りは、出来そうにもありません。後は、可能性としてはAdvnacedFilterぐらいかと思います。 そこで、以下を考えてみました。 ただし、一つだけ、このマクロには条件があります。それは、少なくとも、部・課自体は並べ替えが済んでいて、点在して存在していないことです。 以下のマクロをサブルーチンにして、検索行を引数に取るようにすれば、検索行は、複数あっても可能だと思います。 検索行を以下に設定します。 F2~ F G H 営業部 営業支援 小野伸二 とシートに書き込んでください。 ユーザー設定は、以下の二つです。 Set kensaku = Range("F2") Set r = Range("A2", Range("A2").End(xlDown)) 以下は、シートモジュールか、標準モジュールにしてください。 なお、このマクロは、同じものを二重に登録する可能性を考慮していません。 Option Explicit Sub Sample1() Dim r As Range, Kensaku As Range, rc As Long, i As Long Dim num As Variant, k As Long Dim ar() As Variant 'データの左端 (要ユーザー設定) Set r = Range("A2", Range("A2").End(xlDown)) rc = r(r.Count).Row '最終行 '検索行の左端セル(要ユーザー設定) Set Kensaku = Range("F2") If IsEmpty(Kensaku) Then _ MsgBox "検索値がありません。", vbCritical: Exit Sub k = 1 For i = r.Rows.Count To 1 Step -1 '2つの列を配列に逆さまに入れる ReDim Preserve ar(1 To k) ar(k) = r.Cells(i, 1).Value & r.Offset(, 1).Cells(i, 1).Value k = k + 1 Next i 'Match 関数を使って調べる num = Application.Match(Kensaku.Value & Kensaku.Offset(, 1).Value, _ ar, 0) If Not IsError(num) Then Rows(rc - num + 2).Insert Rows(rc - num + 2).Resize(, 3).Value = Kensaku.Resize(, 3).Value Kensaku.Resize(, 3).ClearContents Else If MsgBox("該当する部・課が見つかりません。" & _ "最後尾にデータを貼り付けますか", 32 + vbOKCancel) = vbOK Then Rows(rc + 1).Resize(, 3).Value = Kensaku.Resize(, 3).Value Kensaku.Resize(, 3).ClearContents End If End If Set r = Nothing: Set Kensaku = Nothing End Sub
その他の回答 (2)
- asuka546
- ベストアンサー率21% (21/99)
結局営業部の一番下の人の下に挿入できればいいんですよね? 営業部を検索し、営業部ではない場所まで下に移動した後挿入と言うマクロです。(検索語を入力するセルを作ってそのセルの値から検索のほうが使いやすいとは思いますが) 並び替えを行ったと後に使用すれば使えるのではないと思います。 Sub 検索して挿入() Dim kensaku As Range Dim ken As String Dim a As Long '検索する語が営業部で、検索する列がA列に有る場合 Set kensaku = Range("A:A").Find(What:="営業部") kensaku.Select ken = Selection.Value MsgBox ken Do Until Not ActiveCell.Value = ken ActiveCell.Offset(1).Select Loop Range(Selection, Selection.End(xlToRight)).Insert xlShiftDown End Sub
- imogasi
- ベストアンサー率27% (4737/17070)
普通は部、課にはコードを(会社が)設定します。会社が設定してないなら 自分で設定します。 職員には職員コードを設定します。 入社した人を最後に来るようにするには、入社年月日をデータとして持ちます。 そして部+課+職位+入社年月日などでソートします。 そのつどソートとしないなら、ファイルに追加する人の、その順序のところを探して、挿入します。 ですから、どう言う設計にするかが書かれていないので、答えにくいのです。 (1)最後に追加して、諸コードで全体ソート (2)しかるべき場所を探して挿入。しかるべきところを探すにしても 母体(マスタ)は諸コード順にソートされている(前回追加後ソートしておく)場合が多いと思います。 VBAでソートしたいならマクロの記録をとって、少し修正すればよいことです。 設計というか、そういうことが肝心、すんでいるなら、質問に、どういう設計になっているか、それらを説明することが肝心です。