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 関係で当サイト内に掲載しているサンプルの紹介


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

   上記の実行結果は下図のようになります。
  msflexgrid3_01.gif


  '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 でのカラー設定色々
設定色がどこの色のことか分かり難いので実行図を掲載しておきます。設定コード自体は、難しいものではありませんが、実際に試して見ないと分からない部分が結構でてきます。
設定色が有効にならない場合は、ヘルプの解説の下部の方に条件等が書かれておりますので、最後まで読んで確認して下さい。

       下記コード内の番号と下図の番号は、連動しております。
      msflexgrid3_02.png

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 = 同一内容のセルはグループ化しません。この値が既定値になります。
 msflexgrid03_03_01.gif

  1 = 自由にグループ化します。同一内容のセルは常にマージされます。
 msflexgrid03_03_02.gif

  2 = 行が制限されます。行内で左側に隣接する同一内容のセルだけがマージされます。
 msflexgrid03_03_03.gif

  3 = 列が制限されます。列内で上方に隣接する同一内容のセルだけがマージされます。
 msflexgrid03_03_04.gif

  4 = 行と列が制限されます。行内で左側に隣接する同一内容のセル、または
    列内で上方に隣接する同一内容のセルだけがマージされます。

 msflexgrid03_03_05.gif

 1 か 3 の設定のようにマージされたらいいのだが、下記のようにセルの値が同じになると
 マージしてほしくないセルまでマージされてしまう。
 msflexgrid03_03_06.gif

 msflexgrid03_03_07.gif

 上記のような条件の場合は、希望のようにマージされないか? マージしてほしくないセルまでマージされてしまいます。
これを回避するには、ピクチャーボックスでも上に表示するくらいしか対策はありませんが、結構面倒くさい処理になります。
(列幅を変更された場合の対応やソート時のクリックイベントの対応等)

尚、国語、算数、社会、体育と列を並べてマージしてから列を移動すれば、いいのではと思って試して見たが移動すればマージが解除されてしまいました。

このページのトップへ移動します。 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

  上記実行結果
 msflexgrid03_04_01.gif

掲示板の質問に答えて作ったものです。過去のログに埋もれていたのをここに紹介しておきます。
表示する数だけ PictureBox がいるのかな思ったのですが1個で出来るようなので結構使えるかも知れません。
但し、その部分は強調表示されなかったり、セルのサイズ変更があれば再度塗りつぶし処理が必要になったりと欠点もありますが、下記のようにして編集中は解除するようにして、セルのサイズが変更されたら、再表示する等にすれば有る程度解決できるかと思います。
その他十分なテストやエラーチェックが出来ていませんので他に問題が発生するかも知れませんが一度試して見て下さい。


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


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


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



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



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


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


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


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


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
フレキシブルグリッド (MSFlexGrid) コントロールワンポイントテクニック集 サンプル集
階層フレキシブルグリッド (MSHFlexGrid) コントロール 


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