3.MSFlexGrid ワンポイントテクニック集(その2) |
1.TextMatrix プロパティを使ってのテスト環境の作成及びフォーマット処理及び前方一致検索例 2.MSFlexGrid / MSHFlexGrid でのカラー設定色々 3.MSFlexGrid / MSHFlexGrid でこのようなセルのマージはできません 4.MSFlexGrid / MSHFlexGrid のセルを塗りつぶしのパターンを使って指定範囲を塗りつぶす 5. 6. 7. 8. 9. 10. 11. 12. フレキシブルグリッド (MSFlexGrid) コントロールについて書いているところは、階層フレキシブルグリッド (MSHFlexGrid) コントロールに置き換えてご覧ください。又、VB6.0 をご使用の場合は、MSHFlexGrid の方をご使用下さい。(扱えるデータ件数に制限がなく処理速度が格段に早い) テストに使用しているデータはこちらをお使い下さい。このサイトでの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.TextMatrix プロパティを使ってのテスト環境の作成及びフォーマット処理及び前方一致検索例 |
ヘルプには、下記のように書かれていて使用例も掲載されているのですが、パッと見ただけではよく分かりません。 TextArray プロパティ 任意のセルのテキストを設定します。値の取得も可能です。 このプロパティを使用すると、Row プロパティと Col プロパティを変更することなくセルの内容を設定または取得できます。 実際にどのような場面で使用すると効果が発揮できるのか、TextMatrix プロパティを使った方法とどう違うのかヘルプの使用例を見ただけでは分かり難いので自分でも試して見る事にしました。 試した限りでは、処理速度的には、TextMatrix プロパティを使った場合と大差(誤差の範囲)ありません。 MSHFlexGrid を使ったプログラムを試してみたり、テストする場合、テスト環境を作るのに時間がかかりちょっと試して見るかと言った気になれないのですが、下記のようなコードを覚えておくと簡単にテスト環境が作成できます。 'TextArray プロパティを使ってのテスト環境の作成 Dim i As Long With MSHFlexGrid1 .Rows = 20 .Cols = 7 For i = 0 To .Rows * .Cols - 1 .TextArray(i) = CStr(i) Next End With 上記の実行結果は下図のようになります。 'TextArray プロパティを使ってのフォーマット処理例 Dim i As Long, n As Long With MSHFlexGrid1 For i = .Cols To .Rows * .Cols - 1 Step .Cols n = n + 1 .TextArray(i) = n '連番を入力 .TextArray(i + 1) = "****" '氏名をマスキング .TextArray(i + 4) = Format$(.TextArray(i + 4), "yyyy/mm/dd") .TextArray(i + 5) = Format$(.TextArray(i + 5), "#,###") .TextArray(i + 6) = Format$(.TextArray(i + 6), "#,###") .TextArray(i + 7) = Format$(.TextArray(i + 7), "###.0") Next i End With 上記は、5.MSHFlexGrid に表示されたでーたーを書式設定(Format)して表示するでしている事と同じです。 'TextArray プロパティを使っての前方一致検索 Private Sub Command1_Click() Dim i As Long, n As Long, Ret As Integer, Mike As Boolean With MSHFlexGrid1 For i = .Cols To .Rows * .Cols - 1 '前方一致検索の場合 If InStr(.TextArray(i), Text1.Text) Then .Col = i Mod .Cols .Row = CLng(i \ .Cols) Mike = True If .RowIsVisible(.Row) = False Or .ColIsVisible(.Col) = False Then .LeftCol = .Col .TopRow = .Row - 2 End If Ret = MsgBox(.TextArray(i) & " これですか", vbYesNo) If Ret = vbYes Then Exit Sub End If End If Next i If Mike = False Then MsgBox "見つかりませんでした。" Else MsgBox "検索を終了しました。" End If End With End Sub もっと効果が発揮できるような事例がありましたら教えて下さい。 |
2.MSFlexGrid / MSHFlexGrid でのカラー設定色々 |
設定色がどこの色のことか分かり難いので実行図を掲載しておきます。設定コード自体は、難しいものではありませんが、実際に試して見ないと分からない部分が結構でてきます。 設定色が有効にならない場合は、ヘルプの解説の下部の方に条件等が書かれておりますので、最後まで読んで確認して下さい。 下記コード内の番号と下図の番号は、連動しております。 Private Sub Command1_Click() With MSHFlexGrid1 '1.すべての非固定型のセルの色を取得・設定します。 If .BackColor = &H80000005 Then .BackColor = vbYellow Else .BackColor = &H80000005 End If '2.グリッドのバックグラウンドの背景色(セル以外の部分)を取得・設定します。 If .BackColorBkg = &H8000000F Then .BackColorBkg = QBColor(11) Else .BackColorBkg = &H8000000F End If '3.固定のセルの背景色を取得・設定します。 If .BackColorFixed = &H8000000F Then .BackColorFixed = QBColor(10) Else .BackColorFixed = &H8000000F End If '4.カレントセルの背景色を設定します。但し、FocusRect =flexFocusNoneの時に有効 If .BackColorSel = &H8000000D Then .BackColorSel = QBColor(13) Else .BackColorSel = &H8000000D End If '5.個々のセルまたは特定範囲のセルの背景色を設定・取得します .Col = 3 .Row = 2 .ColSel = 6 .RowSel = 5 .FillStyle = flexFillRepeat If .CellBackColor = vbYellow Or .CellBackColor = &H80000005 Then .CellBackColor = QBColor(0) Else .CellBackColor = &H80000005 End If '6.個々のセルまたは特定範囲のセルの前景色を設定・取得します If .CellForeColor = &H80000008 Then .CellForeColor = QBColor(15) Else .CellForeColor = &H80000008 End If '7.すべての非固定型のセルのテキストの色を取得・設定します。 If .ForeColor = &H80000008 Then .ForeColor = QBColor(2) Else .ForeColor = &H80000008 End If '8.すべての固定型のセルのテキストの色を取得・設定します。 If .ForeColorFixed = &H80000012 Then .ForeColorFixed = QBColor(9) Else .ForeColorFixed = &H80000012 End If Debug.Print .GridColor '9.コントロールの選択されている部分の文字色を設定・取得します。 If .ForeColorSel = &H8000000E Then .ForeColorSel = QBColor(9) Else .ForeColorSel = &H8000000E End If '10.コントロールの非固定セルのグリッド線の色を設定・取得します。 'GridColor プロパティは、GridLines プロパティが 1 (通常の線) に設定されているときに限り使用できます。 If .GridColor = QBColor(12) Then .GridLines = 1 .GridColor = QBColor(0) Else .GridLines = 1 .GridLineWidth = 3 '非固定セルのグリッド線の幅を設定、固定セルにも影響を与えます。 .GridColor = QBColor(12) End If '11.コントロールの固定セルのグリッド線(右と下側の外枠)の色を設定・取得します。 'GridColorFixed プロパティは、GridLinesFixed プロパティが 1 (通常の線)に設定されている時に限り使用できます。 If .GridColorFixed = 12632256 Then .GridLinesFixed = 1 .GridLineWidthFixed = 3 '固定セルのグリッド線の幅を設定、非固定セルには影響を与えません。 .GridColorFixed = QBColor(9) Else .GridLinesFixed = 2 .GridColorFixed = 12632256 End If End With End Sub |
3.MSFlexGrid / MSHFlexGrid でこのようなセルのマージはできません |
セルのマージ方法やサンプル例は、ヘルプにも記載されているのですが、このような場合はマージできないと言った事が明記されていないのでなんとかできないかと言った質問がでてくるのだと思います。 従って、マージ方法というよりこのようなマージはできませんという例を中心に掲載しました。 (これを持って、できないマージ方法は求めないで下さい。あきらめて力技か妥協をして下さい) Private Sub Command1_Click() Dim lRow As Long, lCol As Long With MSHFlexGrid1 .Rows = 20 '行の総数 .Cols = 11 '列の総数 .FixedRows = 2 '固定行の数 .FixedCols = 1 '固定列の数 .Row = 0 .ColWidth(-1) = 700 '列幅設定 .RowHeight(-1) = 285 '行高さ '固定行1行目 .TextMatrix(0, 0) = " " .TextMatrix(0, 1) = "国語" .TextMatrix(0, 2) = "算数" .TextMatrix(0, 3) = "理科" .TextMatrix(0, 4) = "理科" .TextMatrix(0, 5) = "理科" .TextMatrix(0, 6) = "社会" .TextMatrix(0, 7) = "英語" .TextMatrix(0, 8) = "英語" .TextMatrix(0, 9) = "英語" .TextMatrix(0, 10) = "体育" .Row = 0 For lCol = 0 To .Cols - 1 .Col = lCol .CellAlignment = flexAlignCenterCenter Next '固定行2行目 .TextMatrix(1, 0) = " " .TextMatrix(1, 1) = "国語" .TextMatrix(1, 2) = "算数" .TextMatrix(1, 3) = "a" .TextMatrix(1, 4) = "b" .TextMatrix(1, 5) = "c" .TextMatrix(1, 6) = "社会" .TextMatrix(1, 7) = "a" .TextMatrix(1, 8) = "b" .TextMatrix(1, 9) = "c" .TextMatrix(1, 10) = "体育" .Row = 1 For lCol = 0 To .Cols - 1 .Col = lCol .CellAlignment = flexAlignCenterCenter Next ' True の場合 隣接するセルが同一内容を表示する場合、 ' 行が左方向にマージされるか、列が上方向にマージされます。 .MergeRow(0) = True .MergeCol(0) = True .MergeCol(1) = True '国語 .MergeCol(2) = True '数学 .MergeCol(6) = True '社会 .MergeCol(10) = True '体育 ' 0 = 同一内容のセルはグループ化しません。この値が既定値になります。 ' 1 = 自由にグループ化します。同一内容のセルは常にマージされます。 ' 2 = 行が制限されます。行内で左側に隣接する同一内容のセルだけがマージされます。 ' 3 = 列が制限されます。列内で上方に隣接する同一内容のセルだけがマージされます。 ' 4 = 行と列が制限されます。行内で左側に隣接する同一内容のセル、 ' または列内で上方に隣接する同一内容のセルだけがマージされます。 .MergeCells = 1 'マージの指定 'データ(マージされない事を確認用) For lRow = .FixedRows To .Rows - 1 For lCol = .FixedCols To .Cols - 1 .TextMatrix(lRow, lCol) = "ZZZ" Next Next .Refresh End With End Sub 0 = 同一内容のセルはグループ化しません。この値が既定値になります。 1 = 自由にグループ化します。同一内容のセルは常にマージされます。 2 = 行が制限されます。行内で左側に隣接する同一内容のセルだけがマージされます。 3 = 列が制限されます。列内で上方に隣接する同一内容のセルだけがマージされます。 4 = 行と列が制限されます。行内で左側に隣接する同一内容のセル、または 列内で上方に隣接する同一内容のセルだけがマージされます。 1 か 3 の設定のようにマージされたらいいのだが、下記のようにセルの値が同じになると マージしてほしくないセルまでマージされてしまう。 上記のような条件の場合は、希望のようにマージされないか? マージしてほしくないセルまでマージされてしまいます。 これを回避するには、ピクチャーボックスでも上に表示するくらいしか対策はありませんが、結構面倒くさい処理になります。 (列幅を変更された場合の対応やソート時のクリックイベントの対応等) 尚、国語、算数、社会、体育と列を並べてマージしてから列を移動すれば、いいのではと思って試して見たが移動すればマージが解除されてしまいました。 |
4.MSFlexGrid / MSHFlexGrid のセルを塗りつぶしのパターンを使って指定範囲を塗りつぶす |
Option Explicit Private Sub Command1_Click() 'パターンによる塗りつぶしのテスト Dim i As Long, Pt As Long With MSHFlexGrid1 For i = .FixedCols To .Cols - 1 '1行すべて表示 Call SetPattern(5, 2, i) If Pt < 8 Then '全パターン表示 Call SetPattern(Pt, 3, i) End If Pt = Pt + 1 Next i '表示してからセルにデータを表示した場合のテスト .TextMatrix(2, 4) = "後で記入" End With 'Row=4 Col=3 に VbCross 6 クロス で表示 Call SetPattern(6, 4, 3) End Sub Private Sub Command2_Click() 'パターンを解除 Dim i As Long, Pt As Long With MSHFlexGrid1 For i = .FixedCols To .Cols - 1 Call SetPattern(8, 2, i) If Pt < 8 Then Call SetPattern(8, 3, i) End If Pt = Pt + 1 Next i End With Call SetPattern(8, 4, 3) End Sub Private Sub SetPattern(ByVal FiSty As Integer, ByVal Ro As Long, ByVal Co As Long) 'パターンの作成と塗りつぶし処理 With MSHFlexGrid1 .Row = Ro .Col = Co Picture1.Cls 'ピクチャーのサイズをセルと同一に Picture1.Height = .CellHeight Picture1.Width = .CellWidth If FiSty >= 8 Or FiSty < 0 Then 'パターンの解除(Picture をクリア) Set .CellPicture = LoadPicture() Exit Sub End If 'パターンの設定 Picture1.FillStyle = FiSty '枠の罫線が見えないように Picture1.Line (-10, -10)-(.CellWidth, .CellHeight), QBColor(0), B 'セルにピクチャーを表示 Set .CellPicture = Picture1.Image End With End Sub Private Sub Form_Load() 'MSHFlexGridの初期設定 With MSHFlexGrid1 .Cols = 10 .Rows = 6 .ColWidth(-1) = 900 .ColWidth(5) = 1400 .RowHeight(-1) = 350 .Font.Bold = True .TextMatrix(2, 2) = "先に記入" End With With Picture1 '別途プロパティで設定して下さい .AutoRedraw = True .Appearance = 0 .BorderStyle = vbBSNone .Visible = False End With End Sub 上記実行結果 掲示板の質問に答えて作ったものです。過去のログに埋もれていたのをここに紹介しておきます。 表示する数だけ PictureBox がいるのかな思ったのですが1個で出来るようなので結構使えるかも知れません。 但し、その部分は強調表示されなかったり、セルのサイズ変更があれば再度塗りつぶし処理が必要になったりと欠点もありますが、下記のようにして編集中は解除するようにして、セルのサイズが変更されたら、再表示する等にすれば有る程度解決できるかと思います。 その他十分なテストやエラーチェックが出来ていませんので他に問題が発生するかも知れませんが一度試して見て下さい。 |
5. |
6. |
7. |
8. |
9. |
10. |
11. |
12. |
検索キーワード及びサンプルコードの別名(機能名) |
フレキシブルグリッド (MSFlexGrid) コントロールワンポイントテクニック集 サンプル集 階層フレキシブルグリッド (MSHFlexGrid) コントロール |