No.1です!
補足の
>処理が重くなってしまい、
すなわち、かなりのデータ量がある!というコトですね?
となると、For~Next でループさせたり、前回の関数の方法をマクロでやったとしても
おそらくExcelが「応答なし」になってしまうと思いますので、
オートフィルタの方法でやってみました。
尚、元データがSheet1にあり、結果をD列に表示させるとします。
そして、Sheet2を作業用のSheetとして使用していますので、
Sheet2は全く使用していない状態でマクロを試してみてください。
今回もSheet1のA2以降にデータがあるとします。
(Sheet1の1行目の項目はA~D列まで入れておいてください。)
標準モジュールです。
Sub Sample1()
Dim i As Long, endRow1 As Long, endRow2 As Long, wS1 As Worksheet, ws2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
endRow1 = wS1.Cells(Rows.Count, "B").End(xlUp).Row
wS1.Range("E:E").Insert '←E列以降使用していない場合は不要
wS1.Range("E1") = "ダミー"
Range(wS1.Cells(2, "E"), wS1.Cells(endRow1, "E")).Formula = "=B2 & ""_"" & C2"
Range(wS1.Cells(1, "E"), wS1.Cells(endRow1, "E")).AdvancedFilter Action:=xlFilterInPlace, unique:=True
wS1.Range("E:E").Copy ws2.Range("A1")
wS1.ShowAllData
endRow2 = ws2.Cells(Rows.Count, "A").End(xlUp).Row
Range(ws2.Cells(2, "B"), ws2.Cells(endRow2, "B")).Formula = "=LEFT(A2,FIND(""_"",A2)-1)"
Range(ws2.Cells(2, "C"), ws2.Cells(endRow2, "C")).Formula = "=COUNTIF(B:B,B2)"
For i = 2 To endRow2
wS1.Range("A1").AutoFilter field:=5, Criteria1:=ws2.Cells(i, "A")
Range(wS1.Cells(2, "D"), wS1.Cells(endRow1, "D")).SpecialCells(xlCellTypeVisible) = ws2.Cells(i, "C")
Next i
wS1.AutoFilterMode = False
wS1.Range("E:E").Delete
ws2.Cells.Clear
Application.ScreenUpdating = True
MsgBox "処理完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
お礼
すごいです!実現できました! 迅速に分かりやすくご回答頂き、大変ありがとうございました。
補足
エクセルの関数で実装したところ、処理が重くなってしまい、VBAでの実装を検討しています。 実装案をぜひお聞かせください。