• Source
    1. Option Explicit
    2.  
    3. Dim month_flg As Variant '到来月対応編集フラグ
    4.  
    5. Public Sub ①最優秀拠点部署()
    6. Dim ws As Worksheet '管理シート
    7. Dim ky_ws1 As Worksheet '拠点用順位シート①
    8. Dim ky_ws2 As Worksheet '拠点用順位シート②
    9. Dim bu_ws1 As Worksheet '部署用順位シート①
    10. Dim bu_ws2 As Worksheet '部署用順位シート②
    11. Dim folder As String 'フォルダー名
    12. Dim bname As String '元データファイル名
    13. Dim full_bname As String '元データファイル名フルパス
    14. Dim arv_month As Variant '到来月
    15. Dim srcbook As Workbook '元データブック
    16. Dim i As Long
    17. Set ky_ws1 = Worksheets("最優秀拠点経常利益")
    18. Set ky_ws2 = Worksheets("最優秀拠点収支")
    19. Set bu_ws1 = Worksheets("最優秀部署経常利益")
    20. Set bu_ws2 = Worksheets("最優秀部署収支")
    21. Set ws = Worksheets("管理")
    22. folder = ws.Cells(2, "B").Value
    23. bname = ws.Cells(2, "C").Value
    24. arv_month = ws.Cells(2, "E").Value
    25. '入力パラメータチェック
    26. Call CheckParams(folder, bname, arv_month, full_bname)
    27. If MsgBox("最優秀拠点・部署の順位シートを作成します", vbOKCancel) <> vbOK Then
    28. Exit Sub
    29. End If
    30. Call set_month_flag(arv_month, month_flg)
    31. 'Call dump_flag(month_flg)
    32. Application.ScreenUpdating = False
    33. Application.Calculation = xlCalculationManual
    34. '抽出先シートクリア
    35. Call sheet_clear(ky_ws1)
    36. Call sheet_clear(ky_ws2)
    37. Call sheet_clear(bu_ws1)
    38. Call sheet_clear(bu_ws2)
    39. '元データファイルの処理
    40. Set srcbook = Workbooks.Open(full_bname)
    41. Call sheet_rank(1, ky_ws1, ky_ws2, srcbook)
    42. Call sheet_rank(2, bu_ws1, bu_ws2, srcbook)
    43. srcbook.Close
    44. Application.Calculation = xlCalculationAutomatic
    45. Application.ScreenUpdating = True
    46. MsgBox ("完了")
    47. End Sub
    48. '入力パラメータチェック
    49. Public Sub CheckParams(ByVal folder As String, ByVal bname As String, ByVal arv_month As Variant, ByRef full_bname As String)
    50. Dim flag As Boolean
    51. flag = False
    52. If folder <> "" Then
    53. If Dir(folder, vbDirectory) <> "" Then
    54. flag = True
    55. End If
    56. End If
    57. If flag = False Then
    58. MsgBox ("フォルダ名エラー")
    59. End
    60. End If
    61. flag = False
    62. If bname <> "" Then
    63. full_bname = folder & "\" & bname
    64. If Dir(full_bname, vbNormal) <> "" Then
    65. flag = True
    66. End If
    67. End If
    68. If flag = False Then
    69. MsgBox ("元データファイル名エラー")
    70. End
    71. End If
    72. flag = False
    73. If arv_month <> "" And IsNumeric(arv_month) = True And CLng(arv_month) = arv_month Then
    74. If arv_month > 0 And arv_month < 13 Then
    75. flag = True
    76. End If
    77. End If
    78. If flag = False Then
    79. MsgBox ("到来月エラー")
    80. End
    81. End If
    82. End Sub
    83.  
    84. '順位シートの設定
    85. Private Sub sheet_rank(ByVal mode As Long, ByVal ws1 As Worksheet, ByVal ws2 As Worksheet, ByVal wbook As Workbook)
    86. Dim wn1 As String '作業シート名①
    87. Dim wn2 As String '作業シート名②
    88. Dim wk1 As Worksheet '作業①
    89. Dim wk2 As Worksheet '作業②
    90. Dim src_ws As Worksheet '元データのワークシート
    91. Dim src_name As String '元データの拠点名/部署名
    92. Dim src_col As Long '元データの月インデックス対応の開始カラム位置
    93. Dim i As Long
    94. Dim wk_row As Long '作業シートの行番号
    95. Dim wk_col As Long '作業シートの月インデックス対応の開始カラム位置
    96. ThisWorkbook.Activate
    97. wn1 = "作業①"
    98. wn2 = "作業②"
    99. Dim ws As Worksheet '追加
    100. For Each ws In Worksheets '追加
    101. MsgBox ("<" & ws.Name & ">") '追加
    102. Next '追加
    103. Set wk1 = Worksheets(wn1)
    104. Set wk2 = Worksheets(wn2)
    105. wk1.Cells.ClearContents
    106. wk2.Cells.ClearContents
    107. wbook.Activate
    108. wk_row = 0
    109. '元データファイルのワークシート分繰り返し
    110. For Each src_ws In Worksheets
    111. '指定区分(1:拠点,2:部署)のワークシートなら処理する
    112. If IsNumeric(src_ws.Range("A1").Value) = True Then
    113. If src_ws.Range("A1").Value = mode Then
    114. wk_row = wk_row + 1
    115. src_name = src_ws.Range("B1").Value
    116. '全月分繰り返す
    117. For i = 0 To UBound(month_flg)
    118. '当該月インデックスの月が到来済みなら処理する
    119. If month_flg(i) = True Then
    120. src_col = get_src_col_by_index(i)
    121. wk_col = get_work_col_by_index(i)
    122. If IsNumeric(src_ws.Cells(176, src_col + 21).Value) = False Then
    123. MsgBox ("経常利益達成率不正")
    124. src_ws.Cells(176, src_col + 21).Select
    125. Application.Calculation = xlCalculationAutomatic
    126. End
    127. End If
    128. '経常利益
    129. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col).Value = src_name 'エリア/支店
    130. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 1).Value = src_ws.Cells(176, src_col + 5).Value '粗利計画
    131. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 2).Value = src_ws.Cells(176, src_col + 8).Value '粗利実績
    132. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 3).Value = src_ws.Cells(176, src_col + 21).Value '達成率対計画金額
    133. ThisWorkbook.Worksheets(wn1).Cells(wk_row, wk_col + 4).Value = src_ws.Cells(176, src_col + 22).Value '伸長額対計画金額
    134. If IsNumeric(src_ws.Cells(181, src_col + 21).Value) = False Then
    135. MsgBox ("収支 合計達成率不正")
    136. src_ws.Cells(181, src_col + 21).Select
    137. Application.Calculation = xlCalculationAutomatic
    138. End
    139. End If
    140. '収支 合計
    141. ThisWorkbook.Worksheets(wn2).Cells(wk_row, wk_col).Value = src_name 'エリア/支店
    142. ThisWorkbook.Worksheets(wn2).Cells(wk_row, wk_col + 1).Value = src_ws.Cells(181, src_col + 5).Value '粗利計画
    143. ThisWorkbook.Worksheets(wn2).Cells(wk_row, wk_col + 2).Value = src_ws.Cells(181, src_col + 8).Value '粗利実績
    144. ThisWorkbook.Worksheets(wn2).Cells(wk_row, wk_col + 3).Value = src_ws.Cells(181, src_col + 21).Value '達成率対計画金額
    145. ThisWorkbook.Worksheets(wn2).Cells(wk_row, wk_col + 4).Value = src_ws.Cells(181, src_col + 22).Value '伸長額対計画金額
    146. End If
    147. Next
    148. End If
    149. End If
    150. Next
    151. ThisWorkbook.Activate
    152.  
    153. Call sheet_rank_div(ws1, wk1, wk_row) '経常利益の設定
    154. Call sheet_rank_div(ws2, wk2, wk_row) '収支 合計の設定
    155. End Sub
    156. '収支毎の順位シートの設定
    157. Private Sub sheet_rank_div(ByVal ws As Worksheet, ByVal wk As Worksheet, ByVal maxrow As Long)
    158. Dim i As Long
    159.  
    160. Dim wk_col As Long '作業シートの月インデックス対応の開始カラム位置
    161. Dim tr_col As Long '順位シートの月インデックス対応の開始カラム位置
    162. Dim wk_row As Long '作業シートの行番号
    163. Dim stcol As String
    164. Dim encol As String
    165. Dim keycol As String
    166. If maxrow = 0 Then Exit Sub
    167. '全月分繰り返す
    168. For i = 0 To UBound(month_flg)
    169. If month_flg(i) = True Then
    170. '作業シートを達成率降順でソート
    171. wk_col = get_work_col_by_index(i)
    172. tr_col = get_trg_col_by_index(i)
    173. stcol = ConvertToLetter(wk_col)
    174. encol = ConvertToLetter(wk_col + 4)
    175. keycol = ConvertToLetter(wk_col + 4) '修正20190311
    176. wk.Range(stcol & "1:" & encol & maxrow).Sort key1:=wk.Range(keycol & "1"), order1:=xlDescending
    177. '順位シートへ対象全てコピー
    178. For wk_row = 1 To maxrow
    179. ws.Cells(wk_row + 4, tr_col + 1).Value = wk.Cells(wk_row, wk_col).Value 'エリア/支店
    180. ws.Cells(wk_row + 4, tr_col + 2).Value = wk.Cells(wk_row, wk_col + 1).Value '粗利計画
    181. ws.Cells(wk_row + 4, tr_col + 3).Value = wk.Cells(wk_row, wk_col + 2).Value '粗利実績
    182. ws.Cells(wk_row + 4, tr_col + 4).Value = wk.Cells(wk_row, wk_col + 3).Value '達成率対計画金額
    183. ws.Cells(wk_row + 4, tr_col + 5).Value = wk.Cells(wk_row, wk_col + 4).Value '伸長額対計画金額
    184. Next
    185. End If
    186. Next
    187. End Sub
    188. '到来月管理テーブルの設定
    189. Public Sub set_month_flag(ByVal arv_month As Variant, ByRef month_flg As Variant)
    190. Dim month_arr As Variant
    191. '到来月管理テーブルの設定
    192. '10, 11, 12, 第1四半期, 1, 2, 3,第2四半期, 上半期, 4, 5, 6,第3四半期, 7, 8, 9,第4四半期,下半期,年間
    193. month_arr = Array(10, 11, 12, 10, 1, 2, 3, 1, 10, 4, 5, 6, 4, 7, 8, 9, 7, 4, 10)
    194. month_flg = Array(0)
    195. ReDim month_flg(UBound(month_arr))
    196.  
    197. Dim i As Long
    198. Dim smm As Long 'テーブル内の各月
    199. Dim tmm As Long '到来月
    200. tmm = arv_month
    201. If tmm < 10 Then tmm = tmm + 12
    202. For i = 0 To UBound(month_arr)
    203. smm = month_arr(i)
    204. If smm < 10 Then smm = smm + 12
    205. If smm > tmm Then
    206. month_flg(i) = False
    207. Else
    208. month_flg(i) = True
    209. End If
    210. Next
    211. End Sub
    212.  
    213. '順位表シートクリア
    214. Private Sub sheet_clear(ByVal ws As Worksheet)
    215. Dim i As Long
    216. Dim scol As Long
    217. Dim wrow As Long
    218. For i = 0 To UBound(month_flg)
    219. Dim maxrow As Long
    220. maxrow = ws.Cells(Rows.Count, "A").End(xlUp).Row 'A列最大行取得
    221. For wrow = 5 To maxrow
    222. scol = get_trg_col_by_index(i)
    223. ws.Cells(wrow, scol + 1).Value = "" 'エリア/支店
    224. ws.Cells(wrow, scol + 2).Value = "" '粗利計画
    225. ws.Cells(wrow, scol + 3).Value = "" '粗利実績
    226. ws.Cells(wrow, scol + 4).Value = "" '達成率対計画金額
    227. ws.Cells(wrow, scol + 5).Value = "" '伸長額対計画金額
    228. Next
    229. Next
    230. End Sub
    231. '月のindexから先頭のカラム位置を取得(順位シート)
    232. Private Function get_trg_col_by_index(ByVal mx As Long)
    233. get_trg_col_by_index = 1 + mx * 6
    234. End Function
    235. '月のindexから先頭のカラム位置を取得(作業シート)
    236. Private Function get_work_col_by_index(ByVal mx As Long)
    237. get_work_col_by_index = 1 + mx * 5
    238. End Function
    239. '月のindexから先頭のカラム位置を取得(元データファイルのシート)
    240. Private Function get_src_col_by_index(ByVal mx As Long)
    241. get_src_col_by_index = 3 + mx * 23
    242. End Function
    243. 'カラム番号を文字に変換する
    244. Public Function ConvertToLetter(ByVal iCol As Long) As String
    245. Dim iAlpha As Long
    246. Dim iRemainder As Long
    247. iAlpha = Int((iCol - 1) / 26)
    248. iRemainder = iCol - (iAlpha * 26)
    249. If iAlpha > 0 Then
    250. ConvertToLetter = Chr(iAlpha + 64)
    251. End If
    252. If iRemainder > 0 Then
    253. ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
    254. End If
    255. End Function
    256. '月フラグの印字(デバッグ確認用)
    257. Private Sub dump_flag(ByVal month_flg As Variant)
    258. Dim i As Long
    259. For i = 0 To UBound(month_flg)
    260. Debug.Print "i=" & i & " " & month_flg(i)
    261. Next
    262. End Sub
    263.  
    264.  
    265.  
    266. your text goes here