SQL Server 2005 Express Edition に Access 2007 からアップサイジングしました。当然、いくつかアップサイジングできない部分が生じます。クエリの Where 式が失敗すると Web 上にたくさん出ていますし、イベント・プロシージャーを書くとき DAO もダメで ADO にしなさいなどとあります。
と、いうことで Access 2007 の内から ADO に切り替えて作成しました。完璧と思えるほどに作りこんでアップサイジングしましたが、いくつもバグが見つかり苦労しました。年金組は高いマニュアルの購入はできませんのでインターネット情報のみが頼りです。何も分からないときにインターネット検索をしてもなかなか該当が見つからないものです。わかってから検索すると一発でヒットします。(笑)
イベント・プロシージャーの部分はデータベースの或る月分のデータを集計し、エクセルの表に差し込む作業です。
トラブルが発生した時の原因を列挙しておきます。
と、いうことで Access 2007 の内から ADO に切り替えて作成しました。完璧と思えるほどに作りこんでアップサイジングしましたが、いくつもバグが見つかり苦労しました。年金組は高いマニュアルの購入はできませんのでインターネット情報のみが頼りです。何も分からないときにインターネット検索をしてもなかなか該当が見つからないものです。わかってから検索すると一発でヒットします。(笑)
イベント・プロシージャーの部分はデータベースの或る月分のデータを集計し、エクセルの表に差し込む作業です。
トラブルが発生した時の原因を列挙しておきます。
- フォーム内に埋め込んだマクロは外出しにしてマクロを保存しました。
Where 式の部分を Stored Procedure で作成する件は無くなりました。一部どうしてもストアドプロシージャーで書かないとうまくいかないものがあります。同じような設計にもかかわらず、原因究明できていません(as of 2009/9/1) - ADP の VBA 画面で、<ツール>-<参照設定>項目に Microsoft ActiveX Data Objects 2.8 Library の設定を追加しますが、Microsoft Excel 12.0 Object Library も必要でした。参照 #1
- コーディングの途中に DAO の Currentdb.name を使った Excel File の Path を見つける仕組みが残っていました。現在は CurrentProject.Path を使用しています。ついでにコード行が大幅に削減される効果もあり。参照 #2
- SQL文の作成は、Access 2007 のクエリで集計用から作成すると便利です。それをデザインモードで開いたのち、コピーします。集計用クエリを SQL 文表示にすると where 式の部分が Having となります。当初、機能的には違いがないと勝手に判断し SQL文で Where と書き換えていましたが、どうしてもバグがとれません。初心に帰ってコピーして貼り付けたら一発でOKとなってびっくり。調べたら集計のときはHaving になるようですね。20年前の知識でやってはいけません、最新の情報に更新してから進めるべきでしたね。参照 #3
- 同SQL文で、日付で絞り込むには Access 2007 の DB と SQL サーバーでの書き方が異なります。日付の囲む文字が Access 2007 では # でしたが、' (アポストロフィ)です。 参照#3
参照 #1
Dim cn As ADODB.Connection参照 #2
Dim rs As ADODB.Recordset
Dim objEXCEL As Object
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
Set objEXCEL = Excel.Application
strXLSFILE = CurrentProject.Path & "\" & strBOOK参照 #3
" GROUP BY T00センター受付簿テーブル.受付日, T00センター受付簿テーブル.分類コード, T10分類マスター.分類 " _参照 エクセルに書き出し部分
" HAVING T00センター受付簿テーブル.受付日 Between " & "'" & Format(月初日, "yyyy/mm/dd") & "' And '" & Format(月末日, "yyyy/mm/dd") & "' " _
With objEXCEL
.Visible = True
.UserControl = True
.Workbooks.Open (strXLSFILE)
.Worksheets("原紙").Copy Before:=Worksheets("ReadMe")
.ActiveSheet.Name = strYYYYMM
.Cells(1, 14).Value = Val(Mid(strYYYYMM, 5)) & "月"
.Cells(3, 4).Value = Format$(基準日, "gggee年mm月dd日") & " ~ " & Format$(年度末, "gggee年mm月dd日")
'書き出しループ処理
Do Until rs.EOF
' 日にちのみ取り出し
nYLINE = Day(Format(rs.Fields("受付日").Value, "yyyy/mm/dd")) * 2
' 月の後半は次ページにする
If nYLINE > 30 Then nYLINE = nYLINE + 4
' 分類コードで列を指定
cCODE = rs.Fields("分類コード").Value
Select Case cCODE
Case Is > 900: nXLINE = 11
Case Is > 600: nXLINE = 10
Case Is > 500: nXLINE = 9
Case Is > 400: nXLINE = 8
Case Is > 300: nXLINE = 7
Case Is >= 280: nXLINE = 6
Case Is > 200: nXLINE = 5
Case Is >= 140: nXLINE = 4
Case Is >= 130: nXLINE = 3
Case Is >= 120: nXLINE = 2
Case Is >= 110: nXLINE = 1
'ESLE: nXLINE = 0
End Select
If nXLINE <> 5 Then
.Cells(nYLINE + 7, 2).Value = rs.Fields("曜日")
.Cells(nYLINE + 7, 3 + nXLINE).Value = rs.Fields("件数")
.Cells(nYLINE + 8, 3 + nXLINE).Value = rs.Fields("来場者数の合計")
以下省略
End If
rs.MoveNext
Loop
End With
コメントする