fork download
  1. Option Explicit
  2. Dim row3 As Long '転記先行番号
  3. Dim ws1 As Worksheet '在庫一覧シート
  4. Dim ws2 As Worksheet 'まとめシート
  5. Dim ws3 As Worksheet '転記先シート
  6. Dim dicST As Object '連想配列 キー:車種 値:最初に出現する行番号(在庫一覧)
  7. Dim dicEN As Object '連想配列 キー:車種 値:最後に出現する行番号(在庫一覧)
  8. Public Sub 転記2()
  9. Dim maxrow1 As Long '最大行数 在庫一覧
  10. Dim maxrow2 As Long '最大行数 まとめ
  11. Dim row1 As Long '行番号 在庫一覧
  12. Dim row2 As Long '行番号 在庫一覧
  13. Dim key As String '車種
  14. Set ws1 = Sheets("在庫一覧")
  15. Set ws2 = Sheets("まとめ")
  16. Set ws3 = Sheets("転記先")
  17. Set dicST = CreateObject("Scripting.Dictionary") ' 連想配列の定義
  18. Set dicEN = CreateObject("Scripting.Dictionary") ' 連想配列の定義
  19. maxrow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'A列の最大行取得
  20. maxrow2 = ws2.Cells(Rows.Count, 2).End(xlUp).Row 'B列の最大行取得
  21. '最大行数が要件を満たしてないなら処理しない
  22. If maxrow1 < 5 Then Exit Sub
  23. If maxrow2 < 6 Then Exit Sub
  24. '転記先 6行以降をクリア
  25. ws3.Rows("6:" & Rows.Count).ClearContents
  26. row3 = 6
  27. '車種を取り込む
  28. For row1 = 5 To maxrow1
  29. key = ws1.Cells(row1, "A").Value
  30. If dicST.exists(key) = False Then
  31. dicST(key) = row1
  32. dicEN(key) = row1
  33. Else
  34. If dicEN(key) + 1 <> row1 Then
  35. ws1.Activate
  36. ws1.Cells(row1, "A").Select
  37. MsgBox ("車種が連続していません")
  38. Exit Sub
  39. End If
  40. dicEN(key) = row1
  41. End If
  42. Next
  43. 'まとめシートを1行毎に処理する
  44. For row2 = 6 To maxrow2
  45. key = ws2.Cells(row2, "B").Value
  46. If dicST.exists(key) = False Then
  47. ws2.Activate
  48. ws2.Cells(row2, "B").Select
  49. MsgBox ("車種が在庫一覧にありません")
  50. Exit Sub
  51. End If
  52. '転記処理(車種、まとめの行番号)
  53. Call tenki(key, row2)
  54. '該当車種の連想配列を削除
  55. dicST.Remove key
  56. dicEN.Remove key
  57. Next
  58. 'ソート用キーをクリア
  59. ws3.Range("K6:L" & Rows.Count).ClearContents
  60. MsgBox ("完了")
  61. End Sub
  62.  
  63. '転記処理 key:車種 row2:まとめの行番号
  64. Private Sub tenki(ByVal key As String, ByVal row2 As Long)
  65. Dim rcnt As Long '該当者車種の行数(在庫一覧)
  66. Dim srow1 As Long '該当車種の開始行(在庫一覧)
  67. Dim i As Long
  68. Dim ratio As Double '比率
  69. Dim m_weight As Variant '必要重量
  70. Dim p_weight As Variant '部品重量
  71. rcnt = dicEN(key) - dicST(key) + 1
  72. srow1 = dicST(key)
  73. '在庫一覧及びまとめから転記先へ転送(行数分繰り返す)
  74. For i = 0 To rcnt - 1
  75. '車種、型式、必要重量
  76. ws3.Cells(row3 + i, "B").Resize(1, 3).Value = ws2.Cells(row2, "B").Resize(1, 3).Value
  77. '製造No、部品重量
  78. ws3.Cells(row3 + i, "E").Resize(1, 2).Value = ws1.Cells(srow1 + i, "C").Resize(1, 2).Value
  79. '部品単量
  80. ws3.Cells(row3 + i, "G").Value = ws2.Cells(row2, "G").Value
  81. '不良品
  82. ws3.Cells(row3 + i, "H").Value = ws1.Cells(srow1 + i, "F").Value
  83. Next
  84. '判定処理(行数分繰り返す)
  85. For i = 0 To rcnt - 1
  86. If ws3.Cells(row3 + i, "H").Value = "不良" Then
  87. ws3.Cells(row3 + i, "A").Value = "他"
  88. ws3.Cells(row3 + i, "i").Value = "なし" '結果
  89. ws3.Cells(row3 + i, "K").Value = 9 'ソート用第1キー
  90. ws3.Cells(row3 + i, "L").Value = 0 'ソート用第2キー
  91. Else
  92. m_weight = ws3.Cells(row3 + i, "D").Value
  93. p_weight = ws3.Cells(row3 + i, "F").Value
  94. If IsNumeric(m_weight) = False Then
  95. ws3.Activate
  96. ws3.Cells(row3 + i, "D").Select
  97. MsgBox ("必要重量が不正です")
  98. End
  99. End If
  100. If m_weight = 0 Then
  101. ws3.Activate
  102. ws3.Cells(row3 + i, "D").Select
  103. MsgBox ("必要重量が0です")
  104. End
  105. End If
  106. If IsNumeric(p_weight) = False Then
  107. ws3.Activate
  108. ws3.Cells(row3 + i, "F").Select
  109. MsgBox ("部品重量が不正です")
  110. End
  111. End If
  112. ratio = (p_weight - m_weight) / m_weight
  113. If Abs(ratio) <= 0.1 Then
  114. ws3.Cells(row3 + i, "A").Value = "○" '状態
  115. ws3.Cells(row3 + i, "K").Value = 1 'ソート用第1キー
  116. Else
  117. ws3.Cells(row3 + i, "A").Value = "他" '状態
  118. ws3.Cells(row3 + i, "i").Value = "なし" '結果
  119. ws3.Cells(row3 + i, "K").Value = 2 'ソート用第1キー
  120. End If
  121. ws3.Cells(row3 + i, "L").Value = Abs(ratio) 'ソート用第2キー
  122. End If
  123. Next
  124. 'ソート
  125. ws3.Range("A" & row3 & ":L" & row3 + rcnt - 1).Sort key1:=ws3.Range("K" & row3), key2:=ws3.Range("L" & row3)
  126. '車種、型式、必要重量の重複部、部品単量をクリア
  127. For i = 1 To rcnt - 1
  128. ws3.Cells(row3 + i, "B").Resize(1, 3).Value = ""
  129. ws3.Cells(row3 + i, "G").Value = ""
  130. Next
  131. row3 = row3 + rcnt + 1
  132. End Sub
  133.  
  134.  
  135.  
  136.  
  137.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty