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


5.MSFlexGrid/MSHFlexGridへのデータ表示設定色々
1.CSV ファイルをシーケンシャル入力モードで開き MSHFlexGrid に表示
2.CSV ファイルを ADO(ActiveX Data Objects) を使って MSHFlexGrid へ表示
3.CSV ファイルを ADO と SCHEMA.INI ファイルを使って、 MSHFlexGrid へ表示
4.xls (エクセル)ファイルを ADO を使って、 MSHFlexGrid へ表示
5.MSHFlexGrid に表示されたデータを書式設定(Format)して表示する
6.CSV ファイルをバイナリファイルモードで開き MSHFlexGrid に表示(最速)
7.
8.ADO(ActiveX Data Objects)について
9.SCHEMA.INI ファイルについて
10. 
11. 
12. 

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:Microsoft ActiveX Data Objects 2.8 Library 参照設定方法参照
使用 API:
その他 :プロジェクト→コンポーネント→コントロールで Microsoft Hierarchical FlexGrid にチェックを入れ、
    :表示されたコントロールをフォームに貼り付けて下さい。
このページのトップへ移動します。 1.CSV ファイルをシーケンシャル入力モードで開き MSFlexGrid に表示

Option Explicit

Private Sub Command1_Click()
  'コントロール類の初期設定
  Form1.Move 0, 0, 8000, 4000
  MSHFlexGrid1.Redraw = False   '再描画を抑制
  '続けて実行されても問題が起きないように一旦初期値に設定
  With MSHFlexGrid1
    .Move 45, 45, 7600, 3400
    .Rows = 2
    .Clear
    .FixedRows = 1
    .FixedCols = 1
    .AllowUserResizing = flexResizeBoth
    .RowHeightMin = 300
  End With

  'CSV ファイルを読み込み MSFlexGrid に表示
  Dim intFileNo As Integer  'ファイルNo
  Dim TextLine As String
  Dim CellsData As Variant
  Dim lngCount As Long
  Dim i     As Long
  intFileNo = FreeFile
  'シーケンシャル入力モードで Test.csv をオープン
  'ファイルのPATHは別途設定して下さい。
  Open "dbTest.csv" For Input As #intFileNo
  Do Until EOF(intFileNo)               'EOF(intFileNo)が True になるまで実行
    Line Input #intFileNo, TextLine         '1行全体を変数に読み込む
    TextLine = Replace(TextLine, Chr$(34), "")   ' "" を取り除く
    CellsData = Split(TextLine, ",")        'カンマ区切りで列データを分割
    If MSHFlexGrid1.Cols < UBound(CellsData) + 1 Then
      'データの列数に合せて、MSFlexGrid の列数を設定
      MSHFlexGrid1.Cols = UBound(CellsData) + 1
    End If
    lngCount = lngCount + 1             '行数をカウント
    If lngCount > 2 Then
    MSHFlexGrid1.Rows = MSHFlexGrid1.Rows + 1    '行数を追加
    End If
    For i = LBound(CellsData) To UBound(CellsData)
      'MSHFlexGrid のセルにデータを書込み
      MSHFlexGrid1.TextMatrix(lngCount - 1, i) = CellsData(i)
    Next i
  Loop
  Close #intFileNo
  MSHFlexGrid1.Redraw = True '再描画を再開
End Sub


  上記実行結果
 msflexgrid04_01.gif

Form に MSFlexGrid1 を貼り付け上記コードをコピー・アンド・ペーストすれば、上記のように表示されるはずです。
念のためにデータはこちらをお使い下さい。このページでのサンプルで共通で使用しますので解凍してこのプログラムと同じフォルダーに全てのファイルを入れておいて下さい。

このページのトップへ移動します。 2.CSV ファイルを ADO(ActiveX Data Objects) を使って MSHFlexGrid へ表示

Private Sub Command2_Click()
  MSHFlexGrid1.Clear: DoEvents
  'コントロール類の初期
  Form1.Move 0, 0, 8000, 4000
  With MSHFlexGrid1
    .Move 45, 45, 7600, 3400
    .FixedRows = 1
    .FixedCols = 0
  End With

  Dim CN     As New ADODB.Connection
  Dim RS     As New ADODB.Recordset
  Dim strSQL   As String
  Dim FolderName As String
  Dim DataFile  As String

  FolderName = App.Path      'データのあるフォルダーを取得
  DataFile = "dbtest.csv"     'データファイル名を取得(通常で)
  'データベースに接続するための情報を設定する
  CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderName & _
      ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited"""
  CN.Open   'コネクションをオープン

  'Recordsetオブジェクトのオープン
  strSQL = "Select * From " & DataFile
  RS.Open strSQL, CN, adOpenStatic, adLockReadOnly, adCmdText
  Set MSHFlexGrid1.DataSource = RS  'MSHFlexGridにデータを代入

  'Recordset・Connection を閉じる
  RS.Close
  CN.Close
  '参照を解放。
  Set RS = Nothing
  Set CN = Nothing
End Sub

  上記実行結果
 msflexgrid04_02.gif

このページのトップへ移動します。 3.CSV ファイルを ADO と SCHEMA.INI ファイルを使って、 MSHFlexGrid へ表示
SCHEMA.INI(スキーマ)ファイルを使用するとデータの型を指定して読み込む事ができます。
SCHEMA.INI ファイルを EXE と同じフォルダーに入れておくだけで、プログラム上では何も書く必要はありません。
SCHEMA.INI ファイルは、データと同じZIP ファイルに入っているものをお使い下さい。
SCHEMA.INI の簡単な書き方も書いてありますで色々書き換えて試して見て下さい。
詳しく知りたい場合は、Web 上でも検索して調べて下さい。又、Microsoft のサイトに [AC97]VBAから Schema.ini ファイルを作成する方法 が掲載されているのでご覧ください。

上記の2.のサンプルでテストされる場合は、DataFile = "dbtest1.csv" に変更して頂くだけで、SCHEMA.INI が試せるようになっております。(データもここのを使用して)

 msflexgrid04_03.gif

このページのトップへ移動します。 4.xls (エクセル)ファイルを ADO を使って、 MSHFlexGrid へ表示

Private Sub Command5_Click()
  MSHFlexGrid1.Clear: DoEvents
  'コントロール類の初期
  Form1.Move 0, 0, 8000, 4000
  With MSHFlexGrid1
    .Move 45, 45, 7600, 3400
    .FixedRows = 1
    .FixedCols = 0
  End With
  Dim CN     As New ADODB.Connection
  Dim RS     As New ADODB.Recordset
  Dim strSQL   As String
  Dim FolderName As String
  Dim DataFile  As String
  Dim SheetNeme  As String
  FolderName = App.Path           'データのあるフォルダーを取得
  DataFile = FolderName & "\dbtest.xls"   'データファイル名を取得(通常で)
  SheetNeme = "dbtest1"           'Excelファイルのシート名
  'データベースに接続するための情報を設定する
  CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataFile & _
      ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""

  CN.Open   'コネクションをオープン

  'Recordsetオブジェクトのオープン
  strSQL = "Select * From [" & SheetNeme & "$]"
  RS.Open strSQL, CN, adOpenStatic, adLockReadOnly, adCmdText
  Set MSHFlexGrid1.DataSource = RS  'MSHFlexGridにデータを代入

  'Recordset・Connection を閉じる
  RS.Close
  CN.Close
  '参照を解放。
  Set RS = Nothing
  Set CN = Nothing
End Sub

実行結果は、2.の状態と同じです。
詳しくは、下記を参照して下さい。
[HOWTO] Visual Basic または VBA から ADO を Excel データで使用する
結局、どのような方法で読み込んでも元のデータが悪ければ思い通りの表示ができません。(好みもある事だし)

このページのトップへ移動します。 5.MSHFlexGrid に表示されたでーたーを書式設定(Format)して表示する

Private Sub Command4_Click()
'データの表示設定(使用するデータに合わせて変更して下さい。)
On Error Resume Next
  Dim i As Long
  With MSHFlexGrid1
    .Redraw = False   '再描画を抑制する
    '列ヘッダーの表示設定(中央揃えに)
    .Row = 0
    For i = 0 To .Cols - 1
      .col = i
      .CellAlignment = flexAlignCenterCenter
    Next i

    '各列の Alignment の設定(列数が多い場合や使い回しする場合にこの方が便利かと)
    For i = 0 To .Cols - 1
      Select Case i
        Case 0, 4, 5, 6, 7
          .ColAlignment(i) = flexAlignRightCenter
        Case 1, 2, 3
          .ColAlignment(i) = flexAlignLeftCenter
      End Select
    Next i

    '各列幅の設定
    For i = 0 To .Cols - 1
      Select Case i
        Case 0
          .ColWidth(i) = 430
        Case 1, 3, 4
          .ColWidth(i) = 1100
        Case 2
          .ColWidth(i) = 700
        Case 5, 6, 7, 8
          .ColWidth(i) = 900
      End Select
    Next i

    '各列データのフォーマット設定
    For i = .FixedRows To .Rows - 1
      .TextMatrix(i, 4) = Format$(CDate(.TextMatrix(i, 4)), "yyyy/mm/dd")
      .TextMatrix(i, 5) = Format$(Val(.TextMatrix(i, 5)), "#,###")
      .TextMatrix(i, 6) = Format$(Val(.TextMatrix(i, 6)), "#,###")
      .TextMatrix(i, 7) = Format$(CSng(.TextMatrix(i, 7)), "###.0")
    Next i
    .Redraw = True
  End With
End Sub

  上記実行結果(0.43 秒/1万行のデータで)
 msflexgrid04_04.gif

データ件数が、少ない場合は、上記のように個別に書式設定すれば、思い通りの表示ができますが、件数が多いと時間がかかったりします。
そのような場合は、元のデータを全て文字列で作成しておくと表示的には簡単で早く処理ができます。

このページのトップへ移動します。 6.CSV ファイルをバイナリファイルモードで開き MSHFlexGrid に表示
以前、ゆう(U) さんに教えてもらった方法ですが、表示するデータがきちんとしたCSV データならこの方法での読み込み表示が一番早くデータの表示も保存時の状態のまま表示されます。(下記比較結果参照)

Private Sub Command6_Click()
  Dim intFileNo As Integer
  Dim bytArray() As Byte
  Dim strBuffer As String
  Dim FileName  As String
  FileName = App.Path & "\dbtest.csv"
  intFileNo = FreeFile
  'ファイルを読み込み専用のバイナリファイルモードで開く
  Open FileName For Binary Access Read As #intFileNo
  'ファイルサイズを取得してバッファーに設定
  ReDim bytArray(0 To LOF(intFileNo) - 1)
  'バイト配列にファイルを読み込み
  Get #intFileNo, , bytArray
  Close #intFileNo
  '文字列をUnicode に変換
  strBuffer = StrConv(bytArray, vbUnicode)
  '読み込んだ文字列を行と列に配列
  strBuffer = Replace(Replace(strBuffer, ",", vbTab), vbCrLf, vbCr)
  'データの最後が改行(vbCR)の場合削除
  If Right$(strBuffer, 1) = vbCr Then
    strBuffer = Left$(strBuffer, Len(strBuffer) - 1)
  End If
  With MSHFlexGrid1
    .Redraw = False   '再描画を抑制(処理速度を早くする為に)
    .Rows = UBound(Split(strBuffer, vbCr)) + 1           '行数の設定
    .Cols = UBound(Split(Split(strBuffer, vbCr)(0), vbTab)) + 1   '列数の設定
    .Row = 0      '表示開始位置
    .Col = 0      '表示開始位置
    .RowSel = .Rows - 1 '表示終了位置
    .ColSel = .Cols - 1 '表示終了位置
    .Clip = strBuffer  '上記選択範囲内のセルに値を設定する(この逆はデータが多いと時間がかかるので注意)
    .Row = 0      '選択を解除してカレントセルの位置を設定
    .Col = 0      '選択を解除してカレントセルの位置を設定
    .Redraw = True   '再描画を再開
  End With
End Sub

※ セル内データに区切り文字(vbCR/vbTab/vbCRLF)等が含まれているとうまく読み込みができない場合があります。
  データの型は保存時の表示状態のまま表示されますので、後でフォーマット等の処理も必要ありません。
  但し、この方法での保存はデータ件数が多いと処理速度が極端に遅くなり使い物になりません。


上記で使用していた dbtest.csv を1万行(553KB)で作成しての読み込みテスト結果

       5000行の場合  10,000行の場合
1.での方法  0.65 秒     2.25 秒
2.での方法  0.30 秒     0.38 秒
3.での方法  0.33 秒     0.40 秒
4.での方法  0.13 秒     0.20 秒
6.での方法  0.06 秒     0.11 秒

使用するデータやデータ量に大きく左右されるので、ご自分の環境で試して一番よい方法をお使い下さい。

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


このページのトップへ移動します。 8.ADO(ActiveX Data Objects)について

その昔に調べた時の記事ですが、一応掲載しておきます。今では、WEB上の情報も豊富なのでWEB上を検索して調べて下さい。
掲示板に投稿があって、試してみたらかなり高速に読込表示でき ADO+MSHFlexGrid+CSV の組み合わせは結構使えるかなと思い紹介します。
私も今回初めてADOを扱いました。色々調べた結果を下記に書き留めておきます。
ODBC接続
Provider=MSDASQL
使用するデータベースの種類
Extended Properties="" ODBCドライバーのための設定は、Extended Properties = に一括して与えます。これらを一まとめにするために、" (ダブルクォーテーション)が利用されます。上のコードでは、文字列の中に入る " をエスケープするために二重に記述しています"
DRIVER={Microsoft Text Driver (*.txt; *.csv)} ODBCドライバー名
DBQ=FolderName ODBCドライバーを使って接続するデータベースファイル名(フォルダー名)
Data Source 使用するデータベースファイル名
User ID データベースに接続する時に使用するユーザー名
Password データベースに接続する時に使うパスワード
FILE NAME データベースへの接続情報指定したデータリンクファイル名
DSN データベースへの接続情報指定したODBCデータソース名
Location 接続先のサーバー名
Open メソッド
構文
Recordset.Open Source, ActiveConnection, CursorType, LockType, Options
実文
RS.Open strSQL, CN, adOpenStatic, adLockReadOnly, adCmdText
Recordset Recordsetオブジェクトを表すオブジェクト変数 (RS)
Source 省略可能です。データを取得するテーブル名又はSQLステートメント
(strSQL = "Select * From " & DataFile)
ActiveConnection
省略可能です。接続中のデータベースを表すオブジェクト変数 (CN)
CursorType 省略可能です。カーソルタイプ(下記定数より選択)
 定 数          説   明
adOpenForwardOnly  デフォルトの値です。
          前方スクロール タイプ カーソルを開きます。
adOpenKeyset     キーセット カーソルを開きます。
adOpenDynamic    動的カーソルを開きます。
adOpenStatic     静的カーソルを開きます。
Options 省略可能です。Source 引数が Command オブジェクト以外の設定値を表す場合、または以前に保存していたファイルから Recordset を復元する場合に、プロバイダーが引数を評価する方法を示す
IMEX=
0  はエクスポートモードです。
1  はインポートモードです。
2  はリンクモード (完全な更新が可能) です。省略すれば 2 と同じ。

HDR=NO  1行目を読み込んで表示する。
HDR=YES 1行目を
読み込まない。
スキャンする行数 のデフォルト値は 8 行です。行数には 1 から 16 までの整数値を指定できます。0 を指定すると既存のすべての行がスキャンされます。スキャンする行数を指定するには接続文字列に MaxScanRows= の設定を追加するか、DSN 構成ダイアログボックスの [スキャンする行数] の設定を変更します。

ただし、ODBC ドライバーの不具合のため、現時点ではスキャンする行数 (MaxScanRows) を指定しても効果がありません。つまり、Excel ODBC ドライバー (MDAC 2.1 以降) は常に、指定されたデータソースの最初の 8 行をスキャンして、各列のデータ型を判断します

詳しくは、ADO プログラマズガイド / Microsoft OLE DB Provider for Microsoft Jet 等をご覧下さい。

このページのトップへ移動します。 9.SCHEMA.INI ファイルについて

今回使用した SCHEMA.INI ファイルは、下記のようなものです。
--------------------------------------------------- この部分は不要
[dbtest1.csv]
ColNameHeader=true
Format=CSVDelimited
MaxScanRows=8
CharacterSet=OEM
Col1="No" Short
Col2="氏名" Text Width 50
Col3="支店" Text Width 50
Col4="部署名" Text Width 50
Col5="入社年" Text Width 50
Col6="今期目標" Single
Col7="今期実績" Single
Col8="達成率" Text Width 50
--------------------------------------------------- この部分は不要
上記のようにメモ帳に書いてファイル名を SCHEMA.INI としてプログラムと同じフォルダーに保存するだけです。


書き方としては

[ファイル名]
 テキストファイル名を入れる、複数のファイルが存在する場合続けて個々のテーブルの定義を行なう。

ColNameHeader
 一列目を列名として使うかどうか
 True とすると、一列目に書き込まれているデータを列名として用いる。

Format
 固定長フォーマットか、区切り記号付きフォーマットかを示す
  [CSV形式 Format=CSVDelimited] [TAB区切り Format=TabDelimited]  [固定長 Format=FixedLength]
  [スペース区切り Format=Delimited(半角スペース)] [任意の区切り文字 Format=Delimited(任意の文字)]

MaxScanRows
 列のデータ型を調べる時に調べる行数を指定する
 0 を指定した場合は、全ての行を検索します。 (デフォルトは8)

CharacterSet
 文字列のコード体系を示す
 OEM または、ANSI を用います。通常は、OEM でよいです。

Col1, Col2, Col3 ...........
 個々のフィールドの属性を指定する。以下の書式で指定します。
 Col1=A Text Width 50
  Col1 の1は、何列目かを示します。
  A には、フィールド名を入れます。上記のようにABCでも動作します。
  Text には、データ型を入れます。
  Width は、列幅を指定します(固定長のときのみ有効)。

type に指定できる値は以下の通りです。

 Bit型        : Bit
 バイト型       : Byte
 整数型        : Short
 長整数型       : Long
 通貨型        : Currency
 単精度浮動小数点数型 : Single
 倍精度浮動小数点数型 : Double
 日付/時刻型     : DateTime
 テキスト型      : Text
 メモ型        : Memo


Schema.ini ファイルは、テキスト(データファイル)ファイルと同じフォルダーに保存する必要があります。
入れておけば、VB上から特別な動作をしなくても自動的に読み込まれます。

1つの Schema.ini ファイル内に複数の異なったファイル名で型指定を書いておいて色々なファイルに対応する事もできます。

尚、上記以外の設定も出来るようです。詳しくは WebやMSDNで Schema.ini で検索して調べて下さい。

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


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


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


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
フレキシブルグリッド (MSFlexGrid) コントロール CSVファイル xls ファイル エクセルファイル入出力
階層フレキシブルグリッド (MSHFlexGrid) コントロール ADO ActiveX Data Objects Microsoft Hierarchical FlexGrid MSHFlexGrid コントロール
エクセルファイルを表示 CSV ファイルを表示 スキーマファイル Microsoft OLE DB Provider for Microsoft Jet

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