10.MSFlexGrid/MSHFlexGrid にチェックボックスを表示する及び操作色々 |
1.MSFlexGrid/MSHFlexGrid にチェックボックスを表示 2.MSFlexGrid/MSHFlexGrid のチェックボックスを削除 3.MSFlexGrid/MSHFlexGrid のチェックボックスのチェックを全てチェック及び全て解除する 4.MSFlexGrid/MSHFlexGrid のチェックボックスでチェックされている行のデータを取得する 5.MSFlexGrid/MSHFlexGrid のチェックボックスでチェックされている行だけにアクセスする 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 にチェックボックスを表示 |
上記テスト用データが表示されているものとします。(1万行×8列のデータでテスト) サンプル投稿用掲示板に投稿されている分では、データ件数が多いと処理速度等に問題がでてくるので作り直して見ました。 直接チェックボックスを表示するのは件数が多いと難しいのとその他処理が面倒になるので、Wingdings 2 のフォントを使用する事にしました。 MSFlexGrid なら Wingdings の Chr$(112) と Chr$(254) が使用できるのですが、MSHFlexGrid では、Wingdings の Chr$(254) が表示されません、それで、代替フォントとして、Wingdings 2 の Chr$(42) と Chr$(82) を使用しておりますが、環境やお好みに合わせて下さい。 Option Explicit Private frgCheck As Boolean 'チェックボックスの表示・非表示用 Private frgMultiSelect As Boolean '複数選択可か不可 Private CountSelect As Long '選択件数 Private Sub Command1_Click() 'チェックボックス列を新規作成 '既に表示中なので処理を抜ける If frgCheck = True Then Exit Sub With MSHFlexGrid1 '指定位置に列を挿入 .Cols = .Cols + 1 '列を1列増やす .ColPosition(.Cols - 1) = 0 '増やした列を0列目に移動 .Col = 0 .Row = 1 .ColWidth(0) = 300 .RowHeight(-1) = 280 .RowSel = .Rows - 1 .FillStyle = flexFillRepeat .CellFontName = "Wingdings 2" 'MSFlexGrid = Wingdings .CellFontSize = 15 .Text = Chr$(42) 'Wingdings = (CHR$(111) チェックなし) ( Chr$(254) チェックあり) .Row = 0 'ホームポジションへ移動 End With frgCheck = True 'チェックボックスを表示中 CountSelect = 0 'チェック済み数 frgMultiSelect = True '複数選択可 End Sub Private Sub MSHFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = vbLeftButton Then With MSHFlexGrid1 '列 = 0 で チェックボックスが表示されている場合 If .MouseCol = 0 And frgCheck Then 'チェックマークが表示されていたら If .TextMatrix(.MouseRow, .MouseCol) = Chr$(82) Then 'チェックマークを非表示 .CellFontSize = 15 .TextMatrix(.MouseRow, .MouseCol) = Chr$(42) CountSelect = CountSelect - 1 'チェックカウントを減らす ' Debug.Print CountSelect Else If frgMultiSelect = False And CountSelect > 0 Then '複数選択不可で既にチェック済みの場合 Beep Else 'チェックマークの表示 .CellFontSize = 11 .TextMatrix(.MouseRow, .MouseCol) = Chr$(82) CountSelect = CountSelect + 1 'チェックカウントを増やす ' Debug.Print CountSelect End If End If End If End With End If End Sub 上記実行結果(0.084 秒/1万行) チェックボックスコントロールを表示したのと見た目は変わらないかと思います。 |
2.MSFlexGrid/MSHFlexGrid のチェックボックスを削除 |
Private Sub Command2_Click() 'チェックボックス列を削除 '表示していないので処理を抜ける If frgCheck = False Then Exit Sub '指定列の移動及び削除 MSHFlexGrid1.ColPosition(0) = MSHFlexGrid1.Cols - 1 '0列目を最後の列に移動 MSHFlexGrid1.Cols = MSHFlexGrid1.Cols - 1 '最後の列を削除(削除しなければ移動になります) '設定値を初期値に戻す frgCheck = False 'チェックボックス未表示 CountSelect = 0 'チェック済み数 frgMultiSelect = False '複数選択可 End Sub |
3.MSFlexGrid/MSHFlexGrid のチェックボックスのチェックを全てチェック及び全て解除する |
Private Sub Command3_Click() '全てチェックマークを付ける '表示していないので処理を抜ける If frgCheck = False Then Exit Sub '全て選択 With MSHFlexGrid1 .Col = 0 .Row = .FixedRows .RowSel = .Rows - 1 .FillStyle = flexFillRepeat .CellFontName = "Wingdings 2" 'MSFlexGrid = Wingdings .CellFontSize = 11 .Text = Chr$(82) 'Wingdings = (CHR$(111) チェックなし) ( Chr$(254) チェックあり) .Row = 0 CountSelect = .Rows - 1 'チェック済み数 End With End Sub Private Sub Command4_Click() '全てのチェックを解除する '表示していないので処理を抜ける If frgCheck = False Then Exit Sub '全て選択 With MSHFlexGrid1 .Col = 0 .Row = .FixedRows .RowSel = .Rows - 1 .FillStyle = flexFillRepeat .CellFontName = "Wingdings 2" 'MSFlexGrid = Wingdings .CellFontSize = 15 .Text = Chr$(42) 'Wingdings = (CHR$(111) チェックなし) ( Chr$(254) チェックあり) .Row = 0 End With CountSelect = 0 'チェック済み数 End Sub どの操作も処理速度は、0.01 秒未満で問題になるようなレベルではないかと。 |
4.MSFlexGrid/MSHFlexGrid のチェックボックスでチェックされている行のデータを取得する |
Private Sub Command5_Click() 'チェックされているデータを取得 '表示していないので処理を抜ける If frgCheck = False Then Exit Sub '全て選択 Dim i As Long, j As Long With MSHFlexGrid1 For i = 0 To .Rows - 1 If .TextMatrix(i, 0) = Chr$(82) Then Dim ColDat As Variant ColDat = "" For j = 1 To .Cols - 1 ColDat = ColDat & vbTab & .TextMatrix(i, j) Next j Debug.Print ColDat End If Next i .Row = 0 End With End Sub |
5.MSFlexGrid/MSHFlexGrid のチェックボックスでチェックされている行だけにアクセスする |
Private Sub Command6_Click() 'チェックされている行だけにアクセスする '表示していないので処理を抜ける If frgCheck = False Then Exit Sub Dim i As Long, j As Long With MSHFlexGrid1 .Col = 0 '並べ替えの基準となる列を指定 .Sort = flexSortGenericDescending '一般的な降順ソートを実施 For i = .FixedRows To CountSelect '念の為チェック済みかを照合 If .TextMatrix(i, 0) = Chr$(82) Then Dim ColDat As Variant ColDat = "" For j = 1 To .Cols - 1 ColDat = ColDat & vbTab & .TextMatrix(i, j) Next j Debug.Print ColDat End If Next i .Row = 0 End With End Sub 上記実行結果(0.076 秒/1万行) アイデア次第では、色々な場面で使えるのではないでしょうか? テスト用コードなので、条件設定やエラー処理も不十分ですし、ボタンのクリックイベントに書いておりますので、プロシージャ内に作成するなり、関数化するなりしてお使い下さい。 |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
MSHFlexGrid にチェックボックスを表示 チェックボックスのチェックをすべてつける チェックボックスのチェックをすべて解除する チェックボックス列を削除する MSFlexGrid にチェックボックスを表示 チェックボックス列を挿入する フレキシブルグリッド (MSFlexGrid) コントロール 階層フレキシブルグリッド (MSHFlexGrid) コントロール |