-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


Ошибка: <Method 'Cells' of object '_Global' failed> при проверке количества строк

Пятница, 08 Сентября 2017 г. 08:40 + в цитатник
Добрый день!
Есть код в Access, который открывает Excell-файл и загружает из него строки в свою таблицу.
Перед загрузкой стоит строка проверки количества строк в Excel:
lLastRow = Cells.SpecialCells(xlLastCell).Row


Если код запустить первый раз, то он отрабатывает успешно. При этом, в процессах Windows появляется новый процесс: EXCEL.EXE. Почему-то после завершения процедуры этот процесс не закрывается (хотя есть xlt.Close (False)).
Если сразу снова запустить эту же процедуру, то возникает ошибка: <Method 'Cells' of object '_Global' failed> на строке:
lLastRow = Cells.SpecialCells(xlLastCell).Row

При этом, естественно, в процессах появился второй EXCEL.EXE, который не закрылся из-за ошибки.

Но если не удалять эти два процесса EXCEL.EXE, а перезапустить клиента Access и затем процедуру, то всё работает корректно, процедуру можно запускать несколько раз подряд, при этом, после её отработки второй процесс EXCEL.EXE успешно открывается и закрывается, а первый просто висит...

Если НЕ перезапускать клиента Access, а в диспетчере завершить все процессы EXCEL.EXE и запустить процедуру, то появится другая ошибка: <The remote server machine does not exist or is unavaliable>.

И наконец, если перезапустить клиента и удалить ВСЕ процессы EXCEL.EXE, то опять первый раз отработает корректно...

Просьба помочь разобраться, в чём суть ошибки, почему при (с виду) одних и тех же условиях, код то работает, то нет. Может я неправильно закрываю Excel?
Заранее благодарен!

Вот сама процедура целиком:
Private Sub РисунокЗагрузитьФайл_Click()
 
Dim Sht As String
Dim ln As String
Dim sg As String
Dim tm24 As String
Dim tm48 As String
Dim Line As String
Dim m_str() As String
Dim Shd_sur As String
Dim Shd_fir As String
Dim Shd_par As String
 
Dim time24 As Date
Dim time48 As Date
 
'###############################################
 
DoCmd.SetWarnings False
DoCmd.RunSQL "delete from свод" ' удалили всё из таблицы "свод"
DoCmd.SetWarnings True
 
'#############################################
 
DoCmd.SetWarnings False
Dim file As String
                                                  
' проверяем, есть ли файл в директории:
Dim path, nameFile
path = "\\tb-fs05\Department-2\SSI\Àíäðåé\ÓÐÂÊÊ\Âûãðóçêà_CRM"
nameFile = "Создать_документ.xlsx"
If Dir(path & "\" & nameFile) = "" Then ' если файла нет, выводим сообщение и выходим из процедуры:
  MsgBox "В папке " & path & " нет файла " & filename"
  Exit Sub
Else

        file = "\\tb-fs05\Department-2\SSI\УРВКК\Выгрузка\Создать_документ.xlsx"
       
        Set xl = CreateObject("Excel.Application")
        Set xlt = xl.Workbooks.Open(file)
 
    
    Dim llastrow As Long
    Dim k As Long
   
    llastrow = Cells.SpecialCells(xlLastCell).row ' нашли количество заполненных строк в Excel
   
    
      For k = 1 To llastrow
        Shd = xlt.ActiveSheet.Cells(k + 1, 9).Value ' ФИО
        Sht = xlt.ActiveSheet.Cells(k + 1, 10).Value ' дата регистрации
        DrN = xlt.ActiveSheet.Cells(k + 1, 14).Value 'номер
        Car = xlt.ActiveSheet.Cells(k + 1, 18).Value 'этап
        sg = xlt.ActiveSheet.Cells(k + 1, 3).Value 'группа
         
             
                              
        'удаляем апостроф, если он найден в ФИО
        Shd = Replace(Shd, "'", "")
                       
        '=================================================================
        ' расчёт количества слов в ячейке:
                Dim iStr As String  'исходная строка
                Dim b As String     'строка без пробелов
                Dim x As String     'текущий символ в строке
                Dim i As Integer    'номер текущего символа
                Dim j As Integer    'счётчик пробелов
                Dim y As Integer    'количество слов
                iStr = Shd
                b = Trim(iStr)
                j = 0
                For i = 1 To Len(b)
                x = Mid(b, i, 1)
                If x = " " Then j = j + 1
                Next i
                y = j + 1 ' записали количество слов в переменную
        '====================================================================
                 
        m_str() = Split(Shd, " ")
        If Shd <> "" Then  'ïпроверяем ячейку с ФИО на значение NULL
               
                If y = 3 Then 'если полное ФИО
               
                Shd_sur = m_str(0) ' выделили фамилию
                Shd_fir = m_str(1) ' имя
                Shd_par = m_str(2) ' отчество
               
                Set rstLine = Nothing
                 ' в таблице users нашли данного сотрудника:
                Sqltext = "Select users.surname, users.first_name, users.patronymic, users.line_id" _
                & " FROM users WHERE (CAST(surname as varchar) = '" & Shd_sur & "') And (CAST(first_name as varchar) = '" & Shd_fir & "') And (CAST (patronymic as varchar) = '" & Shd_par & "');"
                rstLine.Open Sqltext, cn, adOpenKeyset, adLockOptimistic
               
                ElseIf y = 2 Then ' если нет отчества:
               
                Shd_sur = m_str(0) ' фамилия
                Shd_fir = m_str(1) ' имя
                Shd_par = ""       ' пусто
               
                Set rstLine = Nothing
                Sqltext = "Select users.surname, users.first_name, users.patronymic, users.line_id" _
                & " FROM users WHERE (CAST(surname as varchar) = '" & Shd_sur & "') And (CAST(first_name as varchar) = '" & Shd_fir & "');"
                rstLine.Open Sqltext, cn, adOpenKeyset, adLockOptimistic
               
                End If
               
        End If
       
     
            If rstLine.RecordCount > 0 Then проверяем, найден ли сотрудник в таблице users
            If (rstLine.Fields(3) = 26) Or (rstLine.Fields(3) = 27) Then ' проверяем доп. условия
           
             If (sg = "Жалобы") Or (sg = "Претензии") Then

            If Shd Like FIO Then
        
    ' ###################### далее расчёт временных интервалов ################################
            
            
            Sht = DateAdd("h", 7, CDate(Sht))
           
            Sht = DateAdd("h", -24, CDate(Sht)) ' ñíà÷àëà îòíèìàåì 24 ÷àñà, ÷òîáû â öèêëå ïðèáàâèòü è ñíîâà âûéòè íà âðåìÿ ðåãèñòðàöèè
            
             Do
             Sht = DateAdd("h", 24, CDate(Sht)) 
            
             Set rstTimeReg = Nothing
            
             Sqltext = "Select id, ddmmyy, output, holiday FROM Calendar WHERE ddmmyy = '" & (Format(Sht, "yyyy-mm-dd")) & "';"
             rstTimeReg.Open Sqltext, cn, adOpenKeyset, adLockOptimistic
                            
                          
            Loop While ((rstTimeReg.Fields(2) = 1) Or (rstTimeReg.Fields(3) = 1)) 
          
             tm24 = Sht
           
             Do
             tm24 = DateAdd("h", 24, CDate(tm24))
            
             Set rstTime24 = Nothing
           
             Sqltext = "Select id, ddmmyy, output, holiday FROM Calendar WHERE ddmmyy = '" & (Format(tm24, "yyyy-mm-dd")) & "';"
             rstTime24.Open Sqltext, cn, adOpenKeyset, adLockOptimistic
                            
                          
            Loop While ((rstTime24.Fields(2) = 1) Or (rstTime24.Fields(3) = 1)) 
                         
            tm48 = tm24
                       
            Do
             tm48 = DateAdd("h", 24, CDate(tm48))
            
             Set rstTime48 = Nothing
            
             Sqltext = "Select id, ddmmyy, output, holiday FROM Calendar WHERE ddmmyy = '" & (Format(tm48, "yyyy-mm-dd")) & "';"
             rstTime48.Open Sqltext, cn, adOpenKeyset, adLockOptimistic
                            
             Loop While ((rstTime48.Fields(2) = 1) Or (rstTime48.Fields(3) = 1)) 
    '#################################################################################
                                                                     
         ' если все проверки прошли и интервалы вычислили, добавляем строку в таблицу access:
          DoCmd.RunSQL "INSERT INTO свод(ФИО,Дата, Номер, Этап, остаток_24, остаток_48) select '" & Shd & "','" & Sht & "','" & DrN & "','" & Car & "', '" & tm24 & "', '" & tm48 & "'"
       
        
        End If
        End If
        End If
        End If
               
      Next k ' перешли к следующей записи
   
 xlt.Close (False) ' закрыли Excel
 
   
End If
  
   
DoCmd.SetWarnings True
 
' обновляем поля формы:
Sqltext = "SELECT Код, ФИО, Дата, Номер, Этап, остаток_24, остаток_48" _
& " FROM свод order by CDate(остаток_48) DESC"
 
Set rstaccess_local = Nothing
rstaccess_local.Open Sqltext, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Set Me.Form.Recordset = rstaccess_local
  
End Sub

http://www.sql.ru/forum/1270950/oshibka-method-cells-of-object-global-failed-pri-proverke-kolichestva-strok


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку