MSFlexGridで複数セルの選択をするには?


聖二  2004-08-04 19:14:24  No: 84928

お世話になります。よろしくお願い致します。

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


Max  2004-08-07 02:27:10  No: 84929

エクセルシートの動作を参考にされてはいかがでしょう?
大体以下のような動作です。これならFlexGridとTextBoxで実現できそうです

1)セルにフォーカスが移った時はテキストボックスは表示されない
2)セルがダブルクリックされるかキーが押されたときにテキストボックスを表示する。
3)セルの内容が確定したときにテキストボックスを消す

エクセルでもセル上で文字を編集中にはアクティブセルから範囲選択のためのドラッグは
できないようです。


聖二  2004-08-07 18:04:29  No: 84930

Maxさま、書き込みありがとうございます。

FlexGridとTextBoxを組み合わせて、エクセルのようにセルに直接入力させる場合
一般的には、セルに入力するときだけTextBoxを表示させているようですね。
数種の参考書や、ネット上で公開されているものでは、そのようです。

これまでは、数値入力だけでしたので、その方法で行ってきましたが
その方法ではどうも、日本語入力をする場合に、どの方法もうまく行かないのです。
日本語入力する場合に、最初のセルではうまくいくのですが
その次のセルでは、漢字変換前のひらがなが見えない
などです。

ですので、
テキストボックスの表示は、常時ということにしました。
これならば、日本語入力は完璧に行えます。

どうでしょうか。
テキストボックスは入力時のみ表示するという方法で
日本語入力もうまくいくという方法があればいいのですが。
もし、いい方法があれば教えて下さい。

よろしくお願い致します。


水無月  2004-08-23 19:49:16  No: 84931

>エクセルのようにセルに直接入力させる場合
>一般的には、セルに入力するときだけ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
  とし、空白文字を送ります。
全角文字を入力し、テキストボックスを表示し、フォーカスを移した時点で
変換前の文字がテキストボックスに表示されます。
入力が終わって確定させた段階でテキストボックスの表示を消します。
今のところこれでうまくいっています。

テキストボックスを常時表示させるとグリッドのスクロールがうまくいかない
場合があるので、意地で消しています。

すみません。文章が下手でわかりづらいかも…


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加