VBA初心者です。
ネットで「VBA条件一致」で検索して色々なものを見て自分なりにやってはいるのですが、
どうしても思い通りにいきません。
お助けいただけると嬉しいです。
<やりたいこと>
採用に繋がった「ステータス」の集計
例:新規⇒書類送付待ち⇒面接⇒選考中⇒採用済
という流れの場合、
「書類送付待ち」「面接」「選考中」にそれぞれカウント1をつける。
メールアドレスが一緒ならSheet1のB列、C列を見る。
C列が「採用済」になるまで見る。
C列が「採用済」だった場合、
これまで辿ってきたプロセス(ステータス前・後)を見て、
採用に繋がったものをSheet2のB列にカウントしていく、という手順になります。
※補足
・「採用済」になったメールアドレスは以降出てきません。
・「採用済」以外のメールアドレスは更新されます。
・添付例の黄色のメールアドレスのステータスで例えば「面接」は2件存在しますが
Sheet2へ加算するときは1件としてカウントします。
参考までに現在書いているコードです。
ArrayListがうまく使えずにいます。
そもそもコードが間違えているのか、別の問題なのかわからずにいます。
代替コードがあればご教授いただけると嬉しいです。
Sub saiyouritu()
'=====変数を宣言=====
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim Rmax1 As Long
Dim Rmax2 As Long
Dim dicST_count As Object 'ステータス一覧 件数
Dim dicST_row As Object 'ステータス一覧 行番号
Dim dicML As Object 'メール一覧
Dim dicSY As Object '採用済の一覧
Dim dicW As Object 'ステータス作業用
Dim worw As Long
Dim key As Variant
Dim ArrList As Object 'ArrayList
Dim st1 As String
Dim st2 As String
Dim st As Variant
'=====定義をセット=====
Set dicST_count = CreateObject("Scripting.Dictionary") '連想配列の定義
Set dicST_row = CreateObject("Scripting.Dictionary") '連想配列の定義
Set dicML = CreateObject("Scripting.Dictionary") '連想配列の定義
Set dicSY = CreateObject("Scripting.Dictionary") '連想配列の定義
Set ws1 = Sheets("Sheet1")
Set ws2 = Sheets("Sheet2")
'=====最終行を取得=====
Rmax1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row 'Sheet1のA列
Rmax2 = ws2.Cells(Rows.Count, "A").End(xlUp).Row 'Sheet2のA列
'=====ステータスの行番号を登録=====
For wrow = 2 To Rmax2
key = ws2.Cells(wrow, "A")
dicST_row(key) = wrow
dicST_count(key) = 0
Next
'=====メアド一覧・ステータスを取得======
For worw = 2 To Rmax1
key = ws1.Cells(wrow, "A")
st1 = ws1.Cells(wrow, "B")
st2 = ws1.Cells(wrow, "C")
If dicML.Exists(key) = False Then
Set ArrList = CreateObject("System.Collections.ArrList")
dicML.Add key, ArrList
End If
dicML(key).Add ws1 dicML(key).Add ws2 If ws2 = "採用済" Then dicSY(key) = True End If
Next
'=====採用済のメールのみ処理=====
For Each key In dicSY
Set ArrList = dicML(key)
Set dicW = CreateObject("Scripting.Dictionary")
'=====重複ステータスの削除===== For Each st In ArrList dicW(st) = True Next '=====ステータスの加算===== For Each st In dicW If dicST_count.Exists(st) = True Then dicST_count(st) = dicST_count(st) + 1 Else MsgBox (st & "はSheet2に登録されていません") Exit Sub End If Next
Next
'=====Sheet2へ書き込み=====
For Each key In dicST_count
worw = dicST_row(key)
ws2.Cells(wrow, "B") = dicST_count(key)
Next
MsgBox ("完了")
End Sub