データを入力する |
MSFlexGridのサンプル(その1) (024) | |
はじめに このサンプルは各機能の動作確認用のサンプルです。実際にプログラムとして使用する場合は、無駄な部分等を削除し、又使用状況にあったエラーチェックを付けて下さい 今回のサンプルは成績表を作りながら MSFlexGrid でいろんな事を試して見たいと思います。 初期のサンプルは、開設当初に作成したもので、恥ずかしい部分が多く削除してしまおうと思ったの ですが、MSFlexGrid のサンプルは、参考書でもあまり扱っていないので残しておきますが、解説 部分は、重要な部分のみとさせて頂きます。 動作確認は、VB6.0(SP5) WindowsXP で行っております。 (その5)まで作成すると、完成後は 下記のようになります。 注意事項 1.MSFlexGridは表示専用のコントロールです。ファイルの入出力操作やExcelの操作知識が ないと結構難しいので、その辺の勉強をされてからご使用下さい。 2.メニューバーの[プロジェクト][コンポーネント]でMicrosoft FlexGrid Control *.* にチェックを 入れてフォームに上図のように配置して下さい。TextBoxコントロールも忘れずに! 3.データはテキストファイルを読込、表示、保管する(No.2)を参考に準備しておいて下さい。 4.コードは出来る限りコピー・アンド・ペーストはやめて手打ちで動作確認しながら進めて下さい。 5.解らない部分がありましたらその部分を選択反転表示させ[F1]キーを押して確認して下さい。 6.こちらが理解できてからセルに直接データを入力する(エクセルのように)こちらのサンプルを 試すようにして下さい。 7.掲示板に質問される場合はこれらの注意事項をお守りの上ご質問願います。 8.その他小技集内のカレントセルの取得設定他行・列管理 や MSFlexGridの主要プロパティ一覧表 は結構参考になるかと思いますの必ずお読み下さい。 |
|
初期設定の部分 (024) | |
Option Explicit Private CurrentRowNo As Integer 'アクティブセルの行を取得 Private Sub Form_Load() Dim lngCountI As Long 'ループ用カウンター Form1.Move 0, 0, 8640, 4630 'MSFlexGrid の初期設定 With MSFlexGrid1 .Move 150, 150, 8170, 2850 .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 Text1.Text = "" End Sub Private Sub Form_Activate() Text1.SetFocus End Sub |
|
セルへのデータ入力 (024) | |
セルには直接データを入力できませんので、テキストボックス等に入力したデータをカレントセルに転送します。 まず、テキストボックスにフォーカスを移動します。 Private Sub MSFlexGrid1_GotFocus()
'カレントセルの内容をテキストボックスに転送 With MSFlexGrid1 CurrentRowNo = .Row Text1.SetFocus Text1.Text = .Text End With End Sub 次はテキストボックスの内容をセルに転送するようにします。 Private Sub Text1_Change() With MSFlexGrid1 'テキストボックスに数値しか入力出来ないよう制限する If .Col <> 2 Then Call fTextBoxNumberCheck(Text1) End If 'テキストボックスの内容をカレントセルに転送 .Text = Text1.Text End With End Sub |
|
Enterキーで次の入力セルに進ませる (024) | |
データ入力する時にいちいちセルをクリックしてデータを入力していたのでは、入力に時間がかかります。従ってエクセル等のように入力後Enterキーを押すと次の入力位置に移動するように設定します。 各科目の点数が入力できたら、合計と平均点を計算して表示し、次の行の先頭に移動します最後の行の入力がすめば、最初の行に移動します。 Private Sub Text1_KeyPress(KeyAscii As Integer) 'セルのフォーカス移動とスクロール及び合計等の計算 Dim sngSum As Single Dim sngAverage As Single Dim lngCountI As Long 'Enterキーによるフォーカス移動 With MSFlexGrid1 If KeyAscii = vbKeyReturn Then KeyAscii = 0 .Text = Text1.Text If .Col = 5 Then For lngCountI = 3 To 5 .Col = lngCountI 'nullが入力されていたらエラーになるので If Len(Trim$(.Text)) = 0 Then .Text = 0 End If '合計を求める sngSum = sngSum + CSng(.Text) Next lngCountI .Col = 6 .Text = sngSum '合計を表示 .Col = 7 sngAverage = sngSum / 3 '平均値を求める .Text = Format$(sngAverage, "##0.0") '平均値を表示 '次の行の先頭へ折り返す .Col = 0 '7行目以降は行をスクロールする If .Row >= 7 Then '1行のスクロール .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 これでテストして見て下さい。Enterキーを押すとうまくフォーカスが移動しCol = 5になると合計と平均点が計算され、結果が表示されるはずです。 8行目を入力し終わると9行目が表示するようにする必要があります。それはMSFlexGrid1.TopRowを設定することで実現できます。 |
|
方向キー(↑↓→←)でもセルを移動 (024) | |
方向キーでカレントセルを移動するようにするには、Text1_KeyDownイベントを使用します。 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 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 |
|
数字しか入力できないように制限する関数 Private Function fTextBoxNumberCheck(ByVal MyTextBox As TextBox) As Boolean 'テキストボックスを監視して数字以外が入力されたら削除する関数 Dim i As Long '戻り値を初期値に設定 fTextBoxNumberCheck = False '入力文字を1文字づつチェック For i = 1 To Len(MyTextBox) '最初の1文字目以外に−が入っていたら削除 If Mid$(MyTextBox, i, 1) = Chr$(45) And i <> 1 Then fTextBoxNumberCheck = True '- を文字列から抜き取りテキストボックスに代入 MyTextBox = Mid$(MyTextBox, 1, i - 1) & _ Mid$(MyTextBox, i + 1, Len(MyTextBox) - i) Beep 'カーソル位置をテキストの末尾へ MyTextBox.SelStart = Len(MyTextBox.Text) 'フォーカスを元のテキストボックスに戻す MyTextBox.SetFocus Exit Function End If '0〜9 - . 及び Enter Tab 等の制御文字以外を削除 If Mid$(MyTextBox, i, 1) >= Chr$(32) And Mid$(MyTextBox, i, 1) _ < Chr$(45) Or Mid$(MyTextBox, i, 1) _ > Chr$(57) Or Mid$(MyTextBox, i, 1) = Chr$(47) Then '文字が含まれていたら True に設定 fTextBoxNumberCheck = True '以下上記同様の処理 MyTextBox = Mid$(MyTextBox, 1, i - 1) & _ Mid$(MyTextBox, i + 1, Len(MyTextBox) - i) Beep MyTextBox.SelStart = Len(MyTextBox.Text) MyTextBox.SetFocus Exit Function End If Next i End Function |
|
お断り 上記サンプルのスクロールは行・列数を固定したやり方になっています。 この部分のコードは(その2)以降も同様です。 |