パソコン情報

【Access】何かと便利Tips5選

テーブルの存在を確認するVBA



テーブルの存在自体を確認するってことはあまりないかと思いますが、作業用テーブルなどを使っていると、リセットするのに、テーブルデータを消して、データをコピーという手順さえも省きたくなる時がある。また、自動採番などをやっていると、途中からの採番になり、1から降りなおしておきたい時などは、元データから新規でテーブルを作成してしまった方が簡単な場合がある。

そのような用途から、ただ単にテーブルの存在確認まで、下記の様なモジュールを使うと便利です。



Public Function ExistTable(TableName As String) As Boolean
On Error Resume Next
    ExistTable = CurrentDb.TableDefs(TableName).name = TableName
End Function



Public Functionなので、モジュールとして登録になるわけですから、各VBAの中で呼び出すことになります。

呼び出すサンプルを下記に記載しておきます。



Private Sub entry_btn_Click()

Dim t_name As String
t_name = "存在を確認したいテーブル名"

    ' テーブル存在チェック
     If ExistTable(t_name) Then
    ' テーブルあり
        MsgBox "テーブルは存在します。"
  
     Else
        ' テーブルなし
        MsgBox "テーブルが存在していません。"
     End If
End Sub

 

上記のVBAもネット上の拾い物ですが、なぜか?

ココに注意

ByRef 引数の型が一致しません



というエラーがでるので、


Dim t_name As String
t_name = "存在を確認したいテーブル名"

の部分を追加した訳です。

これでテーブルの存在確認ができるようになりました。




メッセージボックスの文章を改行したい



通常のメッセージボックスは、デフォルトのままですと、勝手に適当な場所で改行されます。

ちょっと見栄えが悪い時がありますので、意図的に改行したい場合の方法です。

 

 

MsgBox("入荷処理は新規ですか?" & Chr(13) & "【新規または作業途中データをリセットの場合は、「はい」】" & Chr(13) & "【途中からの再作業の場合は、「いいえ」】) "

 



つまり、

ココがポイント

文章” & Chr(13) & "文章

ってやれば、改行の意味になる。

" & vbCrLf & "でも改行になるらしいが試していません。

 



VBAでアクションクエリの確認を無くす



レコードの追加クエリ、削除クエリ、更新クエリ、テーブル作成クエリなどをVBAで実行する時に、Access(アクセス)の設定自体を変更しなければならない。それだと、

 

ココに注意

各パソコン毎に設定をしなければならないので面倒



である。


参考

[ファイル]タブから[オプション]をクリックして、[Accessのオプション]ダイアログボックスを表示。[クライアントの設定]で[確認]から[アクションクエリ]のチェックボックスをオフにする




VBAのクエリなどを実行する手前に下記の様なコマンドを入れておけば確認ボックスは表示されなくなります。



DoCmd.SetWarnings False

DoCmd.OpenQuery "アクションクエリ"

DoCmd.SetWarnings True



 

 

テーブルを削除とテーブル内全レコード削除



テーブル内のデータを削除するってことは、リセットするってことですが、下記の一文をVBAで書くと全レコード削除になります。

 

 DoCmd.RunSQL "DELETE * FROM 全レコード削除するテーブル名"

 


それから、めったにないかと思いますが、テーブルごと消したい時ですね。
ただし、フォームなどで消したいテーブルを開いておくとエラーになりますので注意してください。

 

DoCmd.DeleteObject acTable, "消したいテーブル名"



両方ともたった一行で、全レコードを消したりテーブルごとを削除しますので、使用する場合は、選択する文をいれて考える時間を与えるようにすることが大切ですね。



 

 

非連結フォームの1レコードデータ更新

https://pctips.jp/pc-soft/access-serach-vba-howto201907/

 


以前も、非連結フォームの更新を記事にしてありますが、馬鹿の一つ覚えの様に同じVBAをつかっていましたが、1レコードだけの更新なら下記のVBAの方がスマートかと思います。


Private Sub entry_btn_Click()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

On Error GoTo ErrRtn

'                Debug.Print trans_stock_no

        If IsNull(edit_stock Or edit_schedule_arrival Or edit_ideal_stock Or edit_waiting_shipping) Then
            MsgBox ("データ入力されていません。無い場合は「0」を入力してください。")
            Exit Sub
        End If


        If MsgBox("更新しますか? yes/no", vbYesNo, "更新確認") = vbYes Then
        
        
                Set cn = CurrentProject.Connection
                rs.CursorLocation = adUseClient
                rs.Open "dbo_stock", cn, adOpenKeyset, adLockOptimistic

                rs.Filter = "no = " & trans_stock_no  'ここにフーム間変数を設定

                cn.BeginTrans

                            rs!stock = edit_stock
                            rs!schedule_arrival = edit_schedule_arrival
                            rs!ideal_stock = edit_ideal_stock
                            rs!waiting_shipping = edit_waiting_shipping
                        rs.Update

                cn.CommitTrans

                rs.Close: Set rs = Nothing
                cn.Close: Set cn = Nothing
      
        Else
                MsgBox ("更新しませんでした。")
                Exit Sub
        
        End If


ExitErrRtn:
        DoCmd.ShowAllRecords
        Exit Sub

ErrRtn:
        MsgBox "エラー: " & Err.Description
        cn.RollbackTrans
        rs.Close: Set rs = Nothing
        cn.Close: Set cn = Nothing

End Sub