2022年10月20日木曜日

access vbaで最適化コマンドは開いていると実行できないので、起動パラメタで制御できるようにしてみた。確実に。

 access vbaでは、最適化コマンドはdbを開いていると実行できない。
 SendKeys "%(YC)"またはSendKeys "%(Y){TAB}{Enter}"で動かせるようだが、SendKeysはキー送信のため、不安定であり、うまく動かないことがある。
 確実に最適化を動かすために、起動パラメタを使うのがいい。是非、マネしてください。
起動パラメタは、c:¥Users¥username¥Documents¥abc.accdb /cmd "actParam1"というコマンドラインを叩くと、起動時にactParam1というパラメタをvbaで受け取ることができる。
一方、accessの設定で、閉じると自動的に最適化を行うようにしておく。
 以下のモジュールをvbaで書いて、AutoExecという名前のマクロを作成し、AutoStartProcプロシジャを開くように登録しておく。
AutoStartProcの中身は、こんな感じだ。

Public Function AutoStartProc()
  If InStr(Command,"actParam1")>0 then 
    Application.Quit  ’オプションの□ 閉じると最適化するにチェックを入れておく。この結果、最適化が走る。 
  ElseIf InStr(Command,"actParam2")>0 then
    [最適化後にやりたい処理]
    Docmd.XXXXX
    Docmd.YYYYY
    Aoplication.Quit
  End If
End Function
 これで、actParam1という起動パラメタの場合、accessを閉じる(Application.quit)ことで最適化が走るようになる仕掛けが完成する。
 そして、start /wait c:¥Users¥username¥Documents¥abc.accdb /cmd "actParam1"で起動すれば、最適化が動く。なお、/waitにより、必ずコマンドの完了を待つことができる。そして、これ(/wait)がとても大切になる。また、不要なオブジェクト、つまり、2GB超えの要因となりそうなテーブルを再作成するケースであれば、再作成の前にこのタイミングで、いったん全てのオブジェクトを一旦、削除して、最適化を走らせておくのがよろしいだろう。
 また、start /wait c:¥Users¥username¥Documents¥abc.accdb /cmd "actParam2"で起動すれば、actParam2のアクションを行うことができる。

2022年10月14日金曜日

accessでパラメタ付きのクエリーをvbaで操作するには、そのパラメタをフォームに変更するしかないのかもしれない。

accessでパラメタ付きのクエリーをvbaで操作するには、そのパラメタをフォームに変更するしかないのかもしれない。
つまり、vbaでパラメタに値を設定するのはできないのかもしれない。パラメタをフォームにすれば、vbaで値を設定するのは、簡単だ。

2022年9月21日水曜日

EXCEL vbaでラジオボタン(オプションボタン)を操る。

EXCEL vbaでラジオボタン(オプションボタン)を操る。 menuシートのActiveXで作成した ◉ OptionButton1 ボタンの状態を判定するコードは、こんな感じだ。

  If Worksheets("menu").OptionButton1.Value = False then exit sub
menuシートのフォーム・コントロール(FormControl)で作成した ◉ OptionButton1 ボタンの状態を判定するコードは、以下の通りだ。
  If Worksheets("menu").OptionButtons("Option Button 1").Value = 1 then exit sub
ActiveXの場合、ラジオボタンのオン・オフは、trueかfalseで判定する。
一方、フォーム・コントロールの場合、オプションボタン(ラジオボタン)のオンは、値が1かで判定する。オフは、なんと、値が-4142かで判定する。面白すぎるので、注意が必要だ。似ているようで違うのだ。罠にハマらないようにしたい。以上のことは、ぐぐった末にコードを動かして、わかったのだけれど、マイクロソフトのどこかのドキュメントにはあるんだろうね。どこかは知らんけど。

2022年9月14日水曜日

vbaのdirが動かないと思ったら¥が漏れていたことに気がつくまでにかなり時間がかかった話。myPathのあとには必ず¥がいるんだな。

vbaで以下のコードを書いた。

Dir myPath As String
Dim fileName As String
myPath = thisworkbook.path
fileName = "ABC.xlsx"
if dir(MyPath & fileName) <> "" then kill Mypath & fileName
dir(myPath & fileName)の結果がいつも””となり、dirがバグってると思った。 しかし、原因は、myPathとfileNmeの間にディレクトリの切れ目の¥がなかったため、正しくファイルを見つけられないためだった。 dir(mypath & "¥" & fileName)であれば、OKだった。myPathのあとには必ず¥がいるんだな。エンサインだよ。あるいは、バックスラッシュだよ。必要だよ。 vbaを書くと時間が潰れる。

2022年9月6日火曜日

accessが2GBを超えた時のメッセージは、「データベースを開くことができません。アプリケーションで認識できないデータベースであるか、またはファイルが破損しています。」だったので、すぐに原因がわからなかった。

accessが2GBを超えた時のメッセージは、「データベースを開くことができません。アプリケーションで認識できないデータベースであるか、またはファイルが破損しています。」だったので、すぐに原因がわからなかった。

2022年8月31日水曜日

全銀フォーマットのカナには拗音(ようおん)がないが、口座カナ名には使いたい。

では、どうするかというと、全銀システムに渡すデータでは、拗音を使わず、それ以外では、拗音を許容すれば良い。

2022年8月26日金曜日

accessのフォームにラジオボタンを作り、そのボタンのオン・オフで、その後の処理を変更するコードをvbaで書いてみた。

まず、accessのフォーム(入力フォームという名前とする)のデザイン画面で、ラジオボタン(目玉みたいなボタン)として、バナナという名前のボタンを追加し、規定値(初期値)はtrueまたはFalseにしておく。 次に、そのラジオボタンを判定(黒目があるときはオン[true]<-1>で、黒目がないときはオフ[False]<0>)し、処理を振り分けるコードをvbaで書いてみた。
ググっても、こういう使い方を説明しているサイトが見当たらなかった。当たり前すぎるのかなぁ。
     If [forms]![入力フォーム]![バナナ] = True then  'バナナボタンがオンの場合の処理を書く。
       MsgBox "バナナボタンがonやで"
       Debug.print "バナナボタンがonやで"
     else
       'バナナボタンがオフの場合の処理を書く。
       MsgBox "バナナボタンがoffやで"
       Debug.print "バナナボタンがoffやで"
     End If