テキストボックスへの複数行のエントリの入力を無効にする方法はありますか(つまり、ユーザーがctrl-enterを実行して改行を取得できないようにしたい)?
7 に答える
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
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(長さゼロの文字列の場合)の使用に注意してください。
検証ルールを使用すると、ユーザーに醜いエラーメッセージが表示されますが、問題を修正するためのツールはほとんど提供されません。AfterUpdateのアプローチは、ユーザーにとってはるかにクリーンで簡単なようです。
私が以前に行った方法 (最後に Access で作業したのは 1997 年頃だったので、私の記憶はそれほど熱くありません) は、キーアップ イベントを発生させて VBA 関数を実行することでした。これは、最新の Web フォーム アプリケーションで AJAX の提案テキスト ボックスを使用して行う方法と同様の方法ですが、フォーム オブジェクト全体で onMouseMove などの頻繁に発生する傾向がある他のイベントが 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
画面のちらつきは問題になることはありません。これらは処理されるイベントであり、一定のポーリングではありません (さらにスコープを制限するコントロールごとです)。すべてのテキスト エディターはキーストロークごとに何らかのコードを実行しているため、無効な引数のように思えます。
ありがとう
それについて完全に確信しているわけではありませんが、コンテンツをレンダリングするときに改行を削除できるはずです。または、vbscriptを実行してクリアすることもできます。必要なのは、chr(13)またはvbCrLfを確認することだけです。
イベントに干渉させたくない場合は、テキスト ボックスの Validation Rule プロパティを次のように設定できます。
NOT LIKE "*"+Chr(10)+"*" OR "*"+Chr(13)+"*"
検証テキストを設定して、Access がエラー ボックスを表示する理由を具体的に説明することもできます。