AccessVBA小技集
フォームの背景色をコードで指定する方法
フォームは下記のように、セクションごとに分かれているので、任意のセクションを指定して背景色を変更することになります。
' フォーム詳細
Me.Section(0).BackColor = 色番号
' フォームヘッダー
Me.Section(1).BackColor = 色番号
' フォームフッター
Me.Section(2).BackColor = 色番号
' ページヘッダー
Me.Section(3).BackColor = 色番号
' ページフッター
Me.Section(4).BackColor = 色番号
サブフォームの項目にフォーカスを移す方法
いったん、サブフォームにフォーカスを移す必要があります。
Forms![フォーム名]![サブフォームコントロール名].SetFocus
Forms![フォーム名]![サブフォームコントロール名].Form![コントロール名].SetFocus
サブフォーム側に下記のようなコードを書いたプロシージャを用意しておいて、親フォーム側から呼び出してフォーカスを移すこともできます。
Parent![サブフォームコントロール名].SetFocus
Parent![サブフォームコントロール名].Form![コントロール名].SetFocus
サブフォームのプロシージャを呼び出す方法
サブフォームに Public でプロシージャを作っておく必要があります。
Public Sub プロシージャ名()
MsgBox ("Hello")
End Sub
呼び出し方は、下記のように書けば、呼び出せます。
Forms!親フォーム名!サブフォーム名.Form.プロシージャ名
背景色を 16 進数で指定する方法
16 進数のままでは指定できないので、変換して指定する必要があります。
こんな感じの関数をモジュールとして作っておけば割と便利です。
Private Function f_getColor(ByVal strHex As String) As Long
Dim lngR As Long
Dim lngG As Long
Dim lngB As Long
lngR = CLng("&H" & Mid$(strHex, 1, 2))
lngG = CLng("&H" & Mid$(strHex, 3, 2))
lngB = CLng("&H" & Mid$(strHex, 5, 2))
f_getColor = RGB(lngR, lngG, lngB)
End Function
別アプリの起動
Shell "c:\なんらかのプログラム.exe 引数", vbNormalFocus
Shell "MSACCESS.EXE c:\なんらかのアクセス.mdb /cmd 引数 " , vbNormalFocus
filter の解除
この方法で Filter を解除できないことがある。
FilterOn = False
Filter = ""
FilterOn = True
FilterOn=False の前に、下記を書いておけば、確実に Filter を解除できる。
DoCmd.ShowAllRecords
クエリのパラメータに値を入れて実行する方法
Dim db As Database
Dim qdf As QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs("実行するクエリ")
qdf.Parameters("パレメータ1") = 1
qdf.Parameters("パレメータ2") = 2
qdf.Parameters("パレメータ3") = 3
qdf.Execute
AccessVBA で音を鳴らす
PlaySoundAPI を利用します。
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal filename As String, ByVal hmod As Long, ByVal flag As Long) As Long
' 同期
Private Const SND_SYNC = &H0
' 非同期
Private Const SND_ASYNC = &H1
' 繰り返し
Private Const SND_LOOP = &H8
' 停止
Private Const SND_PURGE = &H40
こんな感じで呼べば再生されます。
Call PlaySound("音ファイル.wav", 0, SND_SYNC)
テーブルリンクの更新
マクロにしておけば、DB のテーブルが更新されたときに、実行すればよいだけなので、いちいち手動でリンクを張りなおさなくてよい。
Option Compare Database
Option Explicit
Public Function テーブルリンク更新()
Dim dbs As Database
Dim tdf As TableDef
Dim strRefreshedTable As String
Set dbs = CurrentDb
strRefreshedTable = "下記のテーブルリンクを更新しました。" & vbCr & vbCr
'全テーブルの探索ループ
For Each tdf In dbs.TableDefs
With tdf
If .Connect <> "" Then
'リンテーブルのみ処理
.Connect = "ODBC;DSN=xxxxxx;UID=xxxxxx;PWD=xxxxxx;DATABASE=xxxxxx"
.RefreshLink
strRefreshedTable = strRefreshedTable & .Name & vbCr
End If
End With
Next tdf
MsgBox (strRefreshedTable)
End Function
Access のクエリにフォームの値を入れる
テキストボックスの値をクエリの条件に指定したいときには、下記のように書く。
select
*
from
table1
where
table1.id = [Forms]![frmフォーム名]![項目名]
AccessVBA で数値の判定
値が数値かどうか、IsNumeric()で判定できます。
IsNumeric(値)
数値型に変換できる場合 True を、できない場合は False を返します。
if IsNumeric(値) then
' 処理
end if
if Not IsNumeric(値) then
' 処理
end if
「Null の使い方が不正です」のエラーが出たときの対処
こんな風に書いたとき、「Null の使い方が不正です」とエラーが出る。
プロシージャ名(コントロール名)
nz で空文字なり、0 なりに変換すれば、OK です。
プロシージャ名(nz(コントロール名,""))