データを入力する
                                                         玄関へお回り下さい。
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)以降も同様です。 



2002/04/27