Что нового

Поиск текста в Excel через COM объекты

Dezex

Новичок
Сообщения
7
Репутация
0
Всем привет!
Я обрабатываю (вытягиваю данные) таблицу excel через его объекты, и возникла досадная проблема: мне нужен результат поиск некоторого текста, т.е. есть он или нет, я попробовал так:

Код:
$d =  $FileOpen.Cells.Find("1",Default, $xlValues, $xlPart, $xlByRows, $xlNext, Default)
MsgBox(0,"",$d)


Но переменная $d всегда пустая (даже если текст есть). Копался в просторах интернета и возникла аналогия вот с этим VB кодом, которая ей и осталась:
Код:
Sub Find_Macro()
    mystring = "mystring"
    Set RangeObj = Cells.Find(What:=mystring, After:=ActiveCell, _
    LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, MatchCase:=False)
    If RangeObj Is Nothing Then MsgBox "Not Found" Else RangeObj.Select
End Sub

Вот полный мой тестовый код:
Код:
#include<Excel.au3>
#include<Array.au3>
#include <File.au3>


Func Activate($T); функция находит ячейку с текстом, акт-т ее
   .Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Activate ;поиск ячейки с текстом "..."
EndFunc

$Exp_Dir = "C:\Documents and Settings\Администратор\Рабочий стол\1\"

$hFile = FileFindFirstFile($Exp_Dir&"*.xls")

$sFile = FileFindNextFile($hFile)
If @error Then
   MsgBox(0,"","Нет файла Excel")
EndIf

$FileOpen = _ExcelBookOpen($Exp_Dir&$sFile,0,True)
If $FileOpen == -1 Then
   MsgBox(4096,"Ошибка открытия файла", "Файл "&$sFile&" не был открыт")
   Exit
EndIf

 $d =  $FileOpen.Cells.Find("1",Default, $xlValues, $xlPart, $xlByRows, $xlNext, Default)
 MsgBox(0,"",$d)
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Re: Метод Find в Excel

Код:
#include<Excel.au3>
#include<Array.au3>
#include <File.au3>

Func Activate($File,$T); функция находит ячейку с текстом, акт-т ее
   $d = $File.Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Activate ;поиск ячейки с текстом "..."
   MsgBox(0,"",$d)
EndFunc

$Exp_Dir = "C:\1\"

$hFile = FileFindFirstFile($Exp_Dir&"*.xls")

$sFile = FileFindNextFile($hFile)
If @error Then
   MsgBox(0,"","Нет файла Excel")
EndIf

$FileOpen = _ExcelBookOpen($Exp_Dir&$sFile,0,True)
If $FileOpen == -1 Then
   MsgBox(4096,"Ошибка открытия файла", "Файл "&$sFile&" не был открыт")
   Exit
EndIf

Activate($FileOpen,"2")
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Re: Метод Find в Excel

Немного переделал
Код:
#include<Excel.au3>
#include<Array.au3>
#include <File.au3>

Func StrExist($File,$T); функция находит ячейку с текстом, акт-т ее
   $d = $File.Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Activate ;поиск ячейки с текстом "..."
   If Not $d==True Then
	  Return False
   EndIf
   Return True
EndFunc

$Exp_Dir = "C:\1\"

$hFile = FileFindFirstFile($Exp_Dir&"*.xls")

$sFile = FileFindNextFile($hFile)
If @error Then
   MsgBox(0,"","Нет файла Excel")
EndIf

$FileOpen = _ExcelBookOpen($Exp_Dir&$sFile,0,True)
If $FileOpen == -1 Then
   MsgBox(4096,"Ошибка открытия файла", "Файл "&$sFile&" не был открыт")
   Exit
EndIf


$rezult = StrExist($FileOpen,"1")
MsgBox(0,'окошко',$rezult)

_ExcelBookClose($FileOpen)
 
Автор
D

Dezex

Новичок
Сообщения
7
Репутация
0
Re: Метод Find в Excel

СН3СН2ОН сказал(а):
Немного переделал
Код:
#include<Excel.au3>
#include<Array.au3>
#include <File.au3>

Func StrExist($File,$T); функция находит ячейку с текстом, акт-т ее
   $d = $File.Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Activate ;поиск ячейки с текстом "..."
   If Not $d==True Then
	  Return False
   EndIf
   Return True
EndFunc

$Exp_Dir = "C:\1\"

$hFile = FileFindFirstFile($Exp_Dir&"*.xls")

$sFile = FileFindNextFile($hFile)
If @error Then
   MsgBox(0,"","Нет файла Excel")
EndIf

$FileOpen = _ExcelBookOpen($Exp_Dir&$sFile,0,True)
If $FileOpen == -1 Then
   MsgBox(4096,"Ошибка открытия файла", "Файл "&$sFile&" не был открыт")
   Exit
EndIf


$rezult = StrExist($FileOpen,"1")
MsgBox(0,'окошко',$rezult)

_ExcelBookClose($FileOpen)

Проблема остается и заключается как раз в строчке

Код:
$d = $File.Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Activate


Все хорошо работает когда искомый текст есть, но если его нет то вылетает ошибка

Код:
$d = $File.Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Address
$d = $File.Cells.Find($T,Default, $xlValues, $xlPart, $xlByRows, $xlNext)^ ERROR

Ее не будет если убрать .Active, но и работать правильно тоже не будет. Единственно, что пришло в голову это использование

Код:
ObjEvent


Но я не знаю как
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Re: Метод Find в Excel

Мой второй код отлично работает.
Отлично это- Win Xp Sp3, последний AutoIT, MSOfice 2007 SP1, Исходный файл *.xls
 
Автор
D

Dezex

Новичок
Сообщения
7
Репутация
0
Re: Метод Find в Excel

У меня лишь отличие в офисе - 2010.
Даже не знаю, буду ждать др. решений....



Добавлено:
Сообщение автоматически объединено:

Изменил тему, м.б. интерес к вопросу будет больше :smile:
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Проверил в MSOfice 2003, 2010
Если искомого текста нет, то ошибка.

Попробовал макрос создать в самом Excel, такая же ошибка, если нет искомого текста
Код:
Sub Макрос1()
' Макрос1
    Cells.Find(What:="test", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
End Sub
 
Автор
D

Dezex

Новичок
Сообщения
7
Репутация
0
Проблема с макросом решается (в начале указывал). А вот с Autoit дело так и не сдвинулось :scratch:
Сильные Autoit_а сего не заходят сюда :smile:
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Dezex, я просто хотел сказать, что во всех офисах ошибка

Перевел твой макрос
Код:
If RangeObj Is Nothing Then MsgBox "Not Found" Else RangeObj.Select
в код Autoit

Код:
#include<Excel.au3>

$sPath = @ScriptDir&"\Лист Microsoft Excel.xlsx"
$oExcel = _ExcelBookOpen($sPath,1,True)

$Text=1
;$rezult = $oExcel.Cells.Find($Text,Default, $xlValues, $xlPart, $xlByRows, $xlNext,False).Activate
$rezult = $oExcel.Cells.Find($Text,Default, $xlValues, $xlPart, $xlByRows, $xlNext,False)
If IsObj($rezult)=0 Then
	MsgBox(16,'Внимание','Текст не найден')
Else
	$rezult.Activate
	; Aдрес активной ячейки
	With $oExcel.ActiveCell
		MsgBox(64, 'Поиск удался', 'Адрес активной ячейки: ' & .Address& @CRLF & _
				   'Адрес № строки: ' & .Row&@CRLF & _
				   'Адрес № колонки: ' & .Column)
	EndWith
EndIf

Exit


И все работает ;)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Чтоб работая с объектом скрипт не вылетал от ошибок используется следующая конструкция:
Код:
$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Func MyErrFunc()		
EndFunc
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
sngr, а ты попробуй именно с этим примером конструкцию

У меня не получилось, что не так?

Код:
#include<Excel.au3>

Global $Error=0
Global $oError=ObjEvent("AutoIt.Error","ErrFunc") ; Initializes COM handler.
$sPath = @ScriptDir&"\Лист Microsoft Excel.xlsx"

$oExcel = _ExcelBookOpen($sPath,1,True)

$Text=10
$rezult = $oExcel.Cells.Find($Text,Default, $xlValues, $xlPart, $xlByRows, $xlNext).Activate
If $Error=1 Then Exit
; Aдрес активной ячейки
With $oExcel.ActiveCell
	MsgBox(64, 'Поиск удался', 'Адрес активной ячейки: ' & .Address& @CRLF & _
			   'Адрес № строки: ' & .Row&@CRLF & _
			   'Адрес № колонки: ' & .Column)
EndWith


; Функция перехватчик COM-ошибок
Func ErrFunc()
  $HexNumber=hex($oError.number,8)
  $ErrorText="err.description is: "    & @TAB & $oError.description    & @CRLF & _
             "err.windescription:"     & @TAB & $oError.windescription & @CRLF & _
             "err.number is: "         & @TAB & $HexNumber              & @CRLF & _
             "err.lastdllerror is: "   & @TAB & $oError.lastdllerror   & @CRLF & _
             "err.scriptline is: "     & @TAB & $oError.scriptline     & @CRLF & _
             "err.source is: "         & @TAB & $oError.source         & @CRLF & _
             "err.helpfile is: "       & @TAB & $oError.helpfile       & @CRLF & _
             "err.helpcontext is: "    & @TAB & $oError.helpcontext

	MsgBox(16,'Произошла ошибка',$ErrorText)
 	$Error=1 	; Ошибка запроса
EndFunc
 
Автор
D

Dezex

Новичок
Сообщения
7
Репутация
0
pvnn спасибо!!! :ok:
Я уже и не надеялся ;D Теперь вообще бездельничать буду
Т.е. получается, что если поиск не дал результата, то $rezult - логическая переменная, если я правильно понял :smile:
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Dezex
$rezult в случае удачного поиска является типом данных объект.
Поэтому и проверяем на этот тип данных.

В справке: IsObj ( variable )
 
Верх