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.上記実行図及び使用上の留意事項 |
上記使用コントロール類の配置図及び実行図 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方法) 上記ができたら下記のようにヘッダーをクリックして並べ替えるようにも挑戦して見て下さい。 |
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 上記実行結果、表示されていたものが削除され下記のように |
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 注意、.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 における制限事項 |