お世話になります。よろしくお願い致します。
MSFlexGridとテキストボックスを組み合わせて、以下の様に設定しました。
テキストボックスは、日本語入力を完全とするため、
セルを離れる一瞬を除いて、常時表示しています。
(入力時以外は、表示しないとすると、日本語入力時に
変換前のひらがなが見えないなどの不具合があります。ので)
そうした場合に
複数セルを選択することが、フォーカスがテキストボックスにあるために
以下のように難しくなってしまいます。
1)マウスで複数セルを選択する場合
セルの先頭にテキストボックスがあると、選択できない。
(テキストボックスが無いところだと、出来ますが)
2)方向キー+Shiftキーで、セルの複数選択が出来ない
1)の場合、テキストボックスが選択したいセルの先頭にある場合でも
セルを選択出来ないでしょうか。
また、2)の場合のように、キー操作でも選択できないでしょうか。
よろしくお願い致します。
Option Explicit
Private Sub Form_Load()
Me.Show
With MSFlexGrid1
.Row = 1
.Col = 1
.RowSel = 1
.ColSel = 1
End With
MSFlexGrid1_EnterCell
End Sub
Private Sub MSFlexGrid1_EnterCell()
With Text_Edit
.Text = ""
.Visible = False
.Top = MSFlexGrid1.Top + MSFlexGrid1.CellTop
.Left = MSFlexGrid1.Left + MSFlexGrid1.CellLeft
.Height = MSFlexGrid1.CellHeight
.Width = MSFlexGrid1.CellWidth
.Text = MSFlexGrid1.Text
.Visible = True
.SetFocus
End With
End Sub
Private Sub MSFlexGrid1_LeaveCell()
MSFlexGrid1.Text = Text_Edit.Text
End Sub
Private Sub MSFlexGrid1_Scroll()
Text_Edit.Visible = False
End Sub
Private Sub Text_Edit_KeyDown(KeyCode As Integer, Shift As Integer)
Dim dRow As Long
Dim dCol As Long
If KeyCode = vbKeyReturn Or KeyCode = vbKeyDown Then
dRow = MSFlexGrid1.Row + 1
If dRow < MSFlexGrid1.Rows Then
MSFlexGrid1.Row = dRow
End If
ElseIf KeyCode = vbKeyUp Then
dRow = MSFlexGrid1.Row - 1
If dRow > 0 Then
MSFlexGrid1.Row = dRow
End If
ElseIf KeyCode = vbKeyRight Then
dCol = MSFlexGrid1.Col + 1
If dCol < MSFlexGrid1.Cols Then
MSFlexGrid1.Col = dCol
End If
ElseIf KeyCode = vbKeyLeft Then
dCol = MSFlexGrid1.Col - 1
If dCol > 0 Then
MSFlexGrid1.Col = dCol
End If
End If
End Sub
エクセルシートの動作を参考にされてはいかがでしょう?
大体以下のような動作です。これならFlexGridとTextBoxで実現できそうです
1)セルにフォーカスが移った時はテキストボックスは表示されない
2)セルがダブルクリックされるかキーが押されたときにテキストボックスを表示する。
3)セルの内容が確定したときにテキストボックスを消す
エクセルでもセル上で文字を編集中にはアクティブセルから範囲選択のためのドラッグは
できないようです。
Maxさま、書き込みありがとうございます。
FlexGridとTextBoxを組み合わせて、エクセルのようにセルに直接入力させる場合
一般的には、セルに入力するときだけTextBoxを表示させているようですね。
数種の参考書や、ネット上で公開されているものでは、そのようです。
これまでは、数値入力だけでしたので、その方法で行ってきましたが
その方法ではどうも、日本語入力をする場合に、どの方法もうまく行かないのです。
日本語入力する場合に、最初のセルではうまくいくのですが
その次のセルでは、漢字変換前のひらがなが見えない
などです。
ですので、
テキストボックスの表示は、常時ということにしました。
これならば、日本語入力は完璧に行えます。
どうでしょうか。
テキストボックスは入力時のみ表示するという方法で
日本語入力もうまくいくという方法があればいいのですが。
もし、いい方法があれば教えて下さい。
よろしくお願い致します。
>エクセルのようにセルに直接入力させる場合
>一般的には、セルに入力するときだけTextBoxを表示させているようですね。
参考になるかわかりませんが、自分は次のようにしています。
(参考書を見ながら作っただけなのですが…)
とりあえず全角文字もうまく入力できています。
1.グリッドはピクチャボックスの中に配置する。
グリッドにIMEModeがないため、その対策として行っている。
そして、グリッドのRowColChangeイベントに、英数列にカーソルが来たら
ピクチャボックスのIMEModeを2に、日本語列に来たら4にする。
ピクチャにフォーカスが来たらグリッドにフォーカスを移るようにする。
2.セル入力用テキストボックスを表示するイベントを作成する。
(「Private Sub FGrid_Edit(KeyAscii As Integer)」という名にしています)
押されたKeyAsciiを受け取り、Trim(Chr(KeyAscii))をテキストボックスに表示し、
テキストボックスを所定の場所に移動・ぴったり表示させる、というものです。
ちなみにテキストボックスのIMEModeはピクチャボックスのIMEModeにします。
3.半角英数を入力する場合、グリッドのKeyPressイベントで捕まえる。
KeyPressイベントには全角文字入力の場合はキャンセルする文を書く。
半角英数なら
FGrid_Edit KeyAscii
全角なら Exit Sub とします。
4.全角文字を入力する際は、グリッドのKeyDownイベントで捕まえる。
KeyCode > 127の場合だけ動くようにし、それ以外はExit Sub
全角文字の際は
FGrid_Edit vbKeySpace
とし、空白文字を送ります。
全角文字を入力し、テキストボックスを表示し、フォーカスを移した時点で
変換前の文字がテキストボックスに表示されます。
入力が終わって確定させた段階でテキストボックスの表示を消します。
今のところこれでうまくいっています。
テキストボックスを常時表示させるとグリッドのスクロールがうまくいかない
場合があるので、意地で消しています。
すみません。文章が下手でわかりづらいかも…
ツイート | ![]() |