"在对应所需名称或序数的集合中未找到项目" ,网上查下来好象都是数据库某个字段名字写错了或不存在之类的,但我的应该不是这方面的问题,还有可能是些什么问题呢

解决方案 »

  1.   

    没有具体出错的地方,先把最有可能的地方贴出来
    Public Function aspexcel(ByVal SQLStr As String) As Boolean
    Set cnn = New ADODB.Connection
    cnn.Open = "Provider =SQLOLEDB;Initial Catalog=emg;Data Source=2号;UID=sa;Pwd=123456"
    Set rs = New ADODB.Recordset
    Set cmd = New ADODB.Command
    rs.Open SQLStr, cnn
        Set xlApp = New Excel.Application
       
            xlApp.DisplayAlerts = False
        Set xlBook = xlApp.Workbooks.Open(getOutPath)
        Set xlSheet = xlBook.Sheets(1)
         For j = 0 To rs.Fields.Count 'fileds(0)开始
            xlSheet.Cells(1, j + 1) = rs.Fields(j).Name
        Next j    rs.MoveFirst
           For i = 1 To rs.RecordCount
        While Not rs.EOF
            For j = 1 To rs.Fields.Count
                xlSheet.Cells(i + 1, j) = rs.Fields(j).Value
            Next j
            rs.MoveNext
            Wend
        Next i
       xlSheet.Range("A2").CopyFromRecordset rs
         xlApp.Visible = True
    rs.Close
    cnn.ClosexlBook.SaveAs (getOutPath)
       xlBook.Close
        xlApp.Quit   Set xlApp = Nothing
      Set xlBook = Nothing
       Set xlSheet = Nothing
        aspexcel = True
        Exit Function
    End Function
      

  2.   

    逻辑有问题rs.MoveFirst
           For i = 1 To rs.RecordCount
        While Not rs.EOF
            For j = 1 To rs.Fields.Count
                xlSheet.Cells(i + 1, j) = rs.Fields(j).Value
            Next j
            rs.MoveNext
            Wend
        Next i
    中的 For i = 1 To rs.RecordCount 和 While Not rs.EOF 实际上是重复的循环
    如果只是需要将程序修改为无错误信息,将rs.MoveFirst移到For i = 1 To rs.RecordCount即可
      

  3.   

    将rs.MoveFirst移到For i = 1 To rs.RecordCount的下面
      

  4.   

    楼上说的对,While Not rs.EOF和for i....重复了。但报错的原因应该是循环记数初值和终值错误,正确的写法是:
        For i = 0 To rs.RecordCount - 1
            For j = 0 To rs.Fields.Count - 1
                 xlSheet.Cells(i + 1, j) = rs.Fields(j).Value
            Next j
            rs.MoveNext
        Next i还有,你说“没有具体出错的地方,先把最有可能的地方贴出来”。很奇怪你是怎么调试的?难道当报错时,不指向错误行吗?
      

  5.   

    你的写法不对,因为我不但有rs.Fields(j).Value,还有rs.Fields(j).name,这要在第一行显示的啊
      

  6.   

    你的写法不对,因为我不但有rs.Fields(j).Value,还有rs.Fields(j).name,这要在第一行显示的啊
    -----------------------
        For i = 1 To rs.RecordCount
            For j = 1 To rs.Fields.Count
                 xlSheet.Cells(i + 1, j) = rs.Fields(j-1).Value
            Next j
            rs.MoveNext
        Next i
      

  7.   

    不清楚你Excel中的定位,有一点可以肯定Fields(index)中的index是由0开始到rs.RecordCount-1结束,是你概念不对
      

  8.   

    那name还是照我原来那样写吧?
      

  9.   

    我认为:  
        For j = 0 To rs.Fields.Count-1 'fileds(0)开始
            xlSheet.Cells(1, j + 1) = rs.Fields(j).Name
        Next j
      

  10.   

    我试下来,对name来说,是要rs.Fields.Count - 1,不过对rs.Fields(j).Value来说,j和j-1效果一样
      

  11.   

    你看清我上面的回复,循环起始值和终始值不一样的,不仅仅是j和j+1。
    你的情况有二种写法:
    1.
        For i = 0 To rs.RecordCount - 1
            For j = 0 To rs.Fields.Count - 1
                 xlSheet.Cells(i + 1, j+1) = rs.Fields(j).Value
            Next j
            rs.MoveNext
        Next i2.
        For i = 1 To rs.RecordCount
            For j = 1 To rs.Fields.Count
                 xlSheet.Cells(i + 1, j) = rs.Fields(j-1).Value
            Next j
            rs.MoveNext
        Next i
      

  12.   

    哦,1有点问题。根据你代码推敲,应该:    For i = 0 To rs.RecordCount - 1
            For j = 0 To rs.Fields.Count - 1
                 xlSheet.Cells(i + 2, j+1) = rs.Fields(j).Value
            Next j
            rs.MoveNext
        Next i
      

  13.   

    总之,只要记住
    rs.Fields(index)中的index是由0开始到rs.RecordCount-1结束
    超出这个范围,就有可能报你说的错误