VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 グリッド(MSFlexGrid)関係のメニュー
1.MSFlexGrid の主要プロパティ・メソッド一覧表
2.MSFlexGrid ワンポイントテクニック集(その1)
3.MSFlexGrid ワンポイントテクニック集(その2)
4.MSFlexGrid で Excel のようにセルに直接データを入力する
5.MSFlexGrid/MSHFlexGridへのデータ表示設定色々
6.MSFlexGrid/MSHFlexGrid の表示データをファイルに保存方法色々
7.MSFlexGrid/MSHFlexGrid で項目(科目)別集計をする
8.MSFlexGrid/MSHFlexGrid でコピー・アンド・ペースト色々
9.MSFlexGrid/MSHFlexGrid で列幅設定/行の高さ設定色々
10.MSFlexGrid/MSHFlexGrid にチェックボックスを表示する及び操作色々
11.MSFlexGrid/MSHFlexGrid に表示中のデータを罫線付きで印刷する
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、MSFlexGrid 関係で当サイト内に掲載しているサンプルの紹介


7.MSFlexGrid/MSHFlexGrid で項目(科目)別集計をする
1.MSFlexGrid/MSHFlexGrid で項目別集計をする(ゆう(U)さん投稿分)
2.MSFlexGrid/MSHFlexGrid で支店別部署別集計をする
3.上記実行結果の図
4. 
5. 
6. 

テストに使用しているデータはこちらをお使い下さい。このサイトでのMSHFlexGrid のサンプルで共通で使用しますので解凍してこのプログラムと同じフォルダーに全てのファイルを入れておいて下さい。(このデータを1万件コピーしてテスト計測しております。)
 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:
使用 API:
その他 :プロジェクト→コンポーネント→コントロールで Microsoft FlexGrid Control 6.0(SP6) 又は、
    :Microsoft Hierarchical FlexGridにチェックを入れ、表示されたコントロールをフォームに貼り付けて下さい。
    :尚、当サイトで掲載している MSFlexGrid / MSFlexGrid 関係のサンプルは、上記と同様とし、今後は省略します。
このページのトップへ移動します。 1.MSFlexGrid/MSHFlexGrid で項目別集計をする(ゆう(U)さん投稿分)
掲示板の質問に答えてゆう(U)さんが回答された分で、サンプル投稿用掲示板にも投稿しております。

Option Explicit

Private Sub Form_Load()
  With MSFlexGrid1
    .Redraw = False
    .Rows = 10
    .Cols = 4
    .FixedRows = 1
    .FixedCols = 0
    .Row = 0
    .Col = 0
    .RowSel = .Rows - 1
    .ColSel = .Cols - 1
    .Clip = "日付" & vbTab & "品名" & vbTab & "メーカー" & vbTab & "購入個数" & vbCr _
        & "6月23日" & vbTab & "ノート" & vbTab & "じゃ○にか" & vbTab & "10" & vbCr _
        & "6月23日" & vbTab & "ノート" & vbTab & "○印良品" & vbTab & "20" & vbCr _
        & "6月23日" & vbTab & "鉛筆" & vbTab & "じゃ○にか" & vbTab & "30" & vbCr _
        & "6月23日" & vbTab & "消しゴム" & vbTab & "じゃ○にか" & vbTab & "40" & vbCr _
        & "6月23日" & vbTab & "消しゴム" & vbTab & "○印良品" & vbTab & "50" & vbCr _
        & "6月24日" & vbTab & "ノート" & vbTab & "じゃ○にか" & vbTab & "60" & vbCr _
        & "6月24日" & vbTab & "ノート" & vbTab & "○印良品" & vbTab & "70" & vbCr _
        & "6月24日" & vbTab & "鉛筆" & vbTab & "じゃ○にか" & vbTab & "80" & vbCr _
        & "6月24日" & vbTab & "消しゴム" & vbTab & "○印良品" & vbTab & "90"
    .Row = .FixedRows
    .Col = .FixedCols
    .Redraw = True
  End With
End Sub

Private Sub Command1_Click()
  Dim strHinmei As String
  Dim strMaker As String
  Dim lngKosuu As Long
  Dim i     As Long

  With MSFlexGrid1
    .Redraw = False
    .RowSel = .Row
    .Col = 1
    .ColSel = 2
    .Sort = flexSortStringAscending
    For i = .Rows - 1 To .FixedRows Step -1
      .TextMatrix(i, 0) = ""
      If strHinmei = .TextMatrix(i, 1) Then
        If strMaker = .TextMatrix(i, 2) Then
          lngKosuu = lngKosuu + CLng(.TextMatrix(i, 3))
          .TextMatrix(i, 3) = CStr(lngKosuu)
          .RemoveItem i + 1
        Else
          strMaker = .TextMatrix(i, 2)
          lngKosuu = CLng(.TextMatrix(i, 3))
        End If
      Else
        strHinmei = .TextMatrix(i, 1)
        strMaker = .TextMatrix(i, 2)
        lngKosuu = CLng(.TextMatrix(i, 3))
      End If
    Next
    .Row = .FixedRows
    .Col = .FixedCols
    .Redraw = True
  End With
End Sub

   データを表示した状態           項目別集計結果
  msflexgrid07_03.gif   msflexgrid07_03.gif

このページのトップへ移動します。 2.MSFlexGrid/MSHFlexGrid で支店別部署別集計をする
テストに使用しているデータはこちらをお使い下さい。このサイトでのMSHFlexGrid のサンプルで共通で使用しますので解凍してこのプログラムと同じフォルダーに全てのファイルを入れておいて下さい。(このデータを1万件コピーしてテスト計測しております。)

Private Sub Command13_Click()
  Dim i    As Long
  Dim siten As String     '支店名
  Dim busyo As String     '部署名
  Dim SitenMokuhyo As Long  '支店の目標の小計
  Dim SitenJisseki As Long  '支店の実績の小計
  Dim BusyoMokuhyo As Long  '部署の目標の小計
  Dim BusyoJisseki As Long  '部署の実績の小計
  Dim SumMokuhyo  As Long  '総合計の目標の合計
  Dim SumJisseki  As Long  '総合計の実績の合計
  Dim RowPos    As Long  '集計結果の書き込み行の位置
  With MSHFlexGrid1
    .Redraw = False
    .col = 2    'ソートキー1
    .ColSel = 3   'ソートキー2
    '支店別の部署別で並べ替え
    .Sort = flexSortStringAscending
    '一番最初の支店名と部署名を取得
    siten = .TextMatrix(.FixedRows, 2)
    busyo = .TextMatrix(.FixedRows, 3)
    '行の先頭に行数を前もって増やしておく
    '1個だけの集計が多いと書き込み行が足りなくなるから
    For i = .FixedRows To .Rows
      .AddItem "", .FixedRows
    Next i
    RowPos = .FixedRows - 1   '書き込み行の位置
    For i = .FixedRows To .Rows - 1
      If Len(Trim$(.TextMatrix(i, 1))) Then
      '支店名が同じの場合
      If siten = .TextMatrix(i, 2) Then
        '支店計を集計
        SitenMokuhyo = SitenMokuhyo + CLng(.TextMatrix(i, 5))
        SitenJisseki = SitenJisseki + CLng(.TextMatrix(i, 6))
        '部署名が同じの場合
        If busyo = .TextMatrix(i, 3) Then
          '部署計の集計
          BusyoMokuhyo = BusyoMokuhyo + CLng(.TextMatrix(i, 5))
          BusyoJisseki = BusyoJisseki + CLng(.TextMatrix(i, 6))
        Else
          RowPos = RowPos + 1
          '同じ支店内の部署計を表示
          Call sSetText(RowPos, "" & vbTab & "" & vbTab & siten & vbTab & busyo _
                       & "計" & vbTab & "" & vbTab & BusyoMokuhyo & vbTab & BusyoJisseki)
          '同じ支店内の次の部署計を集計開始
          BusyoMokuhyo = CLng(.TextMatrix(i, 5))
          BusyoJisseki = CLng(.TextMatrix(i, 6))
          busyo = .TextMatrix(i, 3)
        End If
      Else
        '部署計の表示
        RowPos = RowPos + 1
        Call sSetText(RowPos, "" & vbTab & "" & vbTab & siten & vbTab & busyo _
                     & "計" & vbTab & "" & vbTab & BusyoMokuhyo & vbTab & BusyoJisseki)
        '次の部署計の集計を開始
        BusyoMokuhyo = CLng(.TextMatrix(i, 5))
        BusyoJisseki = CLng(.TextMatrix(i, 6))
        busyo = .TextMatrix(i, 3)
        '支店計の表示
        RowPos = RowPos + 1
        Call sSetText(RowPos, "" & vbTab & "" & vbTab & siten & "小計" & vbTab _
                     & "" & vbTab & "" & vbTab & SitenMokuhyo & vbTab & SitenJisseki)
        '総合計の集計
        SumMokuhyo = SumMokuhyo + SitenMokuhyo
        SumJisseki = SumJisseki + SitenJisseki
        '次の支店計の集計を開始
        SitenMokuhyo = CLng(.TextMatrix(i, 5))
        SitenJisseki = CLng(.TextMatrix(i, 6))
        siten = .TextMatrix(i, 2)
      End If
      End If
    Next i
    '最後の部署計を表示
    RowPos = RowPos + 1
    Call sSetText(RowPos, "" & vbTab & "" & vbTab & siten & vbTab & busyo & "計" _
                 & vbTab & "" & vbTab & BusyoMokuhyo & vbTab & BusyoJisseki)
    '最後の小計の表示
    RowPos = RowPos + 1
    Call sSetText(RowPos, "" & vbTab & "" & vbTab & siten & "小計" & vbTab & "" & vbTab _
                 & "" & vbTab & SitenMokuhyo & vbTab & SitenJisseki)
    '総合計の集計
    SumMokuhyo = SumMokuhyo + SitenMokuhyo
    SumJisseki = SumJisseki + SitenJisseki
    '総合計の表示
    RowPos = RowPos + 1
    Call sSetText(RowPos, "" & vbTab & "" & vbTab & " 合 計 " & vbTab & "" & vbTab _
                 & "" & vbTab & SumMokuhyo & vbTab & SumJisseki)

    .Rows = RowPos + .FixedRows   '行数を調整
    .Row = .FixedRows        'ホームポジションへ
    .col = .FixedCols
    .Redraw = True
  End With
End Sub

Private Sub sSetText(ByVal RowNo As Long, ByVal ClipData As Variant)
'各計の表示設定
  With MSHFlexGrid1
    .Row = RowNo
    .col = 0
    .ColSel = .Cols - 1
    .Clip = ClipData
    .TextMatrix(RowNo, 7) = .TextMatrix(RowNo, 6) / .TextMatrix(RowNo, 5)
    .TextMatrix(RowNo, 5) = Format$(.TextMatrix(RowNo, 5), "#,###")
    .TextMatrix(RowNo, 6) = Format$(.TextMatrix(RowNo, 6), "#,###")
    .TextMatrix(RowNo, 7) = Format$(.TextMatrix(RowNo, 7), "  #,###.0 %")
  End With
End Sub

このページのトップへ移動します。 3.上記実行結果の図

 上記実行結果(8.3 秒/1万行のデータでの集計結果)      参考 SQL での集計結果(0.32 秒/1万行の集計結果)
 msflexgrid07_01.gif  msflexgrid07_02.gif

SQL での集計結果に比べると処理速度は格段に劣るが、8.3 秒が遅いと思うかその位なら許容範囲ととるかによっても違いますが自分の思い通りの集計ができるし結構使い道はあるように思いますが...。
又、列の挿入や削除・入れ替え等のサンプルと併用すればより思い通りの集計がやり易くなるかと。

このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
MSFlexGrid で項目別集計をする MSHFlexGrid で項目別集計をする 科目別集計 売上集計
MSFlexGrid で支店別部署別集計をする MSHFlexGrid で支店別部署別集計をする 部門別集計
フレキシブルグリッド (MSFlexGrid) コントロール 階層フレキシブルグリッド (MSHFlexGrid) コントロール 

このページのトップへ移動します。