Option Explicit
Dim wks As Worksheet '設定対象シート
Dim jks As Worksheet '条件シート
Dim ids As Worksheet 'IDシート
Dim dicT As Object '連想配列 キー:支店+拠点+担当者 値:G列の担当者主担当部門コード
Public Sub ポイント付与()
Dim sname As String '対象シート名
Set jks = Worksheets("★条件")
Set ids = Worksheets("★ID")
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
'対象シート取得
sname = jks.Range("J2").Value
If get_sheet(sname, wks) = False Then
MsgBox ("シート名不正<" & sname & ">")
Exit Sub
End If
Call setup_tanid '★IDシートを読み込み連想配列を作成する
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'ポイント作成開始
Call add_point("F2", "P3", "B", "F", "G", "I", "J") 'J列のポイント
Call add_point("F2", "P3", "B", "L", "M", "O", "P") 'P列のポイント
'以下ここに追加してください
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox ("完了")
End Sub
'P1: 主担当部門のセル位置 (ポイント取得用)
'P2: 担当者主担当部門のセル位置
'P3: 部門(拠点+部署+担当者)の開始列
'P4: 計画列
'P5: 実績列
'P6:達成/未達成列
'P7: ポイント付与列
Private Sub add_point(mainbm_cell As String, tanbm_cell As String, bumon_col As String, kei_col As String, jis_col As String, tas_col As String, point_col As String)
Dim maxrow As Long
Dim wrow As Long
Dim mpoint As Variant '満額ポイント
Dim mainbm_val As Variant '主担当部門
Dim point As Long '開始point
Dim ap As Double 'point
Dim bumon_colNo As Long '部門(拠点)の列番号
Dim tan_id As String '担当ID(課別)若しくは担当者主担当部門コード
Dim idrow As Long '★IDの行番号
Dim key As Variant
bumon_colNo = Range(bumon_col & "1").Column
'ポイント取得
mainbm_val = wks.Range(mainbm_cell)
mpoint = Application.HLookup(mainbm_val, jks.Range("B19:D21"), 3, 0)
If IsError(mpoint) Then
MsgBox ("★条件シートのポイント取得エラー:主担当部門<" & mainbm_val & ">")
MsgBox ("算出ポイント列=" & point_col)
Application.Calculation = xlCalculationAutomatic
End
End If
point = mpoint
maxrow = wks.Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行
wks.Range(point_col & "5:" & point_col & maxrow).Value = 0 'ポイント行を0クリア
For wrow = 5 To maxrow
'部門(拠点)なしなら終了
If wks.Cells(wrow, bumon_col) = "" Then Exit For
'該当行の担当者主担当部門コードを取得する
key = wks.Cells(wrow, bumon_colNo) & "|" & wks.Cells(wrow, bumon_colNo + 1) & "|" & wks.Cells(wrow, bumon_colNo + 2)
If dicT.exists(key) = False Then
MsgBox ("★IDシートに未登録<" & key & ">")
MsgBox ("行番号=" & wrow & " 部門(拠点)列=" & bumon_col & " 算出ポイント列=" & point_col)
ap = 0
Else
tan_id = dicT(key)
'該当行のポイントを取得する
ap = get_point(wrow, tanbm_cell, tan_id, kei_col, jis_col, tas_col, point)
End If
wks.Cells(wrow, point_col).Value = ap
'付与ポイントがあるなら、ポイントから1引く
If ap <> 0 Then
point = point - 1
End If
Next
End Sub
'シート名取得
Private Function get_sheet(sname As String, ws As Worksheet)
On Error GoTo ERR99
Set ws = Worksheets(sname)
get_sheet = True
Exit Function
ERR99:
get_sheet = False
End Function
'担当IDセットアップ
Private Sub setup_tanid()
Dim maxrow As Long
Dim wrow As Long
Dim key As Variant
maxrow = ids.Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行
For wrow = 3 To maxrow
key = ids.Cells(wrow, "B").Value & "|" & ids.Cells(wrow, "C").Value & "|" & ids.Cells(wrow, "D").Value
dicT(key) = ids.Cells(wrow, "G").Value
Next
End Sub
'付与ポイント取得
Private Function get_point(wrow As Long, tanbm_cell As String, tan_id As String, kei_col As String, jis_col As String, tas_col As String, point As Long)
Dim kei_val As Variant '計画
Dim jis_val As Variant '実績
Dim tas_val As Variant '達成/未達成
Dim rate As Double 'ポイントレート%
get_point = 0
rate = 0
kei_val = wks.Cells(wrow, kei_col)
jis_val = wks.Cells(wrow, jis_col)
tas_val = wks.Cells(wrow, tas_col)
If kei_val <= 0 And jis_val <= 0 Then Exit Function
If wks.Range(tanbm_cell).Value = tan_id Then
'担当者主担当部門と担当IDが一致
If tas_val > 0 Then
'達成/未達成>0
If kei_val >= 0 And jis_val > 0 Then rate = 100
End If
If tas_val < 0 Then
'達成/未達成<0
If kei_val > 0 Then rate = 75
End If
Else
'担当者主担当部門と担当IDが不一致
If tas_val > 0 Then
'達成/未達成>0
If kei_val = 0 And jis_val > 0 Then rate = 12.5
If kei_val > 0 And jis_val > 0 Then rate = 25
End If
End If
get_point = point * rate / 100
End Function