前提・実現したいこと
仕事の関係でExcel自体はよく利用するのですが、関数ではなくVBAを使わないと難しそうな抽出が出てきたため質問します。
①利用者名簿リスト前月
②利用者名簿リスト今月
上記の比較表をVBAで抽出・並べ替えを行おうとしています。
原本は使えない為、別途作成しました
※名前は仮で入れているだけです
実際は毎月名簿を差し替えるため、前月と当月シートには手作業で利用者名簿を載せる予定です。
上記のような名簿二つから、所属別にシートを分けて並び替えを行おうとしています。
所属毎にシートを作成して、左側に前月・右側を今月として抽出します。(マクロの中でシートを作成するようにしようと考えています)
所属はランダムではなく、作成パターンは決まっています。
その際に、前月と今月で利用している人が比較してわかるようにしたいのです。
Filter関数で所属別に整理した時は自動的に空白が詰められてしまい、うまく出来ませんでした。
・「前月利用者10」が「今月利用者にいない」場合「今月の部分に空欄を作る」
・「今月利用者13」が「先月利用者にいない」場合「先月の部分に空欄を作る」
・「前月利用者」と「今月利用者」が一致した人がいる場合、隣に並べる
これきりになると思ったため、マクロの切り貼りでうまいことできないかと色々と探したのですが・・・
まったく見つからず、こちらに質問させていただきました。
有識者の方の知識をお借りできればと思います。
よろしくお願いいたします。
試したこと
シート内から特定条件を指定して別シートに抽出する
(結局意味ありませんでした)
追記:使用したマクロがあった方が良いとアドバイスをいただきましたので、下記に示します。
①シート名が違いますが、別データで試したため気にしないでください。
こちらは単純に前月と当月で片方に居ない人を抽出するマクロとして改変して作りました。
(ttps://excel.kuuneruch.com/sabun-extra/)
Public Sub MainProc()
Dim shtMain As Worksheet
Dim motoName As String
Dim sakiName As String
Dim shtMoto As Worksheet
Dim shtSaki As Worksheet
Dim shtSabun As Worksheet
Dim lastRowMoto As Long
Dim lastRowSaki As Long
Dim lastCol As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim blnSame As Boolean
Dim blnExist As Boolean
Dim nowRow As Long
Set shtMain = ThisWorkbook.Sheets("メイン") motoName = shtMain.Range("A2") sakiName = shtMain.Range("B2") Set shtMoto = ThisWorkbook.Sheets(motoName) Set shtSaki = ThisWorkbook.Sheets(sakiName) Set shtSabun = ThisWorkbook.Sheets("比較") lastRowMoto = shtMoto.Cells(shtMoto.Rows.Count, 1).End(xlUp).Row lastCol = shtMoto.Cells(1, shtMoto.Columns.Count).End(xlToLeft).Column lastRowSaki = shtSaki.Cells(shtSaki.Rows.Count, 1).End(xlUp).Row shtSabun.Cells.Clear shtMoto.Range(shtMoto.Cells(1, 1), shtMoto.Cells(1, lastCol)).Copy (shtSabun.Cells(1, 1)) nowRow = 1 For i = 2 To lastRowMoto blnExist = False For j = 2 To lastRowSaki blnSame = True For k = 1 To lastCol If shtMoto.Cells(i, k) <> shtSaki.Cells(j, k) Then blnSame = False Exit For End If Next If blnSame = True Then blnExist = True Exit For End If Next If blnExist = False Then nowRow = nowRow + 1 shtMoto.Range(shtMoto.Cells(i, 1), shtMoto.Cells(i, lastCol)).Copy (shtSabun.Cells(nowRow, 1)) End If Next MsgBox "完了"
End Sub
②こちらは参考にして作ったのですが、うまく出来ずに丸ごと消してしまったためもともと参考にしていたサイトの物を載せます。
(ttp://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/prog/prog04.html)
Sub prog4_1()
Dim myFld As String, myCri As String
Dim myRow As Long
myFld = InputBox("検索は何列目ですか?")
myCri = InputBox("検索する語句を入力しなさい")
'オートフィルタでデータを抽出する
Worksheets("データ").Range("A1").AutoFilter Field:=myFld, Criteria1:=myCri
’抽出データの最終行を求める
myRow = Worksheets("データ").Range("A" & Rows.Count).End(xlUp).Row
'抽出先をクリアする
Worksheets("抽出").Range("A:E").ClearContents
'抽出データをコピーして貼り付け
Worksheets("データ").Range("A1:E" & myRow).Copy Worksheets("抽出").Range("A1")
'オートフィルタを解除
Worksheets("データ").Range("A1").AutoFilter
'抽出先シートをアクティブにしてA1セルを選択する
Worksheets("抽出").Activate
Range("A1").Select
End Sub