セルに直接データを入力する |
指定セルの内容を直接編集するように擬似的に実施する方法 (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