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


2.MSFlexGrid ワンポイントテクニック集(その1)
1.MSFlexGrid / MSHFlexGrid における基本的な動作確認用コード
2.上記実行図及び使用上の留意事項
3.MSFlexGrid で行/列/範囲選択方法色々
4.固定セルへの書き込み方法及び行番号の表示及びデータの高速書き込み方法
5.MSFlexGrid の行の挿入及びMSFlexGrid の行の削除及び1行一括データ書き込み
6.MSFlexGrid の指定の列を基準に指定の方法で並べ替える
7.MSFlexGrid/MSHFlexGrid で列の削除/列の挿入/列の入れ替え
8.MSHFlexGrid の指定範囲のセルデータを消去及び MSHFlexGrid を初期値に設定する
9.1行飛びにセルのバックカラーを設定する
10.MSHFlexGrid で現在画面上に表示されている行数及び列数を取得する
11.MSHFlexGrid/MSFlexGrid の全てのセル内を検索する
12.MSHFlexGrid でプログラム上からスクロールを制御する


フレキシブルグリッド (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.MSFlexGrid / MSHFlexGrid における基本的な動作確認用コード

Option Explicit

Private CurrentRowNo  As Integer  'アクティブセルの行を取得

Private Sub Form_Load()
'MSFlexGrid1 の初期設定(お好みで設定して下さい)
  With MSFlexGrid1
    .Rows = 20       '行数指定
    .Cols = 6        '列数を指定
    .RowHeight(-1) = 350  '行の高さを設定   (-1)=全ての行に対して
    .ColWidth(-1) = 1500  '列幅を設定     (-1)=全ての列に対して
    .FixedCols = 1     '固定列数を設定
    .ColWidth(0) = 500   '固定列幅を設定
    .FixedRows = 1     '固定行数を設定
    .FocusRect = flexFocusNone    'フォーカスを示す四角形を描かない
    .HighLight = flexHighlightAlways '選択されたセルを常に強調表示
  End With
End Sub

Private Sub MSFlexGrid1_GotFocus()
'カレントセルの内容をテキストボックスに転送
  With MSFlexGrid1
    CurrentRowNo = .Row '現在の行番号を記録
    Text1.SetFocus
    'カレントセルの内容をテキストボックスに表示
    Text1.Text = .Text
  End With
End Sub

Private Sub Text1_Change()
  With MSFlexGrid1
    'テキストボックスの内容をカレントセルに転送
    .Text = Text1.Text
  End With
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
'セルのフォーカス移動とスクロール(好みで機能を付加するなり削除するなりして下さい)
  'Enterキーによるフォーカス移動
  With MSFlexGrid1
    If KeyAscii = vbKeyReturn Then
      KeyAscii = 0
      .Text = Text1.Text
      If .Col = .Cols - 1 Then
        '次の行の先頭へ折り返す
        .Col = 0
        If .Row >= 7 And .TopRow <= .Rows - 3 Then
          '行のスクロール
          .TopRow = .TopRow + 1
        End If
        If .Row = .Rows - 1 Then
          '最後の行になったら最初の行へ移動
          .Row = 0
          '先頭行に移動した時にスクロールも元に戻す
          .TopRow = 1
        End If
        .Row = .Row + 1
      End If
      'セルを1つ移動
      .Col = .Col + 1
      .SetFocus
    End If
  End With
End Sub


Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'カーソル移動キーでのセル移動設定(好みで機能を付加するなり削除するなりして下さい)
  With MSFlexGrid1
    Select Case KeyCode
      Case vbKeyUp    '↑
        If .Row > 1 Then .Row = .Row - 1
        If .Row < 8 Then
          'スクロールを元に
          .TopRow = 1
        End If
        .SetFocus
      Case vbKeyDown   '↓
        If .Row < .Rows - 1 Then .Row = .Row + 1
        If .Row >= 7 And .TopRow <= .Rows - 3 Then
          '行のスクロール
          .TopRow = .TopRow + 1
        End If
        .SetFocus
      Case vbKeyLeft   '←
        If .Col > 1 Then .Col = .Col - 1
        .SetFocus
      Case vbKeyRight   '→
        If .Col < 5 Then .Col = .Col + 1
        .SetFocus
    End Select
  End With
End Sub

※ 上記は、MSFlexGrid1 の部分を MSHFlexGrid1 に置き換えるだけで同様に MSHFlexGrid1 でも動作します。

このページのトップへ移動します。 2.上記実行図及び使用上の留意事項
  上記使用コントロール類の配置図及び実行図
 msflexgrid02_01.gif


MSFlexGrid / MSHFlexGrid は、表示専用のコントロールなのでエクセルのようにセルに直接書き込んだり編集する事ができません。
ユーザーが書き込んだり編集ができないとなると使いみちが限られてしまいます。そこで、テキストボックスを介してユーザーが
書き込んだり編集ができるようにしておりますが、初めて MSFlexGrid コントロールを使用される方にとっては、プロパティ類にしろ数が多く見慣れない名前の物が多い事もありとっつきにくいコントロールかと思います。
そこで、今回の見直しにあたり、今まで掲載していたサンプルではいきなりでは複雑かと思い作り直してみました。
以前のサンプルから、動作確認用に限定した部分だけを使っておりますので同様のサンプルを作って頂いて機能の動作確認やサンプルプログラムの動作テスト用にされておくと結構便利かと思います。
上記プログラムでは、下記のような事を試しております。

・MSFlexGrid のアクティブセルの行を取得
・MSFlexGrid の行数を取得及び行数を設定する
・MSFlexGrid の列数を取得及び列数を設定する
・MSFlexGrid の行の高さを取得及び行の高さを設定(-1)=全ての行に対して
・MSFlexGrid の列幅を取得及び列幅を設定(-1)=全ての列に対して
・MSFlexGrid の固定列数を設定及び固定列数を取得
・MSFlexGrid の固定列幅を設定及び固定列幅を取得
・MSFlexGrid の固定行数を設定及び固定行数を取得
・MSFlexGrid のフォーカスを示す四角形を描かない
・MSFlexGrid の選択されたセルを常に強調表示
・MSFlexGrid の現在の行番号を取得
・MSFlexGrid のカレントセルの内容をテキストボックスに表示
・テキストボックスの内容を MSFlexGrid のカレントセルに書き込み
・Enter キーによる MSFlexGrid のセルのフォーカス移動
・MSFlexGrid の行をスクロールする
・MSFlexGrid の先頭行に移動した時にスクロールも元に戻す
・カーソル移動キーでの MSFlexGrid のセル間移動設定

このコードが理解できないと MSFlexGrid / MSHFlexGrid のサンプルは使用できませんので、自分なりにコードを書き換えるなりして試しながら機能を理解して下さい。
こちらが理解できましたら、以前のサンプルも試して見て下さい。

このページのトップへ移動します。 3.MSFlexGrid で行/列/範囲選択方法色々

Private Sub Command1_Click()
  'セルを選択時のフォーカス枠の設定方法色々
  MSFlexGrid1.FocusRect = flexFocusNone

  '  定数     値    内容
  'flexFocusNone   0  カレントセルにフォーカスを示す四角形を描きません。
  'flexFocusLight   1  カレントセルにフォーカスを示す細い四角形を描きます。これは既定値です。
  'flexFocusHeavy   2  カレントセルにフォーカスを示す太い四角形を描きます。
  MSFlexGrid1.HighLight = flexHighlightAlways

  '  定数        値   内容
  'flexHighlightNever   0 選択されたセルを強調表示しません。
  'flexHighlightAlways   1 選択されたセルを常に強調表示します (既定値)。
  'flexHighlightWithFocus 2 コントロールがフォーカスを持ったときに限り、選択されたセルを強調表示します。

  '※ 後は、ご自分で定数を変更して好みの設定が得られるか試して見て下さい。
End Sub

Private Sub Command2_Click()

  'どのセルをクリックしても1行全体又は1列全体が選択されるようにする
  MSFlexGrid1.SelectionMode = flexSelectionByColumn 'flexSelectionByRow

  '    定数      値     内容
  'flexSelectionFree   0  自由に選択できます。セルをスプレッドシート形式で選択できます。これは既定値です。
  'flexSelectionByRow   1  行単位で選択できます。行全体を選択範囲とします。
  'flexSelectionByColumn 2  列単位で選択できます。列全体を選択範囲とします。
End Sub

Private Sub Command3_Click()
  '列/行見出しをクリックしても列/行の全体が選択されない。
  MSFlexGrid1.AllowBigSelection = False

  '列/行見出しをクリックすると列/行の全体が選択される。
  MSFlexGrid1.AllowBigSelection = True  '(既定値)
End Sub

Private Sub Command4_Click()
  'セル範囲を指定して選択する場合
  'Row、Col プロパティは RowSel、ColSel プロパティより先に設定します
  MSFlexGrid1.Row = 2
  MSFlexGrid1.Col = 2
  MSFlexGrid1.RowSel = 5
  MSFlexGrid1.ColSel = 4
End Sub

Private Sub MSFlexGrid1_Click()
  'セル範囲を指定してクリックしたセルの1行全体を選択する
  MSFlexGrid1.FocusRect = flexFocusNone
  MSFlexGrid1.HighLight = flexHighlightAlways

  MSFlexGrid1.Col = MSFlexGrid1.FixedCols   '選択開始列
  MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1  '選択終了列
End Sub

上記の他、デザインモードで指定する事もできます。



行列関係の主なプロパティ
 Row     カレントセルの行を設定・取得
 Col     カレントセルの列を設定・取得
 Rows     総行数を設定・取得(固定行含む)
 Cols     総列数を設定・取得(固定行含む)
 FixedRows  固定行の数を設定・取得
 FixedCols  固定列の数を設定・取得
 TopRow    一番上に表示されている行の行番号を設定・取得
 LeftCol   一番左に表示されている列の列番号を設定・取得
 RowSel    選択範囲の開始・終了行を設定・取得
 ColSel    選択範囲の開始・終了列を設定・取得

又下記の役目を兼用しています。
 Row     選択範囲の上端行番号
 RowSel    選択範囲の下端行番号
 Col     選択範囲の左端列番号
 ColSel    選択範囲の右端列番号

このページのトップへ移動します。 4.固定セルへの書き込み方法及び行番号の表示及びデータの高速書き込み方法

Private Sub Command1_Click()
'固定列(列ヘッダー)への書き込み
  With MSFlexGrid1
    '最初に表示したいセル位置を設定して下さい。
    .Row = 0
    .Col = 2
    '該当セルを 中寄/中寄 表示
    .CellAlignment = flexAlignCenterCenter
    .Text = "項  目"
  End With
End Sub

Private Sub Command2_Click()
'行ヘッダーへ行番号を書き込み
  Dim i As Long
  With MSFlexGrid1
    .Redraw = False   '再描画を抑制する
    '.Col = 0
    For i = .FixedRows To .Rows - 1
      ' .Row = i
      ' .Text = i - .FixedRows + 1  '行番号を表示

      '上記(コメントの部分)でもいいのですが下記の方が書き込みが格段早くなります
      .TextMatrix(i, 0) = i - .FixedRows + 1
    Next i
    .Redraw = True   '再描画を再開する
  End With
End Sub



大量のデータを表示するときに動作を早くするには。

TextMatrix プロパティを使用すると、Row プロパティと Col プロパティを変更することなくセルの内容を設定または取得できます。
従って、Row プロパティと Col プロパティへのアクセスが減り、表示速度が早くなるという訳です。
又、データを読み込み、表示する前にMSFlexGridを一旦非表示にし、次にデータをセルにセットし終った時点で再度表示すると表示が早くなります。これは、リストボックスやエクセル上でも同じく有効です。
同様に、Redraw プロパティを使って、変更があった都度、再描画するのを禁止することでも表示が早くなります。

セルへの書き込み速度は、TextMatrix プロパティの使用による効果の方が大きい。

参考 
 私のマシン(昔の話)で下記を試した結果(5万セルへの書き込み)
   遅い方法  14.04秒
   早い方法   0.35秒 最大表示件数 2.3秒(35万セル)

因みに、MSFlexGridへの最大表示件数はメモリに関係なく総セル数が35万セル(行数×列数)迄です。
尚、MSHFlexGrid の場合は、セル数による制限はありません。

このページのトップへ移動します。 5.MSFlexGrid の行の挿入及びMSFlexGrid の行の削除及び1行一括データ書き込み

Private Sub Command3_Click()
'選択されている行の上側に行を挿入
  Dim No As Integer
  No = MsgBox(MSFlexGrid1.Row & "行目の上側に挿入します。", vbYesNo + vbQuestion, "行の挿入確認")
  If No = vbYes Then
    MSFlexGrid1.AddItem "", MSFlexGrid1.Row
    MSFlexGrid1.RowHeight(MSFlexGrid1.Row) = MSFlexGrid1.RowHeight(MSFlexGrid1.Row - 1) '行の高さ
  End If
End Sub

Private Sub Command4_Click()
'選択されている行の下側に行を挿入
  Dim No As Integer
  No = MsgBox(MSFlexGrid1.Row & "行目の下側に挿入します。", vbYesNo + vbQuestion, "行の挿入確認")
  If No = vbYes Then
    '1行挿入してデータを1行分一括で書き込み
    MSFlexGrid1.AddItem "**" & vbTab & "項目1" & vbTab & "項目2" & vbTab & "項目3" & _
                  vbTab & "項目4" & vbTab & "項目5", MSFlexGrid1.Row + 1
  End If
End Sub


Private Sub Command5_Click()
'現在行の削除設定
  Dim No As Integer
  No = MsgBox(MSFlexGrid1.Row & "行目を削除します。", vbYesNo + vbQuestion, "行の削除確認")
  If No = vbYes Then
    MSFlexGrid1.RemoveItem MSFlexGrid1.Row
  End If
End Sub

---------------------------------------------------------------------------------------
RowPosition プロパティを使っての行操作例
 ・行または列の幅、高さ、配置、色、フォントなどのすべての書式情報も共に移動します。
1.指定の行を指定位置に移動する
2.指定行と指定の行を入れ替える

クリックした行を指定行へ移動する(この例ではTopに移動)
Private Sub MSHFlexGrid1_Click()
  MSHFlexGrid1.RowPosition(MSHFlexGrid1.MouseRow) = MSHFlexGrid1.FixedRows
End Sub

'指定行の入れ替え(3行目と5行目を入れ替える) 隣どうしなら1回でOK
MSHFlexGrid1.RowPosition(3) = 5   '3行目を5行目に移動
MSHFlexGrid1.RowPosition(4) = 3   '元の5行目は4行目になったので4行目を3行目に移動

このページのトップへ移動します。 6.MSFlexGrid の指定の列を基準に指定の方法で並べ替える

Private FrgSort As Boolean

Private Sub Command1_Click()
  With MSFlexGrid1
    .Col = 3  '並べ替えの基準となる列を指定
  FrgSort = Not FrgSort
  'クリックの都度昇順/降順の並べ替えを実施する
  If FrgSort Then
    .Sort = flexSortGenericDescending  '並べ替えの種類を指定
  Else
    .Sort = flexSortGenericAscending  '並べ替えの種類を指定
  End If
  End With
End Sub

並べ替えの種類の定数については、ヘルプをご覧下さい。
Sort 自体のコードは、上記のように簡単なのですが、どこでどのように Sort を実行するかが好みや仕様により色々分かれその下準備の方に工数が多く取られるようです。
上記ができたら、下記も試して見て下さい。
 データを並べ替える(4方法)

  上記ができたら下記のようにヘッダーをクリックして並べ替えるようにも挑戦して見て下さい。
 msflexgrid02_02.gif

このページのトップへ移動します。 7.MSFlexGrid/MSHFlexGrid で列の削除/列の挿入/列の入れ替え
MSFlexGrid には、行の削除や挿入のような機能が列にはありません。
従って、Cols プロパティを使って列数を変更して列のそれぞれのセルデータを移し替えるような作業が必要になります。
Clip プロパティを使った方法もありますが、Clip プロパティは書き込み時には操作が早いのですが、読み込み時には極端に時間がかかりますので、結局下記のようなオーソドックスな方法になりました。
読み込み表示速度比較に使った1万行のデータを使って処理速度を比較して見ましたが、下記のように一瞬で完了しますので処理速度的には問題がないかと思います。
関数化しておきましたので必要個所を変更するなりしてお使い下さい。

Private Sub Command1_Click()
  '1.MSFlexGrid の指定列を削除する
  Call RemoveCols(3)   '0.14 秒/1万件のデータ

  '2.MSFlexGrid の指定位置に列を挿入する
  Call InsertCols(3)   '0.191 秒/1万件のデータ

  '3.MSFlexGrid の指定列と指定列のデータを入れ替える(列の移動/列の入替
  Call SwapCols(4, 1)   '0.089 秒/1万件のデータ
End Sub

Private Sub RemoveCols(ByVal DelCol As Integer)
  Dim i As Long
  Dim j As Long
  With MSHFlexGrid1
    .Redraw = False
    For i = DelCol To .Cols - 2
      '必要により書式情報を引き渡して下さい。
      .ColWidth(i) = .ColWidth(i + 1)
      For j = 0 To .Rows - 1
        .TextMatrix(j, i) = .TextMatrix(j, i + 1)
      Next j
    Next i
    .Cols = .Cols - 1
    .Redraw = True
  End With
End Sub

Private Sub SwapCols(ByVal Col1 As Integer, ByVal Col2 As Integer)
  Dim i As Long
  Dim tmp As Variant
  With MSHFlexGrid1
    .Redraw = False
    For i = 0 To .Rows - 1
      tmp = .TextMatrix(i, Col1)
      .TextMatrix(i, Col1) = .TextMatrix(i, Col2)
      .TextMatrix(i, Col2) = tmp
    Next i
    .Redraw = True
  End With
End Sub

Private Sub InsertCols(ByVal AddCol As Integer)
  Dim i As Long
  Dim j As Long
  With MSHFlexGrid1
    .Redraw = False
    .Cols = .Cols + 1
    For i = .Cols - 1 To AddCol + 1 Step -1
      '必要により書式情報を引き渡して下さい。
      .ColWidth(i) = .ColWidth(i - 1)
      For j = 0 To .Rows - 1
        .TextMatrix(j, i) = .TextMatrix(j, i - 1)
      Next j
    Next i
    For j = 0 To .Rows - 1
      .TextMatrix(j, AddCol) = ""
    Next j
    .Redraw = True
  End With
End Sub


以前は、上記のようにしていましたが、ColPosition プロパティ使用することで下記のように簡単にできる事が判明しましたので今後は、ColPosition プロパティを使った方法に変更して下さい。
尚、ColPosition プロパティは、自動メンバー表示では出てくるのですが、F1 キーを押してヘルプを見ても[ColPos プロパティ]の解説になり、記載がありません。(その為にあまり知られていないのか当サイトでも検索しても使用歴がありませんでした)

ColPosition プロパティは、列の幅、高さ、配置、色、フォントなどのすべての書式情報も共に移動します。

  '指定列の移動及び削除
  MSHFlexGrid1.ColPosition(3) = MSHFlexGrid1.Cols - 1   '3列目を最後の列に移動
  MSHFlexGrid1.Cols = MSHFlexGrid1.Cols - 1        '最後の列を削除(削除しなければ移動になります)

  '指定位置に列を挿入
  MSHFlexGrid1.Cols = MSHFlexGrid1.Cols + 1        '列を1列増やす
  MSHFlexGrid1.ColPosition(MSHFlexGrid1.Cols - 1) = 3   '増やした列を3列目に移動

  '指定列の入れ替え(3列目と5列目を入れ替える)
  MSHFlexGrid1.ColPosition(3) = 5   '3列目を5列目に移動
  MSHFlexGrid1.ColPosition(4) = 3   '元の5列目は4列目になったので4列目を3列目に移動

  クリックした列を最初の列(左端)に移動する
  Private Sub MSHFlexGrid1_Click()
    MSHFlexGrid1.ColPosition(MSHFlexGrid1.MouseCol) = 0
  End Sub

上記例は、簡単に実現できるという事を知って頂く意味で必要最小限のコードにとどめておりますので、ご使用の環境に合わせてコードを追加願います。処理速度は、どれも1万行のデータで、0.01 秒弱です。
又、行に対しては、RowPosition プロパティで同様の操作ができます。

このページのトップへ移動します。 8.MSHFlexGrid の指定範囲のセルデータを消去及び MSHFlexGrid を初期値に設定する

1.MSHFlexGrid の指定範囲のセルデータを消去
  下記サンプル例では、行見出し、列見出しの部分は除いて全てのセルのデータを消去しております。
  因みに、所要時間は、1万行×8列のデータで、0.01 秒かかりました。

Call DelCell(1, 1, MSHFlexGrid1.Rows - 1, MSHFlexGrid1.Cols - 1)  '0.01

Private Sub DelCell(ByVal Rs As Long, ByVal Cs As Long, ByVal Re As Long, ByVal Ce As Long)
  Dim i As Long
  Dim j As Long
  With MSHFlexGrid1
    .Redraw = False
    .Row = Rs
    .Col = Cs
    .RowSel = Re
    .ColSel = Ce
    .FillStyle = flexFillRepeat   '選択されたすべてのセルに反映
    .Text = ""
    .Row = 0
    .Col = 0
    .Redraw = True
  End With
End Sub


2.MSHFlexGrid コントロールを初期表示状態に戻す
  List1.Clear のようにすれば、ListBox では、初期表示状態になるのですが、MSHFlexGrid では、
  セルの内容がクリアされるだけで列や行は削除されません。
  それで知らないと、RemoveItem を使って、1行づつ削除し、最後の方になってエラーが発生し、掲示板に
  書き込みされる方が時たま見受けられます。
  下記のように列数と行数を初期値の状態にセットし直すだけで行及び列が削除されます。

  'MSHFlexGrid1 を初期、表示状態にする(各自の設定に合わせて下さい。下記例では、標準状態に設定)
  With MSHFlexGrid1      '0.022
    .Cols = 2
    .Rows = 2
    .Clear
    .FixedCols = 1
    .FixedRows = 1
    .Col = 0
    .Row = 0
  End With
                              
  上記実行結果、表示されていたものが削除され下記のように
 msflexgrid02_03.gif

このページのトップへ移動します。 9.1行飛びにセルのバックカラーを設定する
案外時間もかからないの関数化するなりして使って見て下さい。
1.1行おきにセルの背景色を設定する

Private Sub Command1_Click()
  Dim i As Long     '0.07 秒/1万行の実行結果  MSFlexGrid の場合 2.50 秒
  With MSHFlexGrid1
    .Redraw = False
    For i = .FixedRows To .Rows - 1
      If i Mod 2 = 0 Then
        .Row = i
        .col = .FixedCols
        .RowSel = i
        .ColSel = .Cols - 1
        .FillStyle = flexFillRepeat
        If .CellBackColor = RGB(255, 228, 225) Then
          '元に戻す場合は、0 に設定すればいいはずですが?
          '.CellBackColor = 0
          .CellBackColor = vbWhite
        Else
          .CellBackColor = RGB(255, 228, 225)
        End If
        .col = 0
        .Row = i
      End If
    Next i
    .Redraw = True
  End With
End Sub

 msflexgrid02_04.gif

注意、.CellBackColor = 0 で本来デフォルトのカラーで設定されるはずなのですが、現在の環境で試した場合、[黒]が設定されました。
MSFlexGrid と MSHFlexGrid では、仕様が違うようです。逆に、MSFlexGrid では、色定数で vbBlack が指定できません。
又、上記記載の通り、処理速度が大きく違います。MSHFlexGrid を使用した方が処理速度が格段に早くなる。
このページのトップへ移動します。 10.MSHFlexGrid で現在画面上に表示されている行数及び列数を取得する

Private Sub Command1_Click()

  'MSHFlexGrid で現在画面上に表示されている列数を取得する
  Debug.Print GetVisibleCols()

  'MSHFlexGrid で現在画面上に表示されている行数を取得する
  Debug.Print GetVisibleRows()

End Sub

Private Function GetVisibleRows() As Long
  'MSHFlexGrid で現在画面上に表示されている行数を求める関数
  Dim i As Long, TopLine As Long, Lins As Long
  With MSHFlexGrid1
    TopLine = .TopRow
    Lins = .Rows
    For i = TopLine To .Rows - 1
      If .RowIsVisible(i) = False Then
        Lins = i - TopLine
        Exit For
      End If
    Next i
    GetVisibleRows = Lins
  End With
End Function

Private Function GetVisibleCols() As Long
  'MSHFlexGrid で現在画面上に表示されている列数を求める関数
  Dim i As Long, TopLine As Long, Lins As Long
  With MSHFlexGrid1
    TopLine = .LeftCol
    Lins = .Cols
    For i = TopLine To .Cols - 1
      If .ColIsVisible(i) = False Then
        Lins = i - TopLine
        Exit For
      End If
    Next i
    GetVisibleCols = Lins
  End With
End Function

このページのトップへ移動します。 11.MSHFlexGrid/MSFlexGrid の全てのセル内を検索する

Private Sub Command1_Click()
  Dim Ro   As Long
  Dim Co   As Long
  Dim Ret  As Long
  Dim Mike  As Boolean
  With MSHFlexGrid1
    For Ro = .FixedRows To .Rows - 1
      For Co = .FixedCols To .Cols - 1

        '前方一致検索の場合
        If InStr(.TextMatrix(Ro, Co), Text1.Text) Then

        '完全一致検索の場合
        If .TextMatrix(Ro, Co) = Text1.Text Then

          .col = Co
          .Row = Ro
          .TopRow = Ro
          Mike = True
          Ret = MsgBox("これですか", vbYesNo)
          If Ret = vbYes Then
            Exit Sub
          End If
        End If
      Next Co
    Next Ro
  End With
  If Mike = False Then
    MsgBox "見つかりませんでした。"
  End If
End Sub


1.MSHFlexGrid の全てのセル内を前方一致検索する
2.MSHFlexGrid の全てのセル内を完全一致検索する
上記どちらか一方をコメントにして使用して下さい。(どちらも1万行×7列の検索で、0.35 秒程度です。)

このページのトップへ移動します。 12.MSHFlexGrid でプログラム上からスクロールを制御する

Private Sub MShFlexGrid1_Scroll()
'スクロールに合せてカレントセルを移動したい場合は
  MSHFlexGrid1.Row = MSHFlexGrid1.TopRow
End Sub

Private Sub Command1_Click()
  '一画面分スクロールする場合は、GetVisibleRows() を使って
  Text1.Text = GetVisibleRows() - 1

  Dim sc As Long
  sc = CLng(Text1.Text)
  If sc > 0 Then
    '下方向にスクロール
    If MSHFlexGrid1.TopRow + sc < MSHFlexGrid1.Rows - 1 Then
      MSHFlexGrid1.TopRow = MSHFlexGrid1.TopRow + sc
    Else
      MSHFlexGrid1.TopRow = MSHFlexGrid1.Rows - 1
    End If
  Else
    '上方向にスクロール
    If MSHFlexGrid1.TopRow + sc > 1 Then
      MSHFlexGrid1.TopRow = MSHFlexGrid1.TopRow + sc
    Else
      MSHFlexGrid1.TopRow = 1
    End If
  End If
End Sub

1.MSHFlexGrid で指定行下方向にスクロールする
2.MSHFlexGrid で指定行上方向にスクロールする
3.MSHFlexGrid で1画面分スクロールする
4.スクロールに合せてカレントセルを移動する

今回は、行のスクロールについて書いておりますが、列の場合は、TopRow のところは、LeftCol 等に置き換えて頂けば使用できるかと思います。

このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
フレキシブルグリッド (MSFlexGrid) コントロールリファレンス MSFlexGrid1行サンプル MSFlexGrid1行Tips  MSFlexGrid ワンポイントサンプル
階層フレキシブルグリッド (MSHFlexGrid) コントロール MSFlexGridへの最大表示件数 MSFlexGrid における制限事項


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