スキップしてメイン コンテンツに移動

ACCESSで文字数を規定する書式設定をしてあるテキストボックスをクリックしたときのキャレット位置の操作

タイトルだけ観ると、随分と長い複雑なもののように見えるけど、たいしたことない。

ACCESSのあるフォームに、こういう書式設定がしてある。

書式:"00000"
文字配置:左

この時、テキストボックスの表示幅が5桁を表示するぶんより十分余裕があったとき、その余裕部分をクリックすると、書式で規定した5文字目ラストにキャレットが置かれてしまう。

この時そのまま数字を入力してしまうと、書式エラーで引っかかる。それがユーザーが面倒だ、キャレットを左端、つまり先頭において欲しい、という。

この問題はキーボード操作ではF2を押すとキャレットは先頭に移動するのだが…

ユーザーが複数いて、その人全部にそれぞれ同じように説明するのも面倒なんで、問題のテキストボックスにクリックイベントが発生したら、F2をSendKeysで送るようにした。ってはなしで。

SendKyes "{F2}", True

コメント

このブログの人気の投稿

対処例:Accessフォームでチェックボックスが思うように設定できない

開発プラットフォームとしてAcccessという事は多い。 そして何気に不思議な動作をする事が多いのも事実。 今回であったのは、フォームに置いたチェックボックスが、フォームを開いた際に思ったように振舞ってくれない、というもの。 このチェックボックスは規定値=FALSEで設定してあって、人の操作以外でこのチェックボックスの値は操作していない。 そしてこのチェックボックスを置いたフォームを開くと… 問題のチェックボックス、チェックがついた状態で描画される!!! こまったチャンである。 時折は意図したとおりにOFFの状態で開く場合もあるものの、まれ。 ここはしっかりユーザーの操作(チェックボックスをONにする)に基づき、関連の項目を入力してもらう、という動作をさせたいし、また他へのI/F項目でもあって、しっかりさせたい。ちなみに、TripleState プロパティは Falseに設定してある。 簡単にググッてみたものの、ちょっと同様の事例や対処は見つからず。いくつか試したが、うまく行かない。 で、結論から書くと、こういう対処をした。 Form_OPENイベントの際に、問題のチェックボックスに以下の操作を実行 ・問題のチェックボックスにフォーカス設定 ・問題のチェックボックスに対して、SendKeys でスペース(" ")一文字投げつけ ・問題のチェックボックスの Value 値を確認。True の場合、もう一回SendKey でスペース(" ")一文字投げつけ 発想としては、チェックボックスがカレントな状態のとき、スペースキーで値が操作できる事を思い出し、ぶつけてみた。 でも、実は最初はうまく行かず。 はて? で、 SendKeys のリファレンスを改めて眺めて、 Wait オプションがある事を思い出した。 解説するまでもないが、これが True の場合、そのキーが処理されるまでVBAは次の実行をまつ。デフォルトでは False で実行される。なので、Accessが、なげつけられた?(いや、自分で自分に投げているわけだから…)スペースキーを受け取る前にVBAが進んでるか?と思い、以下に書き換えてやってみた。 SendKeys " ", True ...

VBS で引数を受け取るサンプル

WScript.Arguments に引数要素が配列で格納されているので、これを取り出す。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments strPrm0 = oParam(0) Wscript.echo strPrm0 =========================================== これを引数あり、引数なしでそれぞれ実行してみる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >cscript.exe test.vbs a a >cscript.exe test.vbs test.vbs(9, 1) Microsoft VBScript 実行時エラー: インデックスが有効範囲にありません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strPrm0 = oParam(0) の場所で怒られている。 引数なしで起動した場合には相応の対応をしたい。 そこで、上記を書き換える。 WScript.Arguments のCount ポロパティの値をチェックして動作を切り分ける方法。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments ...

ACCESSで動的にリンクテーブルの元ファイルを変更する方法

今回の事案は初めてのケースだった。 ある事業で、顧客に対してある種の設計サービスを行っている。 住宅関連なのだが、ハウスメーカーが、こういう設計の住宅、といった図面をよこしてきて、その図面からうちの商材をパーツごとに必要な数を拾い出しして見積もりを行い、販売する、というものだ。 住宅、という事でまあ『物件』と称され、上記のサービスを実現しているのが『物件拾い出しシステム』と呼ばれている。 で、この『物件拾い出しシステム』、全物件のヘッダー情報はファイルサーバー上の.mdbファイルに保管されているのだが、どの商材をいくつ、あの商材をいくつ、という『拾い出し』した結果の明細情報が、物件の管理ナンバーをファイル名とした別の.mdbファイルに格納されている、という構造なんだ。 今回受けたオーダーは、この『物件拾い出しシステム』の情報を使って、SAPScriptで受注伝票を突っ込む、というもの。開発プラットフォームはAccess。 で、タイトルのとおりの事をしないといけない破目になった。 各物件別の明細情報はファイル名以外はテーブル構造やテーブル名は共通。ファイル名は先に書いたとおり物件管理番号で、配置されるディレクトリもルールで決まっている。 そこで、ヘッダーファイルから管理番号を選択すると、明細情報を呼び出すためにリンクテーブルの接続先ファイルを各明細別mdbファイルに切り替える、という処理をした。 具体的にはこう。 =========================================== Const conmyDbPath = "\\サーバー名\物件データ" '明細ファイルへのパス生成文字列 Const conmyTbName = "T_拾い数量合算"          '明細情報へのリンクテーブル Dim dbsSys   As DAO.Database 'データベースオブジェクト Dim myDb As DAO.Database '明細用データベース Dim meisaiTb As DAO.TableDef 'テーブル(T_拾い数量合算) Dim pKanriNo As String '物件管理ナンバー pKa...