Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6487 / 76734 ←次へ | 前へ→

【75847】Re:パターン別に集計したいです。
回答  γ  - 14/7/13(日) 23:07 -

引用なし
パスワード
   記憶マクロではなく、マクロ記録です。
これだって、十分使えるものになるはずですし、
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
7 hits

【75838】パターン別に集計したいです。 初心者 14/7/13(日) 0:10 質問
【75839】Re:パターン別に集計したいです。 kanabun 14/7/13(日) 0:19 発言
【75840】Re:パターン別に集計したいです。 初心者 14/7/13(日) 0:33 発言
【75841】Re:パターン別に集計したいです。 kanabun 14/7/13(日) 0:48 発言
【75842】Re:パターン別に集計したいです。 kanabun 14/7/13(日) 0:54 発言
【75843】Re:パターン別に集計したいです。 kanabun 14/7/13(日) 10:49 発言
【75844】Re:パターン別に集計したいです。 kanabun 14/7/13(日) 11:56 発言
【75845】Re:パターン別に集計したいです。 初心者 14/7/13(日) 20:16 お礼
【75846】Re:パターン別に集計したいです。 γ 14/7/13(日) 20:31 発言
【75849】Re:パターン別に集計したいです。 14/7/14(月) 7:26 発言
【75847】Re:パターン別に集計したいです。 γ 14/7/13(日) 23:07 回答
【75848】Re:パターン別に集計したいです。 γ 14/7/13(日) 23:25 発言

6487 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free