把SQL-SERVER的中的表导为一张Excel表的时候小表可以,大表程序就死了。程序代码都没有问题,代码是否哪个地方需要改动??
具体代码如下:
引用ADO
Private Sub Form_Load()
Dim mycon As New ADODB.Connection
Dim myres As New ADODB.RecordsetWith mycon
.ConnectionString = "Provider=SQLOLEDB.1;" & _
                    "Integrated Security=SSPI;" & _
                    "Persist Security Info=False;" & _
                    "Initial Catalog=Northwind;" & _
                    "Data Source=."
.Open
End With
With myres
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
'下面的表如果换成一张大表,如orders表程序就像是死循环,高手点解,在线等!
.Open "employeeterritories", mycon, , , adCmdTable
End WithDim i As Integer, j As Integer
Dim myexcel As New Excel.Application
Dim mybook As New Excel.Workbook
Dim mysheet As New Excel.Worksheet
Set mybook = myexcel.Workbooks.Add  '添加一个新的BOOK
Set mysheet = mybook.Worksheets.Add  '添加一个新的SHEET
Do While Not myres.EOF
    For j = 1 To myres.Fields.Count
mysheet.Cells(myres.AbsolutePosition, j) = myres.Fields.Item(j - 1).Value
    Next j
    myres.MoveNext
    Loop
    myexcel.Visible = True
    mybook.SaveAs ("c:\a.xls")  '保存文件
myexcel.Quit   '退出EXCEL
Set mysheet = Nothing
Set mybook = Nothing
Set myexcel = Nothing
End Sub

解决方案 »

  1.   

    如果使用你的程序建议在循环中加一条语句doevents
      

  2.   

    但是sql本来就支持直接导出成excel的形式/***********  导入Excel
    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
      

  3.   

    只是个测试程序,要把这个做成任何数据库对象导为Excel表,所以……
      

  4.   

    Do While Not myres.EOF 效率要比FOR 循环 效率也要低 因为每次循环都要检测MYRES.EOF
      

  5.   

    建议使用
    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
      

  6.   

    在你的循环中加一个doevents语句,以空闲出CPU时间,防止程序如死循环一样!!
      

  7.   

    你们两的意见我接受,不过速度仍然很慢,是不是循环的核心部分需要改动以下?
        For i = 1 To myres.RecordCount
        For j = 1 To myres.Fields.Count
    ’使用下面的Fields属性是不是有些不妥,有没有其他的属性来获取对应的值
    mysheet.Cells(myres.AbsolutePosition, j) = myres.Fields.Item(j - 1).Value 
         If (myres.AbsolutePosition * j) Mod 500 = 0 Then
        DoEvents
        End If
        Next j
        myres.MoveNext
        Next i