fork download
  1. Option Explicit
  2. Dim gakunen(99) As Boolean '学年(1~99)
  3. Dim kumi(99, 99) As Long '組 学年(1~99)組(1~99)
  4. Public Sub 自動転記()
  5. Dim str As String
  6. Dim msg As String
  7. Dim test_no As Long
  8. Dim ans As Integer
  9. Dim ms As Worksheet
  10. Dim ws As Worksheet
  11. Dim wrow As Long
  12. Dim wcol As Long
  13. Dim i As Long
  14. Dim j As Long
  15. Dim book_name As String
  16. Dim book_path As String
  17. Dim sheet_name As String
  18. Dim wb As Workbook
  19. Call init_table
  20. str = InputBox("テスト回入力(1~7)")
  21. If str = "" Then Exit Sub
  22. If IsNumeric(str) = False Then Exit Sub
  23. test_no = CLng(str)
  24. If test_no < 1 Or test_no > 7 Then Exit Sub
  25. msg = "第" & test_no & "回テスト結果の集計を実施します"
  26. If MsgBox(msg, vbOKCancel) <> vbOK Then Exit Sub
  27. Set ms = Worksheets("集計")
  28. '集計シートのクラスを記憶
  29. Call set_gakunen(ms, 1)
  30. Call set_gakunen(ms, 7)
  31. Call set_gakunen(ms, 13)
  32. Application.ScreenUpdating = False
  33.  
  34. '全学年の処理
  35. For i = 1 To 99
  36. If gakunen(i) = True Then
  37. book_name = i & "年テストデータ.xlsx"
  38. book_path = ThisWorkbook.Path & "\" & book_name
  39. If Dir(book_path) = "" Then
  40. MsgBox (book_path & "が存在しません")
  41. Exit Sub
  42. End If
  43. Set wb = Workbooks.Open(book_path)
  44. For j = 1 To 99
  45. If kumi(i, j) <> 0 Then
  46. sheet_name = "普" & j
  47. If check_sheet_name(wb, sheet_name) = False Then
  48. MsgBox (book_name & "内に[" & sheet_name & "]が存在しません")
  49. Exit Sub
  50. End If
  51. Set ws = wb.Worksheets(sheet_name)
  52. Call set_data(ms, test_no, kumi(i, j), ws)
  53. End If
  54. Next
  55. wb.Save
  56. wb.Close
  57. End If
  58. Next
  59. Application.ScreenUpdating = True
  60. MsgBox ("完了")
  61. End Sub
  62. 'テーブル初期化
  63. Private Sub init_table()
  64. Dim i As Long
  65. Dim j As Long
  66. For i = 1 To 99
  67. gakunen(i) = False
  68. For j = 1 To 99
  69. kumi(i, j) = 0
  70. Next
  71. Next
  72. End Sub
  73. '学年、組の合計の位置を記憶
  74. Private Sub set_gakunen(ByVal ms As Worksheet, ByVal wcol As Long)
  75. Dim maxrow As Long
  76. Dim wrow As Long
  77. Dim gak As String
  78. Dim key As String
  79. Dim elm As Variant
  80. Dim i As Long
  81. Dim j As Long
  82. maxrow = ms.Cells(Rows.Count, wcol).End(xlUp).Row 'sheetの最大行取得
  83. For wrow = 2 To maxrow
  84. gak = ms.Cells(wrow, wcol).Value
  85. If gak <> "" Then
  86. key = ms.Cells(wrow, wcol + 1).Value
  87. elm = Split(key, "普")
  88. If UBound(elm) <> 1 Then
  89. Call err_msg(ms, wrow, wcol + 1, "集計シート:クラス不正(不正フォーマット)")
  90. End If
  91. If elm(0) <> gak Then
  92. Call err_msg(ms, wrow, wcol + 1, "集計シート:クラス不正(学年不一致)")
  93. End If
  94. If IsNumeric(elm(0)) = False Or IsNumeric(elm(1)) = False Then
  95. Call err_msg(ms, wrow, wcol + 1, "集計シート:クラス不正(学年又は組が数字以外)")
  96. End If
  97. i = CLng(elm(0))
  98. j = CLng(elm(1))
  99. If i < 1 Or i > 99 Or j < 1 Or j > 99 Then
  100. Call err_msg(ms, wrow, wcol + 1, "集計シート:クラス不正(学年又は組が範囲外)")
  101. End If
  102. If kumi(i, j) <> 0 Then
  103. Call err_msg(ms, wrow, wcol + 1, "集計シート:クラス重複")
  104. End If
  105. '合計セルの行番号、列番号を記憶(xxxyyy:xxx=行番号、yyy=列番号)
  106. kumi(i, j) = wrow * 1000 + wcol + 2
  107. gakunen(i) = True
  108. End If
  109. Next
  110. End Sub
  111. 'シート名チェック
  112. Private Function check_sheet_name(ByRef wb As Workbook, ByVal sheet_name As String) As Boolean
  113. Dim i As Long
  114. check_sheet_name = True
  115. For i = 1 To wb.Worksheets.Count
  116. If wb.Worksheets(i).Name = sheet_name Then Exit Function
  117. Next
  118. check_sheet_name = False
  119. End Function
  120.  
  121.  
  122. 'エラー表示及び停止
  123. Private Sub err_msg(ByVal ws As Worksheet, ByVal erow As Long, ByVal ecol As Long, ByVal msg As String)
  124. ws.Activate
  125. ws.Cells(erow, ecol).Select
  126. MsgBox (msg)
  127. End
  128. End Sub
  129.  
  130. 'データ設定(合計、人数、平均)
  131. Private Sub set_data(ByRef ms As Worksheet, ByVal test_no As Long, ByVal row_col As Long, ByRef ws As Worksheet)
  132. Dim srow As Long
  133. Dim scol As Long
  134. Dim wrow As Long
  135. Dim wcol As Long
  136. srow = row_col \ 1000
  137. scol = row_col Mod 1000
  138. wcol = 3 + test_no
  139. For wrow = 45 To 47
  140. ws.Cells(wrow, wcol).Value = ms.Cells(srow, scol).Value
  141. scol = scol + 1
  142. Next
  143. End Sub
  144.  
  145.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty