Microsoft Access 掲示板

テキストボックスでのEnterキーでの改行について

2 コメント
views
4 フォロー

宜しくお願い致します。

データ型が「長いテキスト」の「仕様書」テキストボックスに入力した際、
Enterキーを押すと改行になるようにしたいと思っています。
そこで、

Private Sub 仕様書_KeyDown(KeyCode As Integer, Shift As Integer)

    If KeyCode = vbKeyReturn Or KeyCode = vbKeySeparator Then
    
        SendKeys "^~"
        
    End If

End Sub

とイベントを作成したところ、改行がずっと続いてしまう変な現象になってしまいました。

どのようにしたら、Enterキーで改行になるのでしょうか?

あん
作成: 2023/06/15 (木) 15:41:28
通報 ...
1

キークリック(KeyDown)イベント内で、Enterキー押下をSendKeysしたら、それで再びキークリックイベントが発生して、と連鎖して繰り返されることになるのでそうなりますね。

下記のようにフラグを利用して、イベント連鎖を防止して、キー入力をキャンセルしておくといいでしょう。

Private InkeyEvent As Boolean

Private Sub 仕様書_KeyDown(KeyCode As Integer, Shift As Integer)
    If InkeyEvent Then Exit Sub 'イベント連鎖防止
    InkeyEvent = True
    If KeyCode = vbKeyReturn Or KeyCode = vbKeySeparator Then
        KeyCode = 0 'キー入力をなかっことに
        SendKeys "^~" 'Ctrl + Enter
    End If
    InkeyEvent = False
End Sub

あるいは、下記のようにイベントプロシージャの付け外ししてもいいでしょう。

Private Sub 仕様書_KeyDown(KeyCode As Integer, Shift As Integer)
    Me.仕様書.OnKeyDown = "" 'イベントプロシージャの割り当てを解除
    If KeyCode = vbKeyReturn Or KeyCode = vbKeySeparator Then
        KeyCode = 0 'キー入力をなかっことに
        SendKeys "^~" 'Ctrl + Enter
    End If
    Me.仕様書.OnKeyDown = "[イベント プロシージャ]" 'イベントプロシージャの割り当て
End Sub

ただ、こんなことをしなくても、
テキストボックスの「Enterキー入力時動作」プロパティを「フィールドに行を追加」にしておけば済みますけどね。

2
あん 2023/06/16 (金) 10:08:43 927ea@06086

hatena様

毎度回答ありがとうございます。助かります。

Sendkeysでまたイベントが発生してしまっていたとは思いませんでした。

また、イベントの解除や割り当てができるなんて知りませんでした。
また勉強になりました。
Me.仕様書.OnKeyDown = ""
Me.仕様書.OnKeyDown = "[イベント プロシージャ]"

テキストボックスの「Enterキー入力時動作」プロパティを「フィールドに行を追加」で、解決なんですね。
今回はこれで対応しようと思います。
(イベントプロシージャ作らなくともよかったんですね。)

ありがとうございました。