ユーザーはフォームでクエリを動的に生成し、結果は同じフォームのリストボックスに表示されます。リストボックスには、1 ~ 12 列の任意の列を含めることができます。
ユーザーは、このクエリの結果を Excel にエクスポートできるようにしたいと考えています。ファイルを保存しないことが望ましいと思いますが、機能するものは何でも機能します。
現在、それぞれに独自の問題がある2つの方法を見つけました
1
myExApp.visible = True
myExApp.Workbooks.Add
Set myExSheet = myExApp.Workbooks(1).Worksheets(1)
If myExApp.Ready = True Then
For i = 1 To Me!listDynamicSearchResult.ColumnCount
Me!listDynamicSearchResult.BoundColumn =
Me!listDynamicSearchResult.BoundColumn + 1
For j = 1 To Me!listDynamicSearchResult.ListCount
myExSheet.Cells(j, i) = Me!listDynamicSearchResult.ItemData(j - 1)
Next j
Next i
Me!listDynamicSearchResult.BoundColumn = 0
End If
これは問題なく動作しますが、明らかな理由で指数関数的に遅くなります。
このメソッドは、現在開いている Excel シート内でユーザーがクリックしたときにもエラーを引き起こします。
それがいかに遅いかということと相まって、ユーザーがループが完了する前にフォームを操作しようとしてエラーを引き起こす可能性が非常に高くなります。
2
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "test", "I:\test.xls"
この方法では、動的に作成されたクエリを、クリック時に保存されたクエリに保存する必要があります。
これに関する問題は、列がフォーマットされず、Excel がすべてをデータ型ではなく文字列として読み取るのに対し、最初の方法ではデータ型が正しく読み取られることです。
問題を軽減する方法はありますか、またはこれを行うためのより効率的な方法はありますか?
解決策 (現在は文字列としてフォーマット)
Set xlApp = New Excel.Application
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Worksheets(1)
xlApp.visible = True
strFile = CurrentProject.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";"
Set cn = CurrentProject.AccessConnection
Set rs = CreateObject("ADODB.recordset")
With rs
Set .ActiveConnection = cn
.Source = Me!listDynamicSearchResult.RowSource
.Open
End With
With xlWs
.QueryTables.Add Connection:=rs, Destination:=.Range("A1")
.QueryTables(1).Refresh
End With