|    | 
     ▼初心者 さん: 
 
>《イメージ》 
>【Sheet1】                → パターン仕訳け 
>------------------------------------- 
>種別 1. 2. 3. パターン 対象外 
>A   1       あ         →A の「あ」の行 
>A   1       あ         →A の「あ」の行 
>A     1     い         →A の 「い」の行 
>B     1  1   う         →B の 「う」の行 
>B     1          S     →B の「対象外」の行 
>C       1             →C の「調査中」の行 
' 
 
Sub Try1() 
  Dim i As Long, n As Long, m As Long 
  Dim dic As Object '種別を調べるための箱を用意します。 
  Set dic = CreateObject("Scripting.Dictionary") 
   
  Dim r As Object 
  Dim v 
  Set r = Worksheets(1).[A1].CurrentRegion '表データを配列に入れる 
  v = Intersect(r, r.Offset(1)).Value   '入れる(一行目は除く) 
 
'(1) 種別の種類を調べる → A,B,C 
  For i = 1 To UBound(v) 
    If Not dic.Exists(v(i, 1)) Then 
      n = n + 1 
      dic(v(i, 1)) = n 
    End If 
  Next  '以上で 種別 A(1), B(2), C(3) が完成()内は行番号 
   
'(2) パターンの種類を調べる → 「あ」,「い」,「う」 
  Dim dic2 As Object 
  Set dic2 = CreateObject("Scripting.Dictionary") 
  m = 0 
  For i = 1 To UBound(v)  '5列目を調べる 
    If Not IsEmpty(v(i, 5)) Then 
      If Not dic2.Exists(v(i, 5)) Then 
        m = m + 1 
        dic2(v(i, 5)) = m 
      End If 
    End If 
  Next 
' パターンとしてはこれ以外に「対象外」「調査中」を追加。 
  Dim mout&, mcho& 
  m = m + 1 
  dic2("対象外") = m: mout = m 
  m = m + 1 
  dic2("調査中") = m: mcho = m 
   
'(3) 以上が分ったら、 
'  種別の数だけ大きい箱を用意する 
'  箱の中に パターンの数だけの小さい箱を入れる 
'  そのパターン用の小さい箱のなかは 1. | 2. | 3. の仕切りを入れる 
  ReDim Ot(1 To n, 1 To m, 1 To 3) 
'  ┌────────────────┐ 
'n=1│種別A パターン  1. 2. 3.   │ 
'  │   1 あ            │ 
'  │   2 い            │ 
'  │   3 う            │ 
'  │   4 対象外         │ 
'  │   5 調査中         │ 
'  └────────────────┘ 
   
'(4) もう一度Sheet1の表を上から順に読んでいって、データを仕分ける 
  Dim j As Long, x As Long 
  For i = 1 To UBound(v) 
    n = dic(v(i, 1)) 
    If Not IsEmpty(v(i, 5)) Then 
      m = dic2(v(i, 5)) 
    Else 
      If v(i, 6) = "S" Then 
        m = mout 
      Else 
        m = mcho 
      End If 
    End If 
    '[1.][2.][3.]列の値1を調べる(あれば配列要素位置に加算) 
    For j = 1 To 3 
      x = j + 1 
      If v(i, x) > 0 Then 
        Ot(n, m, j) = Ot(n, m, j) + v(i, x) 
      End If 
    Next 
  Next 
   
'(5) Sheet2に 種別の数だけカード型データベースを発行する 
  Sheet2.Select 
  Sheet2.UsedRange.ClearContents 
  Dim a, b, c 
  Dim y As Long 
  y = 1 
  [A1:E1].Value = Split("種別 パターン 1. 2. 3.") 
  For Each a In dic.Keys() 
    y = y + 1 
    Cells(y, 1).Value = a 
    n = dic(a) 
    For Each b In dic2.Keys() 
      y = y + 1 
      Cells(y, 2).Value = b 
      m = dic2(b) 
      For j = 1 To 3 
        If Ot(n, m, j) > 0 Then 
         Cells(y, j + 2).Value = Ot(n, m, j) 
        End If 
      Next 
    Next 
  Next 
End Sub 
 | 
     
    
   |