質問
テキスト ボックスへの複数行のエントリの入力を無効にする方法はありますか (つまり、ユーザーが改行を取得するために Ctrl-Enter を実行できないようにしたい)
解決
KeyPressイベントを利用して行うことができました。コード例は次のとおりです。
Private Sub SingleLineTextBox_ KeyPress(ByRef KeyAscii As Integer)
If KeyAscii = 10 _
or KeyAscii = 13 Then
'10 -> Ctrl-Enter. AKA ^J or ctrl-j
'13 -> Enter. AKA ^M or ctrl-m
KeyAscii = 0 'clear the the KeyPress
End If
End Sub
他のヒント
以前に行った方法 (最後に Access で作業したのは 97 年頃だったので、記憶がそれほど鮮明ではありません) は、キーアップ イベントを発生させて VBA 関数を実行することでした。これは、最新の Web フォーム アプリケーションで AJAX 提案テキスト ボックスを使用する方法と似ていますが、Access フォームに、フォーム オブジェクト全体に対する onMouseMove など、頻繁に発生する傾向にある他のイベントがある場合は、つまずいてしまう可能性があることを思い出します。
KeyPress イベントを使用すると、ユーザーが入力するたびにコードが起動されることになります。これにより、画面のちらつきやその他の問題が発生する可能性があります (OnChange イベントも同様です)。
CrLf を削除するには単一のイベントを使用する必要があり、正しいイベントは AfterUpdate であると思われます。次のようにするだけです。
If InStr(Me!MyMemoControl, vbCrLf) Then
Me!MyMemoControl = Replace(Me!MyMemoControl, vbCrLf, vbNullString)
End If
Access のグローバル定数、vbCrLf (Chr(10) および Chr(13) 用) と vbNullString (長さ 0 の文字列用) の使用に注意してください。
検証ルールを使用すると、ユーザーに見苦しいエラー メッセージが表示されますが、問題を修正するためのツールはほとんど提供されません。AfterUpdate のアプローチは、ユーザーにとってはるかにクリーンで簡単であるように私には思えます。
それについては完全にはわかりませんが、コンテンツをレンダリングするときに改行を削除したり、vbscript を実行して改行を消去したりできるはずです。chr(13) または vbCrLf を確認するだけで十分です。
イベントの干渉を望まない場合は、テキスト ボックスの検証ルール プロパティを次のように設定できます。
NOT LIKE "*"+Chr(10)+"*" OR "*"+Chr(13)+"*"
また、Access がエラー ボックスを表示する理由を具体的に説明するための検証テキストを設定することもできます。
イアンとBIBDに感謝します。あなたの回答に基づいて再利用可能なパブリックサブを作成しました。
Public Sub PreventNewlines(ByRef KeyAscii As Integer)
If KeyAscii = 10 Or KeyAscii = 13 Then KeyAscii = 0
End Sub
Private Sub textbox_KeyPress(KeyAscii As Integer)
Call PreventNewlines(KeyAscii)
End Sub
これらは継続的なポーリングではなく処理されるイベントであるため、画面のちらつきが問題になることはありません (また、範囲をさらに制限する制御ごとに行われます)。すべてのテキストエディタはキーストロークごとに何らかのコードを実行しているため、私には無効な引数のように思えます。
ありがとう