Что нового

[Ошибки] Ошибка: Variable must be of type "Object"

x-vit

Новичок
Сообщения
8
Репутация
0
Всем здравствуйте!

Суть скрипта:
Ищем файлы в папке меняем в них данные. И Все это по циклу. В каких папках искать и на что менять берём из exel.xlsm
Проблема:
Без циклов скрипт работает хорошо. Делает 2-4 цикла тоже хорошо. Но в какой-то момент слетает и выдает ошибку: Variable must be of type "Object" (есть подозрение что после определённо количества замен)

Сам скрипт:
Код:
;ДАННЫЕ
#include <Excel.au3>
#Include <File.au3>
$Povtor = InputBox("Колличество цыклов","Введите колличество цыклов") ;Количество цыклов

For $j = 1 To $Povtor
;==============================================================================
;ЗАПУСК EXCEL
Local $oAppl = _Excel_Open()
$BookAvto=_Excel_BookOpen($oAppl, @ScriptDir & '\Exel.xlsm')
;Определение переменных из Excel
$BookAvto.Worksheets("Лист1").Range("A1").Select ;Выбираем ячейку
$BookAvto.ActiveSheet.Application.Run("Копировать") ;Копируем ячейку в буфер обмена
$Papka=ClipGet() ;Присваиваем значение перемнной из буфера
$BookAvto.Worksheets("Лист1").Range("A1").Select ;Выбираем ячейку
$BookAvto.ActiveSheet.Application.Run("Копировать") ;Копируем ячейку в буфер обмена
$Zamena=ClipGet() ;Присваиваем значение перемнной из буфера
MsgBox(0, 'Циклы - ПРОЦЕСС', 'Номер цыкла: '&$j&' из '&$Povtor&'', 1)

;==============================================================================
;ПОИСК И ЗАМЕНА В ФАЙЛАХ
_FindFiles_1('C:\Песочница\'&Papka&'', '*.*') ;Замена в *.htm

;==============================================================================
;УДАЛЕНИЕ СТРОКИ EXEL
Local $oAppl = _Excel_Open()
$BookAvto=_Excel_BookOpen($oAppl, @ScriptDir & '\Exel.xlsm')
$BookAvto.ActiveSheet.Application.Run("Сместить") ;Сместить
Sleep(100)
Next

MsgBox(0, 'Циклы - КОНЕЦ', 'КОНЕЦ!' & @CR & 'Сделано цыклов: '&$Povtor&'')

;ФУНКЦИЯ ПОИСКА И ЗАМЕНЫ
Func _FindFiles_1($sRoot, $sFile)
    Local $FileList
    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
            $Read = FileRead($sRoot & '\' & $FileList[$i]) ;Считываем файл
            $Replace = StringRegExpReplace($Read, 'Что нужно заменить', $Zamena ) ;Делаем изменение
            FileDelete($sRoot & '\' & $FileList[$i]) ;Удаляем файл
            FileWrite($sRoot & '\' & $FileList[$i], $Replace) ;На его место записываем измененный файл
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles_1($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
EndFunc


Скрин ошибки:
8r04X4H4yNweZ
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Возможно, причине не в этом . но у Вас в цикле, да ещё дважды создаётся экземпляр Excel
Код:
Local $oAppl = _Excel_Open()
попробуйте перед циклом создать, а после цикла закрыть , например
Код:
Local $oAppl = _Excel_Open()
For $j = 1 To $Povtor
;....................
Next
_Excel_Close($oAppl)

и убрать внутри цикла все "_Excel_Open()"
 
Автор
X

x-vit

Новичок
Сообщения
8
Репутация
0
Спасибо, но не помогло!
Для наглядности, сделал так:
Код:
;ДАННЫЕ
#include <Excel.au3>
#Include <File.au3>
$Povtor = InputBox("Колличество цыклов","Введите колличество цыклов") ;Количество цыклов

;ЗАПУСК EXCEL
Local $oAppl = _Excel_Open()
$BookAvto=_Excel_BookOpen($oAppl, @ScriptDir & '\Exel.xlsm')

For $j = 1 To $Povtor
;==============================================================================
;Определение переменных из Excel
$BookAvto.Worksheets("Лист1").Range("A1").Select ;Выбираем ячейку
$BookAvto.ActiveSheet.Application.Run("Копировать") ;Копируем ячейку в буфер обмена
$Papka=ClipGet() ;Присваиваем значение перемнной из буфера
$BookAvto.Worksheets("Лист1").Range("A1").Select ;Выбираем ячейку
$BookAvto.ActiveSheet.Application.Run("Копировать") ;Копируем ячейку в буфер обмена
$Zamena=ClipGet() ;Присваиваем значение перемнной из буфера
MsgBox(0, 'Циклы - ПРОЦЕСС', 'Номер цыкла: '&$j&' из '&$Povtor&'', 1)

;==============================================================================
;ПОИСК И ЗАМЕНА В ФАЙЛАХ
_FindFiles_1('C:\Песочница\'&Papka&'', '*.*') ;Замена

;==============================================================================
;УДАЛЕНИЕ СТРОКИ EXEL
Local $oAppl = _Excel_Open()
$BookAvto=_Excel_BookOpen($oAppl, @ScriptDir & '\Exel.xlsm')
$BookAvto.ActiveSheet.Application.Run("Сместить") ;Сместить
Sleep(100)
Next

_Excel_Close($oAppl)

MsgBox(0, 'Циклы - КОНЕЦ', 'КОНЕЦ!' & @CR & 'Сделано цыклов: '&$Povtor&'')

;ФУНКЦИЯ ПОИСКА И ЗАМЕНЫ
Func _FindFiles_1($sRoot, $sFile)
    Local $FileList
    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
            $Read = FileRead($sRoot & '\' & $FileList[$i]) ;Считываем файл
            $Replace = StringRegExpReplace($Read, 'Что нужно заменить', $Zamena ) ;Делаем изменение
            FileDelete($sRoot & '\' & $FileList[$i]) ;Удаляем файл
            FileWrite($sRoot & '\' & $FileList[$i], $Replace) ;На его место записываем измененный файл
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles_1($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
EndFunc
 
Автор
X

x-vit

Новичок
Сообщения
8
Репутация
0
Спасибо но опять увы(

Исправленный скрипт выглядит так:
Код:
;ДАННЫЕ
#include <Excel.au3>
#Include <File.au3>
$Povtor = InputBox("Колличество цыклов","Введите колличество цыклов") ;Количество цыклов

;ЗАПУСК EXCEL
Local $oAppl = _Excel_Open()
$BookAvto=_Excel_BookOpenEX($oAppl, @ScriptDir & '\Exel.xlsm')

For $j = 1 To $Povtor
;==============================================================================
;Определение переменных из Excel
$BookAvto.Worksheets("Лист1").Range("A1").Select ;Выбираем ячейку
$BookAvto.ActiveSheet.Application.Run("Копировать") ;Копируем ячейку в буфер обмена
$Papka=ClipGet() ;Присваиваем значение перемнной из буфера
$BookAvto.Worksheets("Лист1").Range("A1").Select ;Выбираем ячейку
$BookAvto.ActiveSheet.Application.Run("Копировать") ;Копируем ячейку в буфер обмена
$Zamena=ClipGet() ;Присваиваем значение перемнной из буфера
MsgBox(0, 'Циклы - ПРОЦЕСС', 'Номер цыкла: '&$j&' из '&$Povtor&'', 1)

;==============================================================================
;ПОИСК И ЗАМЕНА В ФАЙЛАХ
_FindFiles_1('C:\Песочница\'&Papka&'', '*.*') ;Замена

;==============================================================================
;УДАЛЕНИЕ СТРОКИ EXEL
$BookAvto.ActiveSheet.Application.Run("Сместить") ;Сместить
Sleep(100)
Next

_Excel_Close($oAppl)

MsgBox(0, 'Циклы - КОНЕЦ', 'КОНЕЦ!' & @CR & 'Сделано цыклов: '&$Povtor&'')

;ФУНКЦИЯ ПОИСКА И ЗАМЕНЫ
Func _FindFiles_1($sRoot, $sFile)
    Local $FileList
    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
            $Read = FileRead($sRoot & '\' & $FileList[$i]) ;Считываем файл
            $Replace = StringRegExpReplace($Read, 'Что нужно заменить', $Zamena ) ;Делаем изменение
            FileDelete($sRoot & '\' & $FileList[$i]) ;Удаляем файл
            FileWrite($sRoot & '\' & $FileList[$i], $Replace) ;На его место записываем измененный файл
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles_1($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
EndFunc

Func _Excel_BookOpenEX($oExcel, $sFilePath, $bReadOnly = Default, $bVisible = Default, $sPassword = Default, $sWritePassword = Default, $bUpdateLinks = Default)
    ; Error handler, automatic cleanup at end of function
    Local $oError = ObjEvent("AutoIt.Error", "__Excel_COMErrFunc")
    #forceref $oError
    If Not IsObj($oExcel) Or ObjName($oExcel, 1) <> "_Application" Then Return SetError(1, @error, 0)
    If Not FileExists($sFilePath) Then Return SetError(2, 0, 0)
    If $bReadOnly = Default Then $bReadOnly = False
    If $bVisible = Default Then $bVisible = True
    Local $oWorkbook = $oExcel.Workbooks.Open($sFilePath, $bUpdateLinks, $bReadOnly, Default, $sPassword, $sWritePassword)
    If @error Then Return SetError(3, @error, 0)
    Local $oWindow = $oExcel.Windows($oWorkbook.Name) ; <== Modified
    If IsObj($oWindow) Then $oWindow.Visible = $bVisible ; <== Modified
    ; If a read-write workbook was opened read-only then set @extended = 1
    If $bReadOnly = False And $oWorkbook.Readonly = True Then Return SetError(0, 1, $oWorkbook)
    Return $oWorkbook
EndFunc   ;==>_Excel_BookOpen
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
x-vit
Увы что?
Во-первых, ваш скрипт не запускается из-за опечатки в строке
Код:
_FindFiles_1('C:\Песочница\'&Papka&'', '*.*') ;Замена

Во-вторых, после замены функции ошибка должна быть другая (или как минимум в другой строке).
Мы сами должны догадаться, что у вас там "увы"?
 
Автор
X

x-vit

Новичок
Сообщения
8
Репутация
0
Извините, не ругайтесь :smile:
Сейчас скрип работает также,
т.е. задаю ему 10 циклов он делает 4 и останавливается.

Но верно ошибка другая, вернее её нет!
Пишет в консоли следующее:
!>17:26:15 AutoIt3.exe ended.rc:-1073741819
+>17:26:15 AutoIt3Wrapper Finished.
>Exit code: 3221225477 Time: 41.25
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
x-vit
AutoIt3.exe ended.rc:-1073741819
А это уже аварийное завершение. Здесь уже сложно чем-то помочь.

Можете после каждой строки в скрипте прописать вывод в консоль или в файл (типа трассировки). Тогда хоть примерно узнаете после какой строки это происходит. Если это как-то с макросами связано - попробуйте макрос переписать или найти другой способ "копировать" и "сместить".

Или, как вам inververs предложил, попробуйте предыдущую версию AutoIt.
 
Автор
X

x-vit

Новичок
Сообщения
8
Репутация
0
Хорошо, всем спасибо!
Попробую предыдущую ещё версию.

Но пока нашел кривой способ что работало всё:
1. Скрипт №1 (выше указанный) оставляю без циклов
2. Запускаю его отдельным Скриптом №2 нужное количество циклов.

Так Всё работает хот 50 циклов
 
Верх