2015-05-12 5 views
0

Я использую следующий код для извлечения некоторой информации из базы данных oracle. Я использовал этот тип соединения Oracle и SQL-скрипт много раз, но этот конкретный скрипт генерирует определенную Приложением или объектно-зависимую ошибку. В отчете отображается 7625 строк до появления ошибки.Excel VBA - Определенная пользователем или объектная ошибка

Любые идеи?

Sub SQL_CDS() 

Sheets("CDS Data").Select 

Dim SQL As String 
Dim orasession As Object 
Dim oradatabase As Object 
Dim dyprod As Object 
Dim Row As Integer 

Application.ScreenUpdating = False 

Set orasession = CreateObject("OracleInProcServer.XOraSession") 'Create the OraSession Object. (Oracle) 
Set oradatabase = orasession.DbOpenDatabase("sid_cnded", "bo_bca_rep/bobcarep01", 0&) 'Create the OraDatabase Object by opening a connection to Oracle. 

SQL = SQL & "SELECT selection_no as one, " 
SQL = SQL & "selection_status as two, " 
SQL = SQL & "onhand_cds as three, " 
SQL = SQL & "allocated_cds as four, " 
SQL = SQL & "nr_date as five, " 
SQL = SQL & "last_8_weeks_shipped as six, " 
SQL = SQL & "reorder_weeks_shipped as seven, " 
SQL = SQL & "reorder_status_shipped as eight " 
SQL = SQL & "FROM RPAT.BBC_CDS" 

Set dyprod = oradatabase.CreateDynaset(SQL, 0&) 

Sheets("CDS Data").Select 
Row = 2 
     If Not dyprod.EOF And Not dyprod.bof Then 
       dyprod.movefirst 
         Do Until dyprod.EOF 
          Sheets("CDS Data").Cells(Row, 1).Select 
          ActiveCell.Value = dyprod.Fields("one").Value 
          Sheets("CDS Data").Cells(Row, 2).Select 
          ActiveCell.Value = dyprod.Fields("two").Value 
          Sheets("CDS Data").Cells(Row, 3).Select 
          ActiveCell.Value = dyprod.Fields("three").Value 
          Sheets("CDS Data").Cells(Row, 4).Select 
          ActiveCell.Value = dyprod.Fields("four").Value 
          Sheets("CDS Data").Cells(Row, 5).Select 
          ActiveCell.Value = dyprod.Fields("five").Value 
          Sheets("CDS Data").Cells(Row, 6).Select 
          ActiveCell.Value = dyprod.Fields("six").Value 
          Sheets("CDS Data").Cells(Row, 7).Select 
          ActiveCell.Value = dyprod.Fields("seven").Value 
          Sheets("CDS Data").Cells(Row, 8).Select 
          ActiveCell.Value = dyprod.Fields("eight").Value 
          dyprod.movenext 
          Row = Row + 1 
         Loop 
       End If 

    Range("A2").Select 

End Sub 

Благодаря SMORF

+2

Какая линия имеет место ошибка? Зачем использовать ActiveCell? Почему бы просто не поставить значение? – PaulFrancis

+0

Ошибка возникает в строке «ActiveCell.Value = dyprod.Fields (« пять »). Значение« ... Я всегда использовал ActiveCell ... никогда не было проблемы раньше? – SMORF

+0

Если вы используете '? ActiveCell.Value' в области VBE Immediate, вы получаете сообщение об ошибке? Что относительно '? Dyprod.Fields (« пять »). Value'? –

ответ

1

Без выбора (и используя Long как счетчик строк):

Sub SQL_CDS() 

Sheets("CDS Data").Select 

Dim SQL As String 
Dim orasession As Object 
Dim oradatabase As Object 
Dim dyprod As Object 
Dim Row As Long '<<<<<< avoid integer values when dealing with rows 

Application.ScreenUpdating = False 

Set orasession = CreateObject("OracleInProcServer.XOraSession") 'Create the OraSession Object. (Oracle) 
Set oradatabase = orasession.DbOpenDatabase("sid_cnded", "bo_bca_rep/bobcarep01", 0&) 'Create the OraDatabase Object by opening a connection to Oracle. 

SQL = SQL & "SELECT selection_no as one, " 
SQL = SQL & "selection_status as two, " 
SQL = SQL & "onhand_cds as three, " 
SQL = SQL & "allocated_cds as four, " 
SQL = SQL & "nr_date as five, " 
SQL = SQL & "last_8_weeks_shipped as six, " 
SQL = SQL & "reorder_weeks_shipped as seven, " 
SQL = SQL & "reorder_status_shipped as eight " 
SQL = SQL & "FROM RPAT.BBC_CDS" 

Set dyprod = oradatabase.CreateDynaset(SQL, 0&) 

Sheets("CDS Data").Select 'not required 

Row = 2 
If Not dyprod.EOF And Not dyprod.bof Then 
    dyprod.movefirst 
    Do Until dyprod.EOF 
      Sheets("CDS Data").Cells(Row, 1).Resize(1,8).Value = _ 
          Array(dyprod.Fields("one").Value, _ 
            dyprod.Fields("two").Value, _ 
            dyprod.Fields("three").Value, _ 
            dyprod.Fields("four").Value, _ 
            dyprod.Fields("five").Value, _ 
            dyprod.Fields("six").Value, _ 
            dyprod.Fields("seven").Value, _ 
            dyprod.Fields("eight").Value) 


     dyprod.movenext 
     Row = Row + 1 
    Loop 
End If 

Range("A2").Select 

End Sub 
+0

Большое спасибо Тиму, я также обнаружил, что база данных оракула содержит формат без даты, ожидается (31/12/0999 = значение ячейки 31/12/999). Это вызвало ошибку на строке 7625 - исправлено в SQL ... replace (to_char (nr_date, 'dd/mm/yyyy'), '0999', '9999') – SMORF

Смежные вопросы