|    | 
     記憶マクロではなく、マクロ記録です。 
これだって、十分使えるものになるはずですし、 
VBAの立派な教材になります。 
(下記のコードも、マクロ記録を修正したものです。) 
 
Sheet1をSheet2のような形にいったん変換して、 
Sheet2を ピボットテーブルにすれば 
Sheet3のような表が得られます。 
 
【Sheet1】 
  A  B  C  D  E    F 
1 分類 1. 2. 3. パターン 対象外 
2 A  1      あ 
3 A  1      あ 
4 A    1    い 
5 B    1  1  う 
6 B    1        S 
7 C      1 
 
【Sheet2】 
  A列   B列   C列 
1 分類  種類  パターン 
2 A    1    あ 
3 A    1    あ 
4 A    2    い 
5 B    2    う 
6 B    3    う 
7 B    2    対象外 
8 C    3    調査中 
 
【Sheet3】 
     列ラベル       
行ラベル 1   2  3 
A                
 あ   2           
 い      1      
 う              
 対象外            
 調査中            
B                
 あ              
 い              
 う      1  1 
 対象外    1      
 調査中            
C                
 あ              
 い              
 う              
 対象外            
 調査中       1 
 
(コード参考例) 
 
Option Explicit 
 
Dim ws1 As Worksheet 
Dim ws2 As Worksheet 
Dim ws3 As Worksheet 
 
Sub test() 
  Dim category As String 
  Dim goods As String 
  Dim pattern As String 
  Dim k As Long, j As Long 
  Dim p As Long 
 
  Set ws1 = Worksheets("Sheet1") 
  Set ws2 = Worksheets("Sheet2") 
  Set ws3 = Worksheets("Sheet3") 
  p = 1 
 
  '(1)Sheet2に別フォーマットで転記 
  For k = 2 To ws1.Range("A1").End(xlDown).Row 
    category = ws1.Cells(k, 1).Text 
    pattern = getPattern(k) 
    For j = 2 To 4 
      If ws1.Cells(k, j).Value = 1 Then 
        goods = getGoods(j) 
        p = p + 1 
        Call writeToSheet2(p, category, goods, pattern) 
      End If 
    Next 
  Next 
 
  '(2)それをもとにピボットテーブルをSheet3に作成 
  makePivotTable 
 
End Sub 
 
Function getPattern(k As Long) As String 
  If Len(ws1.Cells(k, 5).Value) > 0 Then 
    getPattern = ws1.Cells(k, 5).Value 
  ElseIf ws1.Cells(k, 6).Value = "S" Then 
    getPattern = "対象外" 
  Else 
    getPattern = "調査中" 
  End If 
End Function 
 
Function getGoods(j As Long) As String 
  getGoods = CStr(j - 1) 
End Function 
 
Function writeToSheet2(p As Long, category As String, goods As String, pattern As String) 
  ws2.Cells(p, 1).Value = category 
  ws2.Cells(p, 2).Value = goods 
  ws2.Cells(p, 3).Value = pattern 
End Function 
 
Sub makePivotTable() 
  Dim myRange As Range 
  Dim pvCache 
  Dim pbTable 
   
  Set myRange = ws2.Range("A1").CurrentRegion 
  Set pvCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _ 
    SourceData:=myRange.Address(external:=True), _ 
    Version:=xlPivotTableVersion14) 
  Set pbTable = pvCache.CreatePivotTable _ 
      (TableDestination:=ws3.Range("A1"), _ 
      DefaultVersion:=xlPivotTableVersion14) 
  With pbTable 
    With .PivotFields("分類") 
      .Orientation = xlRowField 
      .Position = 1 
    End With 
    With .PivotFields("パターン") 
      .Orientation = xlRowField 
      .Position = 2 
    End With 
    With .PivotFields("種類") 
      .Orientation = xlColumnField 
      .Position = 1 
    End With 
 
    .AddDataField .PivotFields("種類"), "データの個数 / 種類", xlCount 
     
    With .PivotFields("種類") 
      .Orientation = xlColumnField 
      .Position = 1 
    End With 
 
    .SortUsingCustomLists = False 
    .PivotFields("分類").AutoSort xlAscending, "分類" 
    .PivotFields("パターン").ShowAllItems = True 
     
    .ColumnGrand = False 
    .RowGrand = False 
    .PivotFields("分類").Subtotals = Array( _ 
        False, False, False, False, False, False, False, False, False, False, False, False) 
  End With 
End Sub 
 
 | 
     
    
   |