fork download
  1. Option Explicit
  2.  
  3. Public Sub シート振り分け()
  4. Dim ms As Worksheet 'マスターシート
  5. Dim ws As Worksheet '名前シート
  6. Dim dicT As Object '名前のdictionary キー:名前 値:行番号(|で区切る)
  7. Dim row_m As Long '行番号(マスター)
  8. Dim maxrow As Long '最大行番号(マスター)
  9. Dim key As Variant 'キー(名前)
  10. Dim rows As Variant '行番号の配列
  11. Dim col_arr As Variant '転記列定義(配列)
  12. Dim cole As Variant '1転記定義
  13. Dim elms As Variant '1転記定義を3つに分割した配列(0:転記元列、1:転記先列、2:行の補正値)
  14. Dim col0 As String '転記元列
  15. Dim col1 As String '転記先列
  16. Dim bias As Long '行の補正値
  17. Dim row_w As Long '転記先行番号
  18. Dim i As Long
  19. col_arr = Array("B|A|0", "C|F|0", "D|G|1", "E|H|0")
  20. Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
  21. Set ms = Worksheets("貼り付けシート")
  22. maxrow = ms.Cells(ms.rows.Count, "A").End(xlUp).Row
  23. '名前と行番号を記憶する
  24. For row_m = 2 To maxrow
  25. key = ms.Cells(row_m, "A").Value
  26. If dicT.exists(key) = False Then
  27. dicT(key) = CStr(row_m)
  28. Else
  29. dicT(key) = dicT(key) & "|" & CStr(row_m)
  30. End If
  31. Next
  32. '名前毎に処理を繰り返す
  33. For Each key In dicT.keys
  34. '名前のシートを検索し、wsオブジェクトを設定する
  35. Call find_sheet(key, ws)
  36. 'ワークシート事前設定処理
  37. Call set_ws_before(ws)
  38. '転記列分の繰り返し
  39. For Each cole In col_arr
  40. elms = Split(cole, "|")
  41. col0 = elms(0) '転記元
  42. col1 = elms(1) '転記先
  43. bias = CLng(elms(2)) '補正値
  44. '転記行分の繰り返し
  45. rows = Split(dicT(key), "|")
  46. For i = 0 To UBound(rows)
  47. row_m = CLng(rows(i)) '文字を数値に変換
  48. row_w = i * 3 + 3 + bias '転記先の行を算出
  49. ws.Cells(row_w, col1).Value = ms.Cells(row_m, col0).Value 'データ転記
  50. Next
  51. Next
  52. 'ワークシート事後設定処理
  53. Call set_ws_after(ws)
  54. Next
  55. MsgBox ("完了")
  56. End Sub
  57. 'シート検索&オブジェクト設定
  58. Private Sub find_sheet(ByVal sheet_name As String, ws As Worksheet)
  59. Dim i As Long
  60. '指定されたシート名が存在するかチェックする
  61. For i = 1 To Worksheets.Count
  62. If LCase(Worksheets(i).name) = LCase(sheet_name) Then
  63. '存在した場合、wsオブジェクトを設定する
  64. Set ws = Worksheets(i)
  65. Exit Sub
  66. End If
  67. Next
  68. '存在しない場合、最後に追加する
  69. Set ws = Worksheets.Add(, Worksheets(Worksheets.Count))
  70. ws.name = sheet_name
  71. End Sub
  72. '事前設定処理
  73. Private Sub set_ws_before(ws As Worksheet)
  74. 'ワークシートクリア
  75. ws.Cells.ClearContents
  76. 'これはサンプルです。必要であれば修正してください
  77. ' ws.Range("A1:J2").Merge
  78. ' ws.Range("A1").Value = "食べ物依頼"
  79. ' ws.Cells.Font.name = "Meiryo UI"
  80. ' ws.Range("A1").Font.Size = 20
  81. ' ws.Range("A1").Font.Bold = True
  82. ' ws.Range("A1").Cells.HorizontalAlignment = xlCenter
  83. End Sub
  84. '事後前設定処理
  85. Private Sub set_ws_after(ws As Worksheet)
  86. '必要であれば、ここに処理を記入
  87. End Sub
  88.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty