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 データを表示した状態 項目別集計結果 |
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万行の集計結果) SQL での集計結果に比べると処理速度は格段に劣るが、8.3 秒が遅いと思うかその位なら許容範囲ととるかによっても違いますが自分の思い通りの集計ができるし結構使い道はあるように思いますが...。 又、列の挿入や削除・入れ替え等のサンプルと併用すればより思い通りの集計がやり易くなるかと。 |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
MSFlexGrid で項目別集計をする MSHFlexGrid で項目別集計をする 科目別集計 売上集計 MSFlexGrid で支店別部署別集計をする MSHFlexGrid で支店別部署別集計をする 部門別集計 フレキシブルグリッド (MSFlexGrid) コントロール 階層フレキシブルグリッド (MSHFlexGrid) コントロール |