セルに直接データを入力する
                                                       玄関へお回り下さい。
指定セルの内容を直接編集するように擬似的に実施する方法      (034)

1.アクティブセルの上にテキストボックスをセルと同じ大きさで表示
2.Enterキーによるセルの移動(↓ → 選択可能)
3.タブキーによる移動(← →)

  以上の設定でエクセルでのセル内編集とほぼ同じ動きをするように設定しています。
  後はお好みで機能を改良して下さい。
1.FormにMSFlexGridとテキストボックスを3個下記のように貼り付けて下さい

 
   サイズ及び表示位置は下記参照願います。

2.フォームの宣言セクションに

Option Explicit  
'SampleNo=034 WindowsXP VB6.0(SP5) 2002.05.01
Private NextCell    As Integer  'Enter の後の移動方向の選択


3.フォームロードイベントに記入

Private Sub Form_Load()
  Dim lngCountI As Long      'ループ用カウンター
  Form1.Move 0, 0, 8640, 4000

  '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
  With Text1
    .BackColor = &H80FFFF    '動きが分かりやすいように
    .Text = ""
    .Visible = False
  End With
End Sub


Private Sub MSFGEdit(MSFlexGrid As Control, _
              Edit As Control, KeyAscii As Integer)
'MSFlexGrid コントロールからテキストボックスにフォーカスを移動
  '入力された文字を使います。
  Select Case KeyAscii
    ' 空白は、現在のテキストの編集を示します。
    Case 0 To vbKeySpace
      Edit = MSFlexGrid
      Edit.SelStart = 1000

    'そのほかは、現在のテキストを置き換えます。
    Case Else
      Edit = Chr$(KeyAscii)
      Edit.SelStart = 1
  End Select

  'セルの位置にテキストボックスを表示
  With MSFlexGrid
    Edit.Move .Left + .CellLeft, .Top + .CellTop, .CellWidth, .CellHeight
  End With
  Edit.Visible = True
  ' 実行します。
  Edit.SetFocus
End Sub


Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer)
'テキストボックスの編集機能のルーチンへ
  Call MSFGEdit(MSFlexGrid1, Text1, KeyAscii)
End Sub


Private Sub MSFlexGrid1_DblClick()
'テキストボックスの編集機能のルーチンへ
  Call MSFGEdit(MSFlexGrid1, Text1, vbKeySpace)  '空白を代入します。
End Sub

'=============================================================
'ここまでで一応入力テキストボックスに入力が可能
'=============================================================

Private Sub Text1_KeyPress(KeyAscii As Integer)
'改行文字を削除し、警告音が発生しないようにします。
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
  End If
End Sub


Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'入力キーの判定移動処理へ
  Call EditKeyCode(MSFlexGrid1, Text1, KeyCode)
End Sub


Private Sub EditKeyCode(MSFlexGrid As Control, _
               Edit As Control, KeyCode As Integer)
'フォーカスを移動するルーチン
  With MSFlexGrid
    ' 標準の編集コントロールの処理です。
    Select Case KeyCode
      Case vbKeyEscape  'Esc キーは、非表示にしてフォーカスを
                'MSFlexGrid に戻します。
        Edit.Visible = False
        .SetFocus
      Case vbKeyReturn, vbKeyTab ' EnterとTabによるフォーカス移動。
        '↓移動を選択した場合
        If NextCell = 1 Then
          .SetFocus
          DoEvents
          If .Row < .Rows - 1 Then
            '1つ下に移動
            .Row = .Row + 1
          End If
        End If
        If NextCell = 0 Then '→移動を選択の場合(デフォルト)
          .SetFocus
          DoEvents
          '右端に行った場合の折り返し処理
          If .Col = .Cols - 1 And .Row < .Rows - 1 Then
            .Row = .Row + 1
            .Col = 0
          End If
          '1つ右に移動
          If .Col < .Cols - 1 Then
            .Col = .Col + 1
          End If
        End If

      Case vbKeyUp   ' ↑キー。
        .SetFocus
        DoEvents
        If .Row > .FixedRows Then
          .Row = .Row - 1
        End If

      Case vbKeyDown  ' ↓キー。
        .SetFocus
        DoEvents
        If .Row < .Rows - 1 Then
          .Row = .Row + 1
        End If
    End Select
  End With
End Sub


Private Sub MSFlexGrid1_GotFocus()
  If Text1.Visible = False Then Exit Sub
  'セルからフォーカスが移動した時にテキストボックスの
  'データをセルにコピーしテキストボックスを非表示に設定
  MSFlexGrid1 = Text1
  Text1.Visible = False
End Sub


Private Sub MSFlexGrid1_LeaveCell()
  If Text1.Visible = False Then Exit Sub
  'セルからフォーカスが移動した時にテキストボックスの
  'データをセルにコピーしテキストボックスを非表示に設定
  MSFlexGrid1 = Text1
  Text1.Visible = False
End Sub

'=============================================================
'これで入力・編集・フォーカス移動が可能
'=============================================================

Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
'漢字キーが押された状態での入力が出来ないので
  If KeyCode > 127 Or KeyCode = vbKeyF2 Then '漢字及び[F2]キーの場合
    Call MSFGEdit(MSFlexGrid1, Text1, vbKeySpace)  '空白を代入します。
  End If
End Sub



6.↓移動と→移動のメニューを作成する

Private Sub mnuDown_Click()
'Enter の後下方向に移動(Excelと同様の操作に)
  NextCell = 1
End Sub

Private Sub mnuRight_Click()
'Enter の後右方向に移動
  NextCell = 0
End Sub


7.タブキーによるフォーカス移動の設定 (034)
  ダミーのテキストボックスを見えない所に配置する

'タブキーでの移動が出来ないので 別途ダミーのテキストボックスを2個
'見えない所に配置しておいて下さい。
Private Sub Text2_GotFocus()
  'タブキーによる右移動
  'テキストボックスは下端か右端の見えない所に配置
  '動きが逆の場合TabIndexの番号を入れ替えて下さい
  With MSFlexGrid1
    If .Col < .Cols - 1 Then
      .Col = .Col + 1
    ElseIf .Row < .Rows - 1 Then
      .Row = .Row + 1
      .Col = 1
    End If
    DoEvents
    .SetFocus
  End With
End Sub


Private Sub Text3_GotFocus()
  'シフトキー+タブキーによる左移動
  'テキストボックスは下端か右端の見えない所に配置
  '配置場所は動きに関係しない
  With MSFlexGrid1
    If .Col > 1 Then
      .Col = .Col - 1
    ElseIf .Row > 1 Then
      .Row = .Row - 1
      .Col = .Cols - 1
    End If
    DoEvents
    .SetFocus
  End With
End Sub


フォームに色々コントロールが貼り付けてある場合はうまく動きません。別途APIを使った方法を
試して下さい。




2002/05/01