2017-08-07 12 views
-2

私のコードでは、作成に時間がかかりすぎますが、SQLのクエリからExcelファイルが正常に作成されます。
コードは以下の通りです:VB(多くの行)を使用してExcelに書き込む

rsAnaforaPr.DoQuery("SELECT * FROM [dbo].[zam_excel]") 
rsAnaforaPr.MoveFirst() 
    hj = False 
    rowCount = 1 
    While rsAnaforaPr.EoF = False 
     shell1 = rsAnaforaPr.Fields.Item("Value1").Value 
     If hj = False Then 
      oExcel = CreateObject("Excel.Application") 
      oExcel.DisplayAlerts = False 
      oBook = oExcel.Workbooks.Add 
      hj = True 
      oBook.SaveAs("C:\Desktop\New folder\excel.xlsx") 
      oBook.Close(True) 
      oExcel.Quit() 
      oExcel = CreateObject("Excel.Application") 
      oExcel.DisplayAlerts = False 
      oBook = oExcel.Workbooks.Open("C:\Desktop\New folder\excel.xlsx")   
      oSheet = oBook.Worksheets("Sheet1") 
      oSheet.Range("A" & rowCount).Value = "Value1" 
      rowCount = rowCount + 1 
      oSheet.Range("A" & rowCount).NumberFormat = "@" 
      oSheet.Range("A" & rowCount).Value = shell1 
     Else 
      oSheet.Range("A" & rowCount).NumberFormat = "@" 
      oSheet.Range("A" & rowCount).Value = shell1      
     End If 
     rowCount = rowCount + 1 
     rsAnaforaPr.MoveNext() 
    End While 
    oBook.Close(True) 
    oExcel.Quit() 
+0

それははるかに速く、それを記入します。データを格納する場所の左上のセルに配列を書き込むだけで、セルではなくすべてを一度にすべて書き込む – soohoonigan

+0

ループ内のレコードセットからすべてを最初に読み込みます。要素を配列に記録します。それをExcelの単一の範囲にすべて書き込んでください。 – djv

+2

この質問は[Code Review](http://stackexchange.codereview.com)IMOに適しています。 –

答えて

0

は、最初に次のように書く:

Application.ScreenUpdating = False

次に、あなたのコードの書き込みの最後に:

Application.ScreenUpdating = True

高速アップグレードは目に見える&表示されます。 ScreenUpdatingプロパティについての詳細はこちら - https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-screenupdating-property-excel

+0

こんにちはVityata、私はこれを書くときに私はオブジェクト変数またはブロック変数が設定されていないエラーを受け取った – ifi

0

私は以下のようなコードを使用しています。
しかし、私はちょうどあなたのVB.NETタグを気付いた...それは何らかの理由でAccessとして読む。
これはうまくいかないと思いますか?誰かが私に知らせる&私は答えを削除します。あなたは、whileループ内の2次元配列を作成し、スプレッドシートに、配列を記述する場合

Sub Test() 
    Dim oXL As Object 
    Dim oWrkBk As Object 
    Dim DB As DAO.Database 
    Dim qdf As DAO.QueryDef 
    Dim prm As DAO.Parameter 
    Dim rst As DAO.Recordset 

    ''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    'Defer error trapping in case Excel is not running. ' 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    On Error Resume Next 
    Set oXL = GetObject(, "Excel.Application") 

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    'If an error occurs then create an instance of Excel. ' 
    'Reinstate error handling.       ' 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    If Err.Number <> 0 Then 
     On Error GoTo -1 
     On Error GoTo ERR_HANDLE 
     Set oXL = CreateObject("Excel.Application") 
    End If 

    Set oWrkBk = oXL.workbooks.Add 

    oXL.Visible = True 

    Set DB = CurrentDb 
    Set qdf = DB.CreateQueryDef("", "SELECT * FROM [dbo].[zam_excel]") 
    For Each prm In qdf.Parameters 
     prm.Value = Eval(prm.Name) 
    Next prm 
    Set rst = qdf.OpenRecordset 

    If Not (rst.BOF And rst.EOF) Then 
     oWrkBk.worksheets(1).range("A1").CopyFromRecordSet rst 
    End If 

EXIT_PROC: 

     On Error GoTo 0 
     Exit Sub 

ERR_HANDLE: 
     Select Case Err.Number 

      Case Else 
       MsgBox Err.Description & "(" & Err.Number & ")", vbOKOnly 
       Resume EXIT_PROC 
     End Select 

End Sub 
関連する問題