アクセス小僧:VBAでクエリを変更(2) [コンピューター]
アクセス小僧:VBAでクエリを変更
http://cheese999.blog.so-net.ne.jp/2017-08-16-1
で紹介したマクロの正規表現を見直しました。
データベースのクエリのSQLで、月ごとのレコードを抽出するためのHAVING句は、
HAVING△(((T_テーブル名.日付)>=#7/1/2017#△And△(T_テーブル名.日付)<#8/1/2017#))
となっています。△は半角スペースです。正規表現で次の表現を使いました。
変更前のマクロでは、HAVING句の日付部分と、その前の不等号記号(>=#7/1/2017#、<#8/1/2017#)だけ検索して、置換していましたが、変更後のマクロでは、HAVING句全体を検索して、置換するようにしました。
変更後のマクロを以下に示します。
Private Sub Agg_yyyy_mm(myQuery1 As String, YYYY1 As Integer, MM1 As Integer _
, YYYY2 As Integer, MM2 As Integer)
' 【機能】クエリで集計する年月を変更
' 【引数】
' myQuery1 as String : クエリ名
' YYYY1, YYYY2 as Integer : 年
' MM1, MM2 as Integer : 月
' 【変数】
Dim dbs As Database
Dim qdf As QueryDef
Dim strSQL As String
Dim reg As Object
Dim rep, v1, v2 As String
' 【コード】
Set dbs = CurrentDb ' カレントデータベース
Set qdf = dbs.QueryDefs(myQuery1) ' クエリ
' クエリの現在のSQL文を変数にセット
strSQL = qdf.SQL
' 正規表現オブジェクト作成
Set reg = CreateObject("VBScript.RegExp")
' 正規表現による置換
' パターン=「HAVING (((T_テーブル名.日付)>=#7/1/2017# And (T_テーブル名.日付)<#8/1/2017#))」
v2 = "HAVING (((T_テーブル名.日付)" & ">=#" & MM1 & "/1/" & YYYY1 & "#" & " And (T_テーブル名.日付)" & "<#" & MM2 & "/1/" & YYYY2 & "#))"
With reg
.pattern = "HAVING\s\(\(\(T_テーブル名\.日付\)>=#[0-9]+/[0-9]+/[0-9]+#\sAnd\s\(T_テーブル名\.日付\)<#[0-9]+/[0-9]+/[0-9]+#\)\)" 'パターンを設定
.IgnoreCase = True '大文字と小文字を区別するFalseか、しないTrueか
.Global = True '文字列全体を検索するTrueか、しないFalseか
rep = .Replace(strSQL, v2) ' 置換
End With
' クエリのSQL文を変更
qdf.SQL = rep
' 解放
Set qdf = Nothing
Set dbs = Nothing
If Application.SysCmd(acSysCmdGetObjectState, acQuery, myQuery1) <> 0 Then
' クエリが開いていたら、開きなおす
DoCmd.Close acQuery, myQuery1, acSavePrompt
DoCmd.OpenQuery myQuery1
Else
' クエリが開いていなかったら、開く
DoCmd.OpenQuery myQuery1
End If
End Sub
http://cheese999.blog.so-net.ne.jp/2017-08-16-1
で紹介したマクロの正規表現を見直しました。
データベースのクエリのSQLで、月ごとのレコードを抽出するためのHAVING句は、
HAVING△(((T_テーブル名.日付)>=#7/1/2017#△And△(T_テーブル名.日付)<#8/1/2017#))
となっています。△は半角スペースです。正規表現で次の表現を使いました。
文字列 | 正規表現 |
半角スペース(△) | \s |
( | \( |
) | \) |
. | \. |
数字のの1回以上の繰り返し | [0-9]+ |
変更前のマクロでは、HAVING句の日付部分と、その前の不等号記号(>=#7/1/2017#、<#8/1/2017#)だけ検索して、置換していましたが、変更後のマクロでは、HAVING句全体を検索して、置換するようにしました。
変更後のマクロを以下に示します。
Private Sub Agg_yyyy_mm(myQuery1 As String, YYYY1 As Integer, MM1 As Integer _
, YYYY2 As Integer, MM2 As Integer)
' 【機能】クエリで集計する年月を変更
' 【引数】
' myQuery1 as String : クエリ名
' YYYY1, YYYY2 as Integer : 年
' MM1, MM2 as Integer : 月
' 【変数】
Dim dbs As Database
Dim qdf As QueryDef
Dim strSQL As String
Dim reg As Object
Dim rep, v1, v2 As String
' 【コード】
Set dbs = CurrentDb ' カレントデータベース
Set qdf = dbs.QueryDefs(myQuery1) ' クエリ
' クエリの現在のSQL文を変数にセット
strSQL = qdf.SQL
' 正規表現オブジェクト作成
Set reg = CreateObject("VBScript.RegExp")
' 正規表現による置換
' パターン=「HAVING (((T_テーブル名.日付)>=#7/1/2017# And (T_テーブル名.日付)<#8/1/2017#))」
v2 = "HAVING (((T_テーブル名.日付)" & ">=#" & MM1 & "/1/" & YYYY1 & "#" & " And (T_テーブル名.日付)" & "<#" & MM2 & "/1/" & YYYY2 & "#))"
With reg
.pattern = "HAVING\s\(\(\(T_テーブル名\.日付\)>=#[0-9]+/[0-9]+/[0-9]+#\sAnd\s\(T_テーブル名\.日付\)<#[0-9]+/[0-9]+/[0-9]+#\)\)" 'パターンを設定
.IgnoreCase = True '大文字と小文字を区別するFalseか、しないTrueか
.Global = True '文字列全体を検索するTrueか、しないFalseか
rep = .Replace(strSQL, v2) ' 置換
End With
' クエリのSQL文を変更
qdf.SQL = rep
' 解放
Set qdf = Nothing
Set dbs = Nothing
If Application.SysCmd(acSysCmdGetObjectState, acQuery, myQuery1) <> 0 Then
' クエリが開いていたら、開きなおす
DoCmd.Close acQuery, myQuery1, acSavePrompt
DoCmd.OpenQuery myQuery1
Else
' クエリが開いていなかったら、開く
DoCmd.OpenQuery myQuery1
End If
End Sub
ヤバイぜ! ありがとうございます[__猫]
by cheese999 (2017-08-21 07:13)