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

投稿

5月, 2018の投稿を表示しています

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

タイトルだけ観ると、随分と長い複雑なもののように見えるけど、たいしたことない。 ACCESSのあるフォームに、こういう書式設定がしてある。 書式:"00000" 文字配置:左 この時、テキストボックスの表示幅が5桁を表示するぶんより十分余裕があったとき、その余裕部分をクリックすると、書式で規定した5文字目ラストにキャレットが置かれてしまう。 この時そのまま数字を入力してしまうと、書式エラーで引っかかる。それがユーザーが面倒だ、キャレットを左端、つまり先頭において欲しい、という。 この問題はキーボード操作ではF2を押すとキャレットは先頭に移動するのだが… ユーザーが複数いて、その人全部にそれぞれ同じように説明するのも面倒なんで、問題のテキストボックスにクリックイベントが発生したら、F2をSendKeysで送るようにした。ってはなしで。 SendKyes "{F2}", True

アーリーバインディングとレイトバインディング

はじめに、と後から、というくらいの違いは知ってはいるけど。 改めてどう違うのか?を調べてみた。 書式の違いはこう(VBA) ・アーリーバインディングの例 Dim myApp as Excel.Application Set myApp = Application ・レイトバインディングの例 Dim myApp as Object Set myApp = Application もう一例 Dim myApp as Object Set myApp = CreateObject("Excel.Application") まあ、CreateObjectで書く事が多いよね。 でも、やっぱりアーリーバインディングで書く事には相応の違いがあるそうな。 一つは、たとえばメソッドの存在チェック。 アーリーバインディングでは、"myApp"内に当該メソッドが存在するかはコンパイル時にチェックされる。 一方レイトバインディングではプログラムが実際に実行されるまではチェックがされない。 つまり、動かしてみないと判らない、という事。 開発やテストの事を考えるとアーリーバインディングのほうがやっぱりいいんだろう。

AccessのDfirst関数 その条件式

前にAccessの Dsum 関数について書いた。 それと同類の、Dfirst 関数を今回使った。 Dfirst はレコードセットの最初のレコードの値を取る、というもの。 基本的な記述方法は Dsum も Dfirst も同じ。 関数名("項目名", "テーブル名 or クエリー名", "条件式") ※条件式は省略可 で、今回なんでわざわざ書いたか?というと、前回 Dsum では使用しなかった条件式を与えたから。これはちょっとメモっておきたかったので。 今回 Dfirst をこういう風につかった。 フォームのテキストボックスオブジェクトのコントロールソースに以下を既定 =DFirst("顧客CD","M_顧客マスタ","受注先CD= [p_jyutyusaki_cd] ") 内容としては、同一フォームにある「p_jyutyusaki_cd」というオブジェクトの値を”受注先CD”という、"M_顧客マスタ"テーブルのフィールドのセレクト条件にして、これまた同テーブルに既定されている”顧客CD”の最初の値を返す。 言ってしまえばこれだけなのだが、この『テキストボックスオブジェクトのコントロールソース』として書く際のパラメータ指定の書き方がMSのリファレンスにもあんまり書いてない。 結論から言えば、"受注先CD= [p_jyutyusaki_cd] "という標記になるのだが、最初はVBAでSQL文字列を書くようにテキストの変数をシングルクォートとアンパサントで囲うのか?とかいろいろ書いてみたのだが、通らない。関数の実行結果がエラーになるんだよね。 で、幾度か書き方を変えて試してたどり着いたのが"受注先CD= [p_jyutyusaki_cd] "という書き方でやっとエラーなく通った。 ただし、ここで書いている方法はあくまで、”オブジェクトのコントロールソース”として書くときに、同一フォーム上のオブジェクト値をパラメータにする、という限定された条件である事は改めて記しておく。 これをVBAで書くときなどは多分別の書き方になるはずだ。

Accessで環境変数を使う

今回のお題は、ディレクトリの特定の仕方について。 Accessで処理するファイルを、ある場所、具体的にはユーザープロファイルの”ダウンロード”フォルダからアプリのディレクトリに移動したい。 ただ、”ダウンロード”フォルダはログインしているユーザーによって絶対パスが変わってくる。それをどうするか? 今回の場合、ユーザーのリテラシーがそれほど高くなく、ネットからダウンロードされたファイルを、ユーザー自身がファイル選択ダイアログから選んで指示するのは避ける、という判断となった。 一応、ネットからダウンロードされるファイルの保存先はユーザー別の”ダウンロード”フォルダ、という事は保障される前提。 ダウンロードされるファイル名は名前付けルールにそって、識別子のお尻にタイムスタンプが付く。 ただ、Access側での処理のタイミングの問題で、同時に複数のダウンロードファイルを処理するケースも想定された。 個人的には、バッチファイルを同期でアクセスから実行して…、で良いんじゃない?と思った。 それなら環境変数でユーザープロファイルのパスが取れるから。 でも他からの判断でアクセス内で完結させる方法をとる事となった。 で、結局はWSHの ExpandEnvironmentStrings メソッドを使う事にした。 このメソッドは環境変数(%XXXX%)文字列をあたえるとそれの展開結果を返してくれる。 なんで、ExpandEnvironmentStrings("%userprofile%")とすると、ログインユーザーのユーザープロファイルパスが帰ってくる。 なお、これをAccessで使うには参照設定として「Windows Script Host Object Model」 を追加しないといけない。 また、オブジェクトを使うにはアーリーバインディングで書く必要がある事に注意。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>...