2022年11月4日金曜日

sqlのwhereでINとANDを併用してみる。

select A.NO B.NO from A inner join B on A.NO = B.NO where A.NO IN (1,2,3) AND B.TYPE = 9 ;
こう書いても良い
select A.NO B.NO from A inner join B on A.NO = B.NO where (A.NO,B.TYPE) IN ((1,9),(2,9)(3,9)) ;

vbaのjoinで一次元配列をカンマ区切りの文字列にする。

Dim myArray as variant
myArray = array(1,2,3,4,5)
myArrayStr = join ( myArray,",")   ' myArrayStr = 1,2,3,4,5

2022年10月27日木曜日

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

 入力フォームという名前のフォームにfrmTypeというフレームを追加し、そのフレームに「type1(値1)」と「type2(値2)」というオプションボタンを追加した。
 標準モジュールで、オプションボタンを判定するコードは、以下のような感じだ。

  If [Forms]![入力フォーム]![frmType].Value = 1 then
  [type1の処理]
  else
  [type2の処理]
  End If

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を書くと時間が潰れる。