AccessVBA小技集

2017.5.4

フォームの背景色をコードで指定する方法

フォームは下記のように、セクションごとに分かれているので、任意のセクションを指定して背景色を変更することになります。

' フォーム詳細
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(コントロール名,""))