1

ユーザーはフォームでクエリを動的に生成し、結果は同じフォームのリストボックスに表示されます。リストボックスには、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
4

3 に答える 3

0

考えられるすべての方法と、それらの長所/短所については、このサイトを参照してください。あなたの問題については、DAOメソッドを使用したいと思います。サンプルコードもこのサイトにあります。

アクセスからエクセルへのデータ移行方法

セルごとにインポートする間、任意の行、列、セルを必要に応じてフォーマットできます。例えば:

 xlActiveSheet.Cells(4,5).Characters(2).Font.ColorIndex = 5

また

xlActiveSheet.Columns("A:AZ").EntireColumn.AutoFit

また

xlActiveSheet.Range(xlActiveSheet.Cells(1, 1), xlActiveSheet.Cells(1, rec1.Fields.count)).Interior.ColorIndex = 15
于 2013-07-11T02:32:50.900 に答える
0

XML ファイルを生成してみてください。ここに例があります: http://blogs.msdn.com/b/brian_jones/archive/2005/06/27/433152.aspx

PS最初の方法について。ユーザーがクリックしないようにするために、Excel を非表示にすることができます。また、Excel を高速化することもできます (以下の関数を参照)。データを入れる前に Prepare() を使用し、その後またはエラーの場合は Ended() を使用します。

Public Sub Prepare()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
End Sub

Public Sub Ended()
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
End Sub
于 2013-07-10T16:03:14.480 に答える