###前提・実現したいこと
Access VBAでExcel出力をしようとしています。
対象レコードが3万件ほどあり、出力にかなり時間が掛かってしまっています。
今はセル一つずつに書き込んでいるので、遅くなっていると思うのですが、
速度改善の方法として、レコードセットの内容をまとめて書き込む方法等ありましたら
ご教授頂けますでしょうか?
###該当のソースコード
ACCESS
1Dim sql As String 2Dim cn As ADODB.Connection 3Dim rs As ADODB.Recordset 4Dim tmpField As ADODB.Field 5Dim app As Excel.Application 6Dim book As Excel.Workbook 7Dim sheet As Excel.Worksheet 8Dim fName As String 9Dim data() As String 10Dim cnt As Integer 11Dim rows As Long 12Dim cols As Integer 13 14Set cn = CurrentProject.Connection 15fName = CurrentProject.Path & "\export\PV数(月別)_" & Format(Now, "yyyymmddHHMMSS") & ".xlsx" 16Set app = CreateObject("Excel.Application") 17app.Visible = False 18Set book = app.Workbooks.Add 19Set sheet = book.Worksheets(1) 20sheet.Name = "DATA" 21 22Set rs = New ADODB.Recordset 23rs.CursorLocation = adUseClient 24sql = "SELECT * FROM PV数" 25rs.Open sql, cn, adOpenDynamic, adLockOptimistic 26 27rows = 8 28Do Until rs.EOF 29 cols = 1 30 For Each tmpField In rs.fields 31 If rows = 8 Then 32 sheet.Cells(rows - 1, cols).Value = tmpField.Name 33 End If 34 sheet.Cells(rows, cols).Value = tmpField.Value 35 cols = cols + 1 36 Next 37 38 rows = rows + 1 39 rs.MoveNext 40Loop 41cn.Close 42Set cn = Nothing 43Set rs = Nothing 44 45book.SaveAs (fName) 46 47app.Quit 48Set book = Nothing 49Set app = Nothing
###試したこと
ループの部分を以下のように変更して、一行ずつ配列に入れてから書き込むようにしました。
速度改善の効果は出たのですが、出力したエクセルを開いてみると、全てのセルが文字列扱いになってしまい、
数値のセルも文字列として扱われてしまっています。
エクセル上である列をオートSUMしたりしたいのですが、文字列のためできなくなってしまいました。
書き込む際にこのセルは数値として指定したりできるのでしょうか?
Do Until rs.EOF
cols = 1
cnt = 0 ReDim data(cnt) If rows = 8 Then For Each tmpField In rs.fields ReDim Preserve data(cnt) data(cnt) = tmpField.Name cnt = cnt + 1 Next sheet.Range(sheet.Cells(rows - 1, 1), sheet.Cells(rows - 1, UBound(data) + 1)) = data End If cnt = 0 ReDim data(cnt) For Each tmpField In rs.fields ReDim Preserve data(cnt) If IsNull(tmpField.Value) Then data(cnt) = "" Else data(cnt) = tmpField.Value End If cnt = cnt + 1 Next sheet.Range(sheet.Cells(rows, 1), sheet.Cells(rows, UBound(data) + 1)) = data rows = rows + 1 rs.MoveNext
Loop
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。