SSブログ

アクセス小僧: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#))

となっています。△は半角スペースです。正規表現で次の表現を使いました。

文字列正規表現
半角スペース(△)\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
ヤバイぜ!(8)  コメント(1) 
共通テーマ:パソコン・インターネット

ヤバイぜ! 8

コメント 1

cheese999

ヤバイぜ! ありがとうございます[__猫]
by cheese999 (2017-08-21 07:13) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字(英大文字の「オー」、英小文字の「ユー」、アラビア数字の「ハチ」、アラビア数字の「イチ」、アラビア数字の「ニ」)を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。