5.MSFlexGrid/MSHFlexGridへのデータ表示設定色々 |
下記プログラムコードに関する補足・注意事項 動作確認: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 上記実行結果 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 上記実行結果 |
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 が試せるようになっております。(データもここのを使用して) |
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万行のデータで) データ件数が、少ない場合は、上記のように個別に書式設定すれば、思い通りの表示ができますが、件数が多いと時間がかかったりします。 そのような場合は、元のデータを全て文字列で作成しておくと表示的には簡単で早く処理ができます。 |
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)について |
|
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 |