その他の小技集(その1)
                                                      玄関へお回り下さい。

    ********** 目   次 **********

 1.データの読み込み表示を高速にする
 2.行/列のサイズの設定
 3.表示しているデータを消去する
 4.セルを1行全体に選択反転表示する
 5.スクロールを制御する
 6.セルに色をつける
 7.カレントセルの取得設定他行・列管理
 8.セルに縦書き文字を表示
 9.その他の小技集(その2)へ移動

サンプルNo(039)はクリック毎に動作が反転するように作成しています。
データの読み込み表示を高速にする      (039)
     データをセルに読み込んで表示した場合、表示に時間がかかると感じた方は、次を試して下さい。

データを読み込み、表示する前にMSFlexGridを一旦非表示にする
次にデータをセルにセットし終った時点で再度表示する。
これは、リストボックスやエクセル上でも同じく有効です。
セルへの書き込みは .TextMatrix(i, j) = n を使用します。(こちらの効果の方が
大きい)
参考 
 私のマシンで下記を試した結果(5万セルへの書き込み)
   遅い方法  14.04秒
   早い方法   0.35秒        最大表示件数 2.3秒(35万セル)
ちなみに、MSFlexGridへの最大表示件数はメモリに関係なく総セル数が35万セル迄です。
(ヘルプの記載は間違っております。)

従って、私のサンプルで遅い方法で表示設定してある場合は、実際の使用場面では早い
方法に変更してお使い下さい。


簡単なテスト例
'宣言セクションに記入して下さい
Private MSFGShowFlag  As Boolean
'システムを立ち上げてからの経過時間を高精度に取得する
Private Declare Function timeGetTime Lib "winmm.dll" () As Long


Private Sub Command7_Click()
'Private MSFGShowFlag  As Boolean '宣言セクションに記入して下さい
  Dim i As Long
  Dim j As Long
  Dim n As Long
  Dim st As Long
  Me.MousePointer = vbHourglass  'vbDefault
  MSFGShowFlag = Not MSFGShowFlag
  st = timeGetTime
  'ダミーのデータを表示
  With MSFlexGrid1
    .Rows = 6250
    .Cols = 8
    '表示を早くするために一旦非表示に設定
    If MSFGShowFlag = False Then
      .Visible = False
    Else
      .Visible = True   '表示状態の場合
    End If
    .RowHeight(-1) = 350
    '固定行は除く
    For i = .FixedRows To .Rows - .FixedRows
      '固定列は除く
      For j = .FixedCols To .Cols - .FixedCols
        If MSFGShowFlag = False Then
          n = n + 1
          .TextMatrix(i, j) = n  'こちらの方が高速
        Else
          .Col = j  'こちらは遅い(この部分の差の方が大きい)
          .Row = i
          n = n + 1
          .Text = n
        End If
      Next j
    Next i
    Me.MousePointer = vbDefault
    .Visible = True
    .Refresh
  End With
  Label2.Caption = "読み込み表示に " & _
             (timeGetTime - st) / 1000 & " 秒かかりました"


  st = Timer
  Do While Timer - st < 3
    DoEvents
  Loop
  MSFlexGrid1.Clear
  Label2.Caption = ""
End Sub

行/列のサイズの設定
     行と列の指定に「-1」を使用するとすべての行・列の意味になります

使用例
MSFlexGrid1.RowHeight(1) = 350  '1行目の高さを350に設定
MSFlexGrid1.RowHeight(-1) = 350 'すべての行の高さを350に

MSFlexGrid1.ColWidth(1) = 550   '1列目の幅を550に設定
MSFlexGrid1.ColWidth(-1) = 550  'すべての列の幅を550に

表示しているデータを消去する                   (042)
     Option Explicit   'SampleNo=042 WindowsXP VB6.0(SP5) 2002.05.03
Private Sub Command1_Click()
'セル個別に表示をクリア
  Dim i As Integer
  Dim j As Integer
  '表示を早くするために一旦非表示に設定
  With MSFlexGrid1
    .Visible = False
    '固定列は除く(列・行を選択して)
    For i = 3 To .Cols - .FixedCols  '.FixedCols To .Cols - .FixedCols
       '固定行は除く
      For j = .FixedRows To _
             .Rows - .FixedRows
        .Col = i
        .Row = j
        .Text = ""
      Next j
    Next i
    .Visible = True
  End With
End Sub


特定の列や行に違った初期値(0 or ”” 他)を入れたい場合上記の方法が便利だが全セル同じ初期値を入れるなら下記の方が簡単高速に処理が出来る。

Private Sub Command2_Click()
'範囲を選択して表示をクリア
  With MSFlexGrid1
    .Visible = False       '表示を非表示に
    .Row = .FixedRows       '選択範囲の行のスタート位置
    .Col = 3 ' .FixedCols       '選択範囲の列のスタート位置
    .RowSel = .Rows - .FixedRows '行のエンド位置
    .ColSel = .Cols - .FixedCols '列のエンド位置
    '選択されているすべてのセルに反映されます。
    .FillStyle = flexFillRepeat
    .Text = ""
    .Row = .FixedRows       '左上のセルに移動
    .Col = .FixedCols
    .Visible = True
  End With
End Sub


件数が多い場合 MSFlexGrid1.Clear で一旦全部消し固定行と列のタイトル等を再度表示する。

セルを1行全体に選択反転表示する      (041)
       簡単な方法

通常下記の設定で固定行・列をクリックすると1行選択・反転表示される
Private Sub Command1_Click()
    MSFlexGrid1.FocusRect = flexFocusNone
    MSFlexGrid1.HighLight = flexHighlightAlways
End Sub


どのセルをクリックしても1行選択・表示されるようにするには

  簡単な方法
Private Sub Command2_Click()
    MSFlexGrid1.SelectionMode = flexSelectionByRow
         
'列単位の定数= flexSelectionByColumn
End Sub


  違った方法
Private Sub Command3_Click()
    MSFlexGrid1.FocusRect = flexFocusNone
    MSFlexGrid1.HighLight = flexHighlightAlways
    MSFlexGrid1.Col = MSFlexGrid1.FixedCols
    MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1
End Sub


その他このような方法も
(デザインモードで)
 1.グリッド上で右クリック
 2.プロパティを選択
 3.選択モードを [1-By Row]
 4.適用(OK)

又このような方法も
  Private Sub Grid_Click()
    Grid.Col = 0
    Grid.ColSel = Grid.Cols - 1
  End Sub

いずれにしろ簡単な方法は1長1短があるようです。


少し複雑になるが別の方法として

宣言セクションに
Option Explicit   'SampleNo=041 WindowsXP VB6.0(SP5) 2002.05.03
Dim i  As Integer
Dim Ro1 As Integer
Dim Ro2 As Integer
Dim Frg As Integer


Private Sub MSFlexGrid1_DblClick()
    '変数 i, Ro1 , Ro2,Frg ,は宣言セクションに宣言する
    '今の行の位置を取得
    If Ro2 = 0 Then
      Ro2 = MSFlexGrid1.Row
    End If
    If Frg = 1 Then kesu '反転解除のルーチンへ
    '今の行の位置に戻る
    MSFlexGrid1.Row = Ro2
    Ro1 = Ro2 '今の行の位置を取得
    '反転表示を設定

    For i = MSFlexGrid1.FixedCols To MSFlexGrid1.Cols - 1
      MSFlexGrid1.Col = i
      MSFlexGrid1.CellBackColor = QBColor(1)
      MSFlexGrid1.CellForeColor = QBColor(15)
    Next i
    Frg = 1
  End If
End Sub


Private Sub MSFlexGrid1_Click()
  If Frg = 1 Then kesu
End Sub


Private Sub
kesu()
  If Frg = 0 Then Exit Sub
  Ro2 = MSFlexGrid1.Row
  MSFlexGrid1.Row = Ro1
  '反転表示を元に戻す
  For i = MSFlexGrid1.FixedCols To MSFlexGrid1.Cols - 1
    MSFlexGrid1.Col = i
    MSFlexGrid1.CellBackColor = QBColor(15)
    MSFlexGrid1.CellForeColor = QBColor(0)
  Next i
  Frg = 0
End Sub

スクロールを制御する                 (024)
     行のスクロールを制御するにはTopRowの値を変化させます。
列のスクロールを制御するにはLeftColの値を変化させます。

行のスクロール制御例

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'カーソル移動キーでのセル移動設定
   
With MSFlexGrid1
       
Select Case KeyCode
           
Case vbKeyUp
           
'↑キーが押されたら行を1行上に移動
               
If .Row > 1 Then .Row = .Row - 1    '↑
               
'グリッドの表示行数以下になった場合
               
If .Row < 8 Then
                   
'スクロールを元に
                    .TopRow = 1
               
End If
                .SetFocus
           
Case vbKeyDown
           
'↓キーが押されたら行を1行下に移動
               
If .Row < 10 Then .Row = .Row + 1   '↓
               
'グリッドの表示行数以上になった場合
               
If .Row >= 8 Then
                   
'行のスクロール
                    .TopRow = .TopRow + 1
               
End If
                .SetFocus
           
Case vbKeyLeft
           
'←キーが押されたらセルを1列左に移動
               
If .Col > 1 Then .Col = .Col - 1    '←
                .SetFocus
           
Case vbKeyRight
           
'→キーが押されたらセルを1列右に移動
               
If .Col < 5 Then .Col = .Col + 1    '→
                .SetFocus
       
End Select
   
End With
End Sub


列の場合は行の所を列に変更して下さい。


スクロールに合せてカレントセルを移動したい場合は


Private Sub MSFlexGrid1_Scroll()
  MSFlexGrid1.Row = MSFlexGrid1.TopRow
End Sub
セルに色をつける              (039)
   1.選択されたセルを強調表示するかどうかを指定する
  例 MSFlexGrid1.HighLight = flexHighlightAlways
     MSFlexGrid1.FocusRect = flexFocusNone
  定数
flexHighlightNever 0  選択されたセルを強調表示しません。
flexHighlightAlways 1  選択されたセルを常に強調表示します
  flexHighlightWithFocus 2  コントロールがフォーカスを持ったとき
 に選択されたセルを強調表示します。

2.セル個別に色をつける

Private Sub Command2_Click()
  MSFlexGrid1.Row = 3
  MSFlexGrid1.Col = 5
  '3行目の5列目に色をつける
  If MSFlexGrid1.CellBackColor <> QBColor(11) Then
    '明るいシアンに設定する
    MSFlexGrid1.CellBackColor = QBColor(11)
    MSFlexGrid1.CellForeColor = QBColor(12)
  Else
    '色を非表示
    MSFlexGrid1.CellBackColor = 0
    MSFlexGrid1.CellForeColor = QBColor(0)
  End If
  MSFlexGrid1.Row = 1
  MSFlexGrid1.Col = 1
End Sub


3.1行飛びに色をつける
Private Sub Command1_Click()
  Dim Co As Integer
  Dim Ro As Integer
  '1行飛びに色をつける(再度クリックすると解除される)
  For Ro = MSFlexGrid1.FixedRows To MSFlexGrid1.Rows - _
        MSFlexGrid1.FixedRows Step 2
    '1行全体を
    For Co = MSFlexGrid1.FixedCols To _
      MSFlexGrid1.Cols - MSFlexGrid1.FixedCols
      MSFlexGrid1.Row = Ro
      MSFlexGrid1.Col = Co
      If MSFlexGrid1.CellBackColor = 0 Then
        '明るいシアンに設定する
        MSFlexGrid1.CellBackColor = QBColor(11)
      Else
        '色を非表示
        MSFlexGrid1.CellBackColor = 0
      End If
    Next Co
  Next Ro
End Sub


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

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

Private Sub Command6_Click()
  With MSFlexGrid1

    MsgBox "カレントセルは" & .Row & "行目の" & .Col & "列目です"

    MsgBox "カレントセルを3行目の5列目に設定します"
    'カレントセルの設定(3行目の5列目に)
    .Row = 3
    .Col = 5

  End With
End Sub

セルに縦書き文字を表示             (039)
     説明するよりもフォームにMSFlexGridを貼付け下記を試してみて下さい。
ポイントはワードラップの設定です。

Private Sub Command4_Click()
  If MSFlexGrid1.WordWrap = False Then
    MSFlexGrid1.WordWrap = True    '複数行の入力可
    MSFlexGrid1.Col = 0
    MSFlexGrid1.Row = 1
    MSFlexGrid1.ColWidth(0) = 300
    MSFlexGrid1.ColWidth(1) = 500
    MSFlexGrid1.RowHeight(1) = 800
    MSFlexGrid1.RowHeight(2) = 800

    MSFlexGrid1.Text = "花" & vbCrLf & "ち" & vbCrLf & "ゃ" & _
                          vbCrLf & "ん"
    MSFlexGrid1.Row = 2
    MSFlexGrid1.Text = "花ちゃん"

    MSFlexGrid1.Col = 1
    MSFlexGrid1.Row = 1
    MSFlexGrid1.Text = "花" & vbCrLf & "ち" & vbCrLf & "ゃ" & _
                          vbCrLf & "ん"
    MSFlexGrid1.Row = 2
    MSFlexGrid1.Text = "花ちゃん"

    MSFlexGrid1.Col = 2
    MSFlexGrid1.Row = 1
    MSFlexGrid1.Text = "花" & vbCrLf & "ち" & vbCrLf & "ゃ" & _
                          vbCrLf & "ん"
    MSFlexGrid1.Row = 2
    MSFlexGrid1.Text = "花ちゃん"
  Else
    MSFlexGrid1.WordWrap = False   '複数行の入力可
    MSFlexGrid1.Clear

    Dim lngCountI As Long      'ループ用カウンター
    Form1.Move 0, 0, 11280, 4950

    'MSFlexGrid の初期設定
    With MSFlexGrid1
      .Move 150, 150, 8170, 3180
      .Rows = 10         '行の総数(固定行含む)
      .Cols = 8          '列の総数(固定列含む)
      .FixedRows = 1       '固定行の数 Rowsより1以上少ない事
      .FixedCols = 1       '固定列の数 Colsより1以上少ない事
      .Row = 0
      .ColWidth(0) = 430     '列幅
      .ColWidth(1) = 550
      .ColWidth(2) = 1800
      For lngCountI = 3 To 7
        .ColWidth(lngCountI) = 1000
      Next lngCountI
      .RowHeight(0) = 350     '行の高さ
      .Col = 1: .Text = "No"
      '該当セルを 中寄/中寄 表示
      .CellAlignment = flexAlignCenterCenter
      .Col = 2: .Text = "氏  名"
      .CellAlignment = flexAlignCenterCenter
      .Col = 3: .Text = "国 語"
      .CellAlignment = flexAlignCenterCenter
      .Col = 4: .Text = "数 学"
      .CellAlignment = flexAlignCenterCenter
      .Col = 5: .Text = "英 語"
      .CellAlignment = flexAlignCenterCenter
      .Col = 6: .Text = "合 計"
      .CellAlignment = flexAlignCenterCenter
      .Col = 7: .Text = "平均点"
      .CellAlignment = flexAlignCenterCenter
      .Col = 0
      For lngCountI = 1 To .Rows - 1
        .RowHeight(lngCountI) = 350   '行の高さ
        .Row = lngCountI
        .Text = lngCountI        '行番号を表示
      Next lngCountI
      .Col = 1: .Row = 1
      .FocusRect = flexFocusNone
      .HighLight = flexHighlightAlways

    End With
    With Text1
      .BackColor = &H80FFFF    '動きが分かりやすいように
      .Text = ""
      .Visible = False
    End With
  End If
End Sub




2002/05/03