|
▼taku さん:
こんばんは。
SQLで行ったクロス集計です。
以下のデータが
Sheet1というシートのセルA1から
設定されているという条件です。
(1行目は項目名です)
>日付 品名 金額
>2005/1/12 パソコン 120,000
>2005/1/23 プリンタ 50,000
>2005/2/15 パソコン 200,000
>2005/2/25 プリンタ 35,000
集計結果は、同じブックのSheet2というシート名に書き込みます。
標準モジュールに
'================================
Sub test()
Dim idx As Long
Dim rs As Object
Dim mysql As String
If open_ado_excel(ThisWorkbook.FullName) = 0 Then
mysql = "Transform sum(金額) " & _
"Select 品名 From [Sheet1$] Group By 品名 " & _
"Pivot year(日付)*100+month(日付);"
If get_exec_sql(mysql, rs) = 0 Then
With Worksheets("Sheet2")
.Cells.ClearContents
.Range("a2").CopyFromRecordset rs
For idx = 0 To rs.fields.Count - 1
.Cells(1, idx + 1).Value = "'" & Format(rs.fields(idx).Name, "0000年00月")
Next
End With
Call rs_close(rs)
Else
MsgBox "rs error"
End If
Call close_ado
Else
MsgBox "cn error"
End If
End Sub
別の標準モジュールに
'==================================================================
Public cn As Object
'=========================================================
Function open_ado_excel(book_fullname As String) As Long
On Error Resume Next
Dim link_opt As String
link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & book_fullname & ";" & _
"Extended Properties=Excel 8.0;"
Set cn = CreateObject("ADODB.Connection")
cn.Open link_opt
open_ado_excel = Err.Number
On Error GoTo 0
End Function
'=========================================================
Sub close_ado()
On Error Resume Next
cn.Close
Set cn = Nothing
On Error GoTo 0
End Sub
'=========================================================
Function get_exec_sql(sql_str, rs As Object) As Long
On Error Resume Next
Set rs = cn.Execute(sql_str)
get_exec_sql = Err.Number
On Error GoTo 0
End Function
'=========================================================
Sub rs_close(rs As Object)
On Error Resume Next
rs.Close
Set rs = Nothing
On Error GoTo 0
End Sub
として、一度適当なブック名で保存した後に
testを実行してみてください。
以前投稿したコードをほんのちょっと手直ししただけです。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28380;id=excel
(SQLと後始末のコードだけ変更しました)
ブックを開いたまま、繰り返し実行するには問題もありますが、
(その場合はデータブックとVBAコードを含むブックを分けなければなりません)
ブックを開いて一度集計するくらいなら、問題ないと思います。
試してみてください。
|
|