|
今度は、ブックをデータとマクロに分けてみました。
実験 2
>新規ブックのSheet1のセルA1から
> A B C D
> 1 大分類 中分類 小分類 金額
> 2 服 紳士服 紳士服 500
> 3 服 婦人服 婦人服 400
> 4 服 子供服 子供服 300
> 5 本 マンガ 男子向 100
> 6 本 マンガ 女子向 150
> 7 飲み物 ジュース オレンジ 110
> 8 飲み物 ジュース アップル 115
> 9 飲み物 ジュース パイン 120
>10 飲み物 お茶系 麦茶 100
>11 飲み物 お茶系 ウーロン茶 100
>
>というEXCEL_VBA中の下 さんがご提示されたサンプルデータを
>使用します。
>
今度は、上記データのみを名前を付けて保存します。
(ブック名は、excelsampwithado.xlsとでもしましょう)
保存後、このブックは閉じてください。
別の新規ブックを作成し、
このブックには、以下のマクロだけを登録します。
>
>
>このブックの標準モジュールに
>
>'===========================================================
>Sub main()
> Dim flno As Long
> Dim idx As Long
> flno = FreeFile()
> Open ThisWorkbook.Path & "\memlog.csv" For Output As #flno
> Print #flno, "NO,使用メモリー,空きメモリー,トータル"
> For idx = 1 To 100
> Call test
> DoEvents
> With Application
> Print #flno, idx & "," & .MemoryUsed & "," & .MemoryFree & "," & .MemoryTotal
> End With
> Next idx
> Close #flno
>End Sub
>'========================================================================
>Sub test()
> Dim rs As Object
> Dim mysql As String
If open_ado_excel(ThisWorkbook.Path & "\excelsampwithado.xls") = 0 Then
> mysql = "select [大分類],[中分類],sum([金額]) from [sheet1$] group by [大分類],[中分類]"
> If get_exec_sql(mysql, rs) = 0 Then
> With Worksheets("sheet2")
> .Cells.ClearContents
> .Range("a2").CopyFromRecordset rs
> .Range("a1:c1").Value = Array("大分類", "中分類", "金額")
> End With
> End If
> Call rs_close(rs)
> End If
> Call close_ado
>End Sub
>
>
>別の標準モジュールに
>'===============================================================
>Public cn As Object
>'======================================================
>Function open_ado_excel(book_fullname As String) As Long
> On Error Resume Next
> 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
> If Err.Number <> 0 Then
> MsgBox Err.Number & ":::" & Err.Description
> End If
> 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)
> If Err.Number <> 0 Then
> MsgBox Err.Number & ":::" & Err.Description
> End If
> 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
これを適当なブック名を付けてexcelsampwithado.xlsと同じフォルダに保存した後、
プロシジャーmainを実行してください。
>ブックと同じフォルダにmemlog.csvというログファイルを
>作成します。
>mainの実行後、呼び出してください。
>cvsファイルになっていますからExcelで読み込めるはずです。
ログファイルのメモリが増えていないことが確認できましたか?
どうやら、Excelで開いているブックに対してADOで
処理を行うとメモリーの増加という現象が見られます。
(上記のようにマクロとデータのブックを分けても
データブック「excelsampwithado.xls」を開いた状態で
mainを実行してもメモリーの増加は見られます)。
・マクロと対象データが入っているブックを分けること。
・ADOで処理している間は対象ブックを開かない
なんて事を注意して仕様を考えてみてはいかがですか?
|
|