fork download
  1. Option Explicit
  2.  
  3. Dim month_flg As Variant '到来月対応編集フラグ
  4.  
  5. Public Sub 最優秀個人数量売上2()
  6. Dim ws As Worksheet '管理シート
  7. Dim kj_ws As Worksheet '個人別順位シート
  8. Dim folder As String 'フォルダー名
  9. Dim bname As String '元データファイル名
  10. Dim sname As String '元データファイルのシート名
  11. Dim full_bname As String '元データファイル名フルパス
  12. Dim arv_month As Variant '到来月
  13. Dim srcbook As Workbook '元データブック
  14. Dim src_ws As Worksheet '元データブックのシート
  15. Dim i As Long
  16. Dim num_array As Variant '通番
  17. Dim col_array As Variant '数量売上実績の相対列(0オリジン)
  18. Dim trgname As String
  19. num_array = Array("①", "②", "③", "④", "⑤", "⑥")
  20. col_array = Array(2, 2, 3, 2, 3, 3)
  21. Set ws = Worksheets("管理")
  22. folder = ws.Cells(3, "B").Value
  23. bname = ws.Cells(3, "C").Value
  24. sname = ws.Cells(3, "D").Value
  25. arv_month = ws.Cells(3, "E").Value
  26. '入力パラメータチェック
  27. Call CheckParams(folder, bname, arv_month, full_bname)
  28. If sname = "" Then
  29. MsgBox ("シート名エラー")
  30. Exit Sub
  31. End If
  32. If MsgBox("個人別順位シート①~⑥を作成します", vbOKCancel) <> vbOK Then
  33. Exit Sub
  34. End If
  35. Call set_month_flag(arv_month, month_flg)
  36. Application.ScreenUpdating = False
  37. Application.Calculation = xlCalculationManual
  38. '元データファイルのオープン
  39. Set srcbook = Workbooks.Open(full_bname)
  40. If check_sheet_name(sname) = False Then
  41. MsgBox ("シート名エラー(" & sname & ")は" & bname & "に存在しません")
  42. srcbook.Close
  43. Application.Calculation = xlCalculationAutomatic
  44. Exit Sub
  45. End If
  46. Set src_ws = Worksheets(sname)
  47. For i = 0 To UBound(num_array)
  48. trgname = "個人別" & num_array(i)
  49. Set kj_ws = ThisWorkbook.Worksheets(trgname)
  50. '抽出先シートクリア
  51. Call sheet_clear(kj_ws)
  52. '順位作成
  53. Call sheet_rank(kj_ws, src_ws, srcbook, num_array(i), col_array(i))
  54. Next
  55. '元データファイルのクローズ
  56. srcbook.Close
  57. Application.Calculation = xlCalculationAutomatic
  58. Application.ScreenUpdating = True
  59. MsgBox ("完了")
  60.  
  61. End Sub
  62.  
  63. '順位シートの設定
  64. Private Sub sheet_rank(ByVal kj_ws As Worksheet, ByVal src_ws As Worksheet, ByVal wbook As Workbook, ByVal num As String, ByVal rel_col As Long)
  65. Dim wn1 As String '作業シート名①
  66. Dim wk1 As Worksheet '作業シート①
  67. Dim edt_row As Long '元データの各人対応の編集行
  68. Dim src_col As Long '元データの月インデックス対応の開始カラム位置
  69. Dim i As Long
  70. Dim ps As Long
  71. Dim wk_row As Long '作業シートの行番号
  72. Dim wk_col As Long '作業シートの月インデックス対応の開始カラム位置
  73. Dim maxrow As Long '元データのG列最終行
  74. Dim maxps As Long '最大担当者数
  75. ThisWorkbook.Activate
  76. wn1 = "作業①"
  77. Set wk1 = Worksheets(wn1)
  78. wk1.Cells.ClearContents
  79. wbook.Activate
  80. maxrow = src_ws.Cells(Rows.Count, "G").End(xlUp).Row 'sheetのG列最大行取得
  81. If maxrow < 34 Or ((maxrow - 3) Mod 31) <> 0 Then
  82. MsgBox ("元データG列の最終行不正")
  83. src_ws.Cells(maxrow, "G").Select
  84. Application.Calculation = xlCalculationAutomatic
  85. End
  86. End If
  87. maxps = (maxrow - 3) \ 31
  88. wk_row = 0
  89. '人数分繰り返す
  90. For ps = 1 To maxps
  91. edt_row = GetRowNo(ps, src_ws, num) '抽出対象の行を取得
  92. '抽出対象の行があった場合、処理する
  93. If edt_row <> 0 Then
  94. wk_row = wk_row + 1
  95. '全月分繰り返す
  96. For i = 0 To UBound(month_flg)
  97. '当該月インデックスの月が到来済みなら処理する
  98. If month_flg(i) = True Then
  99. src_col = get_src_col_by_index(i)
  100. wk_col = get_work_col_by_index(i)
  101. If IsNumeric(src_ws.Cells(edt_row, src_col + rel_col).Value) = False Then
  102. MsgBox ("数量売上不正")
  103. src_ws.Cells(edt_row, src_col + rel_col).Select
  104. Application.Calculation = xlCalculationAutomatic
  105. End
  106. End If
  107. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col).Value = src_ws.Cells(edt_row, "B").Value '拠点
  108. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 1).Value = src_ws.Cells(edt_row, "C").Value '課
  109. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 2).Value = src_ws.Cells(edt_row, "D").Value '担当者
  110. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 3).Value = src_ws.Cells(edt_row, src_col + 1).Value
  111. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 4).Value = src_ws.Cells(edt_row, src_col + 5).Value
  112. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 5).Value = src_ws.Cells(edt_row, src_col + 7).Value
  113. '追加開始 2019.03.14
  114. If num = "④" Then
  115. Dim prow As Long
  116. prow = GetRowNo(ps, src_ws, "③") '③の抽出対象の行を取得
  117. If prow <> 0 Then
  118. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 3).Value = src_ws.Cells(edt_row, src_col + 1).Value - src_ws.Cells(prow, src_col + 1).Value '数量計画
  119. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 4).Value = src_ws.Cells(edt_row, src_col + 5).Value - src_ws.Cells(prow, src_col + 5).Value '数量売上実績
  120. End If
  121. End If
  122. '追加終了 2019.03.14
  123. '対計画達成/未達成額 追加開始20190311
  124. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 6).Value = _
  125. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 4).Value - ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 3).Value
  126. '対計画達成/未達成額 追加終了20190311
  127. End If
  128. Next
  129. End If
  130. Next
  131. ThisWorkbook.Activate
  132. Call sheet_rank_div(kj_ws, wk1, wk_row) '個人別の順位設定
  133. End Sub
  134. '抽出対象の行番号を求める
  135. 'ps:担当者の番号(1~99)
  136. Private Function GetRowNo(ByVal ps As Long, ByVal src_ws As Worksheet, ByVal num As String)
  137. Dim str_row As Long
  138. Dim wrow As Long
  139. Dim goukei As String
  140. goukei = num & "合計"
  141. str_row = (ps - 1) * 31 + 4
  142. For wrow = str_row To (str_row + 30)
  143. '支店/課/担当者/合計が空白でないなら処理する
  144. If src_ws.Cells(wrow, "B").Value <> "" And src_ws.Cells(wrow, "C").Value <> "" And src_ws.Cells(wrow, "D").Value <> "" And src_ws.Cells(wrow, "E").Value = goukei Then
  145. GetRowNo = wrow
  146. Exit Function
  147. End If
  148. Next
  149. GetRowNo = 0
  150. End Function
  151. '個人別の順位シートの設定
  152. Private Sub sheet_rank_div(ByVal ws As Worksheet, ByVal wk As Worksheet, ByVal maxrow As Long)
  153. Dim i As Long
  154. Dim wk_col As Long '作業シートの月インデックス対応の開始カラム位置
  155. Dim tr_col As Long '順位シートの月インデックス対応の開始カラム位置
  156. Dim wk_row As Long '作業シートの行番号
  157. Dim stcol As String
  158. Dim encol As String
  159. Dim keycol As String
  160. If maxrow = 0 Then Exit Sub
  161. '全月分繰り返す
  162. For i = 0 To UBound(month_flg)
  163. If month_flg(i) = True Then
  164. '作業シートを数量売上実績降順でソート
  165. wk_col = get_work_col_by_index(i)
  166. tr_col = get_trg_col_by_index(i)
  167. stcol = ConvertToLetter(wk_col)
  168. encol = ConvertToLetter(wk_col + 6) '修正20190311
  169. keycol = ConvertToLetter(wk_col + 6) '修正20190311
  170. wk.Range(stcol & "1:" & encol & maxrow).Sort key1:=wk.Range(keycol & "1"), order1:=xlDescending
  171. '順位シートへコピー
  172. For wk_row = 1 To maxrow
  173. ws.Cells(wk_row + 4, tr_col + 1).Value = wk.Cells(wk_row, wk_col).Value '支店
  174. ws.Cells(wk_row + 4, tr_col + 2).Value = wk.Cells(wk_row, wk_col + 1).Value '課
  175. ws.Cells(wk_row + 4, tr_col + 3).Value = wk.Cells(wk_row, wk_col + 2).Value '担当者
  176. ws.Cells(wk_row + 4, tr_col + 4).Value = wk.Cells(wk_row, wk_col + 3).Value '数量売上計画
  177. ws.Cells(wk_row + 4, tr_col + 5).Value = wk.Cells(wk_row, wk_col + 4).Value '数量売上実績
  178. ws.Cells(wk_row + 4, tr_col + 6).Value = wk.Cells(wk_row, wk_col + 5).Value '対計画達成率
  179. ws.Cells(wk_row + 4, tr_col + 7).Value = wk.Cells(wk_row, wk_col + 6).Value '対計画達成/未達成額 追加20190311
  180. Next
  181. End If
  182. Next
  183. End Sub
  184.  
  185. '順位表シートクリア
  186. Private Sub sheet_clear(ByVal ws As Worksheet)
  187. Dim i As Long
  188. Dim scol As Long
  189. Dim wrow As Long
  190. Dim maxrow As Long
  191. maxrow = ws.Cells(Rows.Count, "A").End(xlUp).Row 'A列最大行取得
  192. For i = 0 To UBound(month_flg)
  193. For wrow = 5 To maxrow
  194. scol = get_trg_col_by_index(i)
  195. ws.Cells(wrow, scol + 1).Value = "" '支店
  196. ws.Cells(wrow, scol + 2).Value = "" '課・営業所
  197. ws.Cells(wrow, scol + 3).Value = "" '担当者名
  198. ws.Cells(wrow, scol + 4).Value = "" '数量売上計画
  199. ws.Cells(wrow, scol + 5).Value = "" '数量売上実績
  200. ws.Cells(wrow, scol + 6).Value = "" '対計画達成率
  201. ws.Cells(wrow, scol + 7).Value = "" '対計画達成/未達成額 追加20190311
  202. Next
  203. Next
  204. End Sub
  205. '月のindexから先頭のカラム位置を取得(順位シート)
  206. Private Function get_trg_col_by_index(ByVal mx As Long)
  207. get_trg_col_by_index = 1 + mx * 8
  208. End Function
  209. '月のindexから先頭のカラム位置を取得(作業シート)
  210. Private Function get_work_col_by_index(ByVal mx As Long)
  211. get_work_col_by_index = 1 + mx * 7 '修正20190311
  212. End Function
  213. '月のindexから先頭のカラム位置を取得(元データファイルのシート)
  214. Private Function get_src_col_by_index(ByVal mx As Long)
  215. get_src_col_by_index = 7 + mx * 8
  216. End Function
  217.  
  218.  
  219.  
  220.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty