Что нового

Выделение ячейки Excel и поиск в других книгах

foxGun

Новичок
Сообщения
11
Репутация
0
Версия AutoIt: 3.3.6.1

Описание:
1 выделить ячейку в книге Excel кликом мышки , и поиск выделенного в файле базы данных БАЗА.xls
2 вывести найденную информацию в диалоговое окно GUI .

Примечания:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
F

foxGun

Новичок
Сообщения
11
Репутация
0
в открытой книге Задание.xls выделить ячейку с данными для поиска. " наименование гарнитура "
ячейка $n = "наименование"
искать выделенное ($n) по в книге База.xls в первой колонке
вывести результат поиска строки $i. в диалоговое окно строка $i , колонка 1 " наименование " ,
колонка 2 " комплектация "
колонка 3 " Цвет "
колонка 4 " Количество "
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
foxGun,
А можно прикрепить примеры(образцы) файлов задание и база?
Не дождался :smile:

Попробуйте так:
Код:
#include <Excel.au3>
#include <Array.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sFileWhatFind = @ScriptDir & '\WhatFind.xls', $sFileDataBase = @ScriptDir & '\DataBase.xls', _
		$aWhatFind, $sStringReturn, $iStringNumber

If Not FileExists($sFileWhatFind) Or Not FileExists($sFileDataBase) Then
	MsgBox(16, 'Error', 'Отсутствуют необходимые файлы')
	Exit
EndIf

$aWhatFind = _Read_Excel_Table($sFileWhatFind, 'Задание', 2, 1, 0, 2)
If @error Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
_Check_Task_Array($sFileDataBase, $aWhatFind)

For $i = 1 To $aWhatFind[0][0]
	$sStringReturn = _Search_In_DataBase($sFileDataBase, $aWhatFind[$i][1], $aWhatFind[$i][2])
	$iStringNumber = @extended
	MsgBox(64, '№' & $i & '(' & $aWhatFind[0][0] & ')', 'Искали: ' & $aWhatFind[$i][2] & ', в разделе: ' & _
			$aWhatFind[$i][1] & @LF & @LF & 'Результат поиска:' & @LF & $sStringReturn & @LF & 'Строка № ' & _
			$iStringNumber)
Next
MsgBox(64, 'Info', 'Все :)')

Func _Search_In_DataBase($s_FileDataBase, $s_Section, $s_WhatFind)
	Local $a_SearchArray, $i_Index, $s_Return_String

	$a_SearchArray = _Read_Excel_Table($s_FileDataBase, $s_Section)
	If @error Then Return SetError(1, -1, 'Error')
	$i_Index = _ArraySearch($a_SearchArray, $s_WhatFind, 1, 0, 1, 0, 1, 1)
	If $i_Index = -1 Then Return SetError(0, -1, 'Отсутствует')
	For $i = 1 To $a_SearchArray[0][1]
		$s_Return_String &= $a_SearchArray[$i_Index][$i] & '|'
	Next
	Return SetError(0, $i_Index + 1, StringTrimRight($s_Return_String, 1))
EndFunc   ;==>_Search_In_DataBase

Func _Check_Task_Array($s_FileDataBase, ByRef $a_Array, $f_Visible = 0)
	Local $o_Excel, $a_Sheet

	$o_Excel = _ExcelBookOpen($s_FileDataBase, $f_Visible)
	If @error Then Return
	$a_Sheet = _ExcelSheetList($o_Excel)
	If @error Then
		_ExcelBookClose($o_Excel)
		Return SetError(1)
	EndIf
	_ExcelBookClose($o_Excel)
	For $i = $a_Array[0][0] To 1 Step -1
		If _ArraySearch($a_Sheet, $a_Array[$i][1], 1) = -1 Then
			_ArrayDelete($a_Array, $i)
			$a_Array[0][0] -= 1
		EndIf
	Next
EndFunc   ;==>_Check_Task_Array

Func _Read_Excel_Table($s_FilePath, $s_Sheet, $i_StartRow = 2, $i_StartColumn = 1, $i_RowCnt = 0, $i_ColCnt = 0, $f_Visible = 0)
	Local $o_Excel, $a_ReturnArray

	$o_Excel = _ExcelBookOpen($s_FilePath, $f_Visible)
	If @error Then Return SetError(1, 0, -1)
	_ExcelSheetActivate($o_Excel, $s_Sheet)
	If @error Then
		_ExcelBookClose($o_Excel)
		Return SetError(1, 0, -1)
	EndIf
	$a_ReturnArray = _ExcelReadSheetToArray($o_Excel, $i_StartRow, $i_StartColumn, $i_RowCnt, $i_ColCnt)
	If @error Then
		_ExcelBookClose($o_Excel)
		Return SetError(1, 0, -1)
	EndIf
	_ExcelBookClose($o_Excel)
	Return SetError(0, 0, $a_ReturnArray)
EndFunc   ;==>_Read_Excel_Table

Образцы файлов с базой и заданием для поиска в прикрепленном архиве. Все три файла (2 Excel и 1 au3) должны лежать в одной папке.
 
Автор
F

foxGun

Новичок
Сообщения
11
Репутация
0
код работает, но не так как было изначально задумано...
хотелось чтоб .. в открытом файле WhatFind.xls кликом мыши выделяем ячейку которую надо искать.ячейка копируется автоматически в переменную для поиска, и тогда производился поиск скопированного, и возврат результатов поиска для последующей работы с ним. :smile: в остальное время скрипт ждет действия мышкой с файлом. и запустится только как будет выделена любая ячейка в файле WhatFind.xls
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
foxGun,
Попробуйте так:
Код:
#NoTrayIcon
#include <Excel.au3>
#include <Array.au3>
#include <Misc.au3>
#include <Constants.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)
Opt('WinTitleMatchMode', 2)

Global $sFileWhatFind = @ScriptDir & '\WhatFind.xls', $sFileDataBase = @ScriptDir & '\DataBase.xls', _
		$aWhatFind[2][2], $sStringReturn, $iStringNumber, $fWhatFind, $iRowOld, $iColOld, $oError, $iError, _
		$nItemExit, $nMsg

If Not FileExists($sFileWhatFind) Or Not FileExists($sFileDataBase) Then
	MsgBox(16, 'Error', 'Отсутствуют необходимые файлы')
	Exit
EndIf

$oError = ObjEvent('AutoIt.Error', '_ErrFunc')

$nItemExit = TrayCreateItem('Выход   Esc')
TraySetClick(9)
TraySetState()

AdlibRegister('_WhatFind_Exists', 50)

While 1
	If $fWhatFind Then
		If _IsPressed('01') Then
			AdlibUnRegister('_WhatFind_Exists')
			While _IsPressed('01')
				Sleep(10)
			WEnd
			_Get_WhatFind_Array($aWhatFind)
			If $aWhatFind[0][0] Then
				TrayItemSetState($nItemExit, $TRAY_DISABLE)
				TrayTip('Поиск в базе', 'Идет поиск:' & @LF & $aWhatFind[1][1] & ', в разделе: ' & _
						$aWhatFind[1][0] & @LF & 'подождите...', 5, 1)
				$sStringReturn = _Search_In_DataBase($sFileDataBase, $aWhatFind)
				$iStringNumber = @extended
				TrayTip('', '', 1)
				MsgBox(64, 'Результат поиска', 'Искали: ' & $aWhatFind[1][1] & ', в разделе: ' & _
						$aWhatFind[1][0] & @LF & @LF & 'Результат поиска:' & @LF & $sStringReturn & @LF & 'Строка № ' & _
						$iStringNumber)
			EndIf
			TrayItemSetState($nItemExit, $TRAY_ENABLE)
			AdlibRegister('_WhatFind_Exists', 50)
		EndIf
	EndIf
	$nMsg = TrayGetMsg()
	Switch $nMsg
		Case 0
			ContinueLoop
		Case $nItemExit
			Exit
	EndSwitch
WEnd

Func _Get_WhatFind_Array(ByRef $a_Array)
	Local $o_Excel, $i_Row, $i_Col

	_WhatFind_Exists()
	If Not $fWhatFind Then Return
	$a_Array[0][0] = 0
	$o_Excel = _ExcelBookAttach($sFileWhatFind)
	If @error Then Return
	_WhatFind_Exists()
	If Not $fWhatFind Then Return
	$i_Row = $o_Excel.Application.ActiveCell.Row
	$i_Col = $o_Excel.Application.ActiveCell.Column
	If $iError Then
		$iError = 0
		$iRowOld = 0
		$iColOld = 0
		Return
	EndIf
	If $i_Row > 1 Then
		If ($iRowOld <> $i_Row Or $iColOld <> $i_Col) Then
			$iRowOld = $i_Row
			$iColOld = $i_Col
		Else
			Return
		EndIf
		Switch $iColOld
			Case 1
				$a_Array[1][0] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld)
				If @error Then Return
				$a_Array[1][1] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld + 1)
				If @error Then Return
				If (Not $a_Array[1][0] Or Not $a_Array[1][1]) Then Return
				$a_Array[0][0] = 1
			Case 2
				$a_Array[1][0] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld - 1)
				If @error Then Return
				$a_Array[1][1] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld)
				If @error Then Return
				If (Not $a_Array[1][0] Or Not $a_Array[1][1]) Then Return
				$a_Array[0][0] = 1
		EndSwitch
	EndIf
	Return
EndFunc   ;==>_Get_WhatFind_Array

Func _WhatFind_Exists()
	Local $s_FileWhatFind = 'WhatFind.xls', _
			$s_Title = '[Title:' & $s_FileWhatFind & ';Class:XLMAIN]'
	If WinActive($s_Title) Then
		$fWhatFind = True
	Else
		$aWhatFind[0][0] = 0
		$fWhatFind = False
	EndIf
EndFunc   ;==>_WhatFind_Exists

Func _Search_In_DataBase($s_FileDataBase, ByRef $a_Array)
	Local $a_SearchArray, $i_Index, $s_Return_String, $a_Sheet

	_Check_Task_Array($s_FileDataBase, $a_Array)
	If Not $a_Array[0][0] Then Return SetError(0, -1, 'В базе нет листа ' & $a_Array[1][0])
	$a_SearchArray = _Read_Excel_Table($s_FileDataBase, $a_Array[1][0])
	If @error Then Return SetError(1, -1, 'Error')
	$i_Index = _ArraySearch($a_SearchArray, $a_Array[1][1], 1, 0, 1, 0, 1, 1)
	If $i_Index = -1 Then Return SetError(0, -1, 'Отсутствует')
	For $i = 1 To $a_SearchArray[0][1]
		$s_Return_String &= $a_SearchArray[$i_Index][$i] & '|'
	Next
	Return SetError(0, $i_Index + 1, StringTrimRight($s_Return_String, 1))
EndFunc   ;==>_Search_In_DataBase

Func _Check_Task_Array($s_FileDataBase, ByRef $a_Array, $f_Visible = 0)
	Local $o_Excel, $a_Sheet

	$o_Excel = _ExcelBookOpen($s_FileDataBase, $f_Visible)
	If @error Then Return
	$a_Sheet = _ExcelSheetList($o_Excel)
	If @error Then
		_ExcelBookClose($o_Excel)
		Return SetError(1)
	EndIf
	_ExcelBookClose($o_Excel)
	$a_Array[0][0] = 0
	For $i = 1 To $a_Sheet[0]
		If $a_Array[1][0] == $a_Sheet[$i] Then
			$a_Array[0][0] = 1
		EndIf
	Next
EndFunc   ;==>_Check_Task_Array

Func _Read_Excel_Table($s_FilePath, $s_Sheet, $i_StartRow = 2, $i_StartColumn = 1, $i_RowCnt = 0, $i_ColCnt = 0, $f_Visible = 0)
	Local $o_Excel, $a_ReturnArray

	$o_Excel = _ExcelBookOpen($s_FilePath, $f_Visible)
	If @error Then Return SetError(1, 0, -1)
	_ExcelSheetActivate($o_Excel, $s_Sheet)
	If @error Then
		_ExcelBookClose($o_Excel)
		Return SetError(1, 0, -1)
	EndIf
	$a_ReturnArray = _ExcelReadSheetToArray($o_Excel, $i_StartRow, $i_StartColumn, $i_RowCnt, $i_ColCnt)
	If @error Then
		_ExcelBookClose($o_Excel)
		Return SetError(1, 0, -1)
	EndIf
	_ExcelBookClose($o_Excel)
	Return SetError(0, 0, $a_ReturnArray)
EndFunc   ;==>_Read_Excel_Table

Func _ErrFunc()
	$iError = $oError.Number
EndFunc   ;==>_ErrFunc
 
Автор
F

foxGun

Новичок
Сообщения
11
Репутация
0
Отлично работает!!!! :smile: сейчас прицеплю к своей базе , и буду дальше двигаться... Огромное спасибо за помощь!!!!!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
foxGun,
Так должно искать очень быстро по сравнению с предыдущим вариантом:
Код:
#NoTrayIcon
#include <Excel.au3>
#include <Misc.au3>
#include <Constants.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)
Opt('WinTitleMatchMode', 2)

Global $sFileWhatFind = @ScriptDir & '\WhatFind.xls', $sFileDataBase = @ScriptDir & '\DataBase.xls', _
		$aWhatFind[2][2], $sStringReturn, $fWhatFind, $iRowOld, $iColOld, $oError, $iError, _
		$nItemExit, $nMsg, $sStringMessage

If Not FileExists($sFileWhatFind) Or Not FileExists($sFileDataBase) Then
	MsgBox(16, 'Error', 'Отсутствуют необходимые файлы')
	Exit
EndIf

OnAutoItExitRegister('_Finish')

$oError = ObjEvent('AutoIt.Error', '_ErrFunc')

_Start()
If @error Then
	_CloseExcel_Hide()
	MsgBox(16, 'Error', 'Перезапуститесь')
	Exit
EndIf
_CloseExcel_Hide()
HotKeySet('{Esc}', '_Exit')

$nItemExit = TrayCreateItem('Выход   Esc')
TraySetClick(9)
TraySetState()
TraySetToolTip('Выход - Esc')
AdlibRegister('_WhatFind_Exists', 50)

While 1
	If $fWhatFind Then
		If _IsPressed('01') Then
			AdlibUnRegister('_WhatFind_Exists')
			While _IsPressed('01')
				Sleep(10)
			WEnd
			_Get_WhatFind_Array($aWhatFind)
			If $aWhatFind[0][0] Then
				$sStringReturn = _Search_In_DataBase($aWhatFind)
				$sStringMessage = 'Искали: ' & $aWhatFind[1][1] & ', в разделе: ' & _
						$aWhatFind[1][0] & @LF & @LF & 'Результат поиска:' & @LF & $sStringReturn
				MsgBox(64, 'Результат поиска', $sStringMessage)
			EndIf
			_CloseExcel_Hide()
			AdlibRegister('_WhatFind_Exists', 50)
		EndIf
	EndIf
	$nMsg = TrayGetMsg()
	Switch $nMsg
		Case 0
			ContinueLoop
		Case $nItemExit
			_Exit()
	EndSwitch
WEnd

Func _Get_WhatFind_Array(ByRef $a_Array)
	Local $o_Excel, $i_Row, $i_Col

	If Not $fWhatFind Then Return
	$a_Array[0][0] = 0
	$o_Excel = _ExcelBookAttach($sFileWhatFind)
	If @error Then Return
	$i_Row = $o_Excel.Application.ActiveCell.Row
	$i_Col = $o_Excel.Application.ActiveCell.Column
	If $iError Then
		$iError = 0
		$iRowOld = 0
		$iColOld = 0
		Return
	EndIf
	If $i_Row > 1 Then
		If ($iRowOld <> $i_Row Or $iColOld <> $i_Col) Then
			$iRowOld = $i_Row
			$iColOld = $i_Col
		Else
			Return
		EndIf
		Switch $iColOld
			Case 1
				$a_Array[1][0] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld)
				If @error Then Return
				$a_Array[1][1] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld + 1)
				If @error Then Return
				If (Not $a_Array[1][0] Or Not $a_Array[1][1]) Then Return
				$a_Array[0][0] = 1
			Case 2
				$a_Array[1][0] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld - 1)
				If @error Then Return
				$a_Array[1][1] = _ExcelReadCell($o_Excel, $iRowOld, $iColOld)
				If @error Then Return
				If (Not $a_Array[1][0] Or Not $a_Array[1][1]) Then Return
				$a_Array[0][0] = 1
		EndSwitch
	EndIf
	_CloseExcel_Hide()
	Return
EndFunc   ;==>_Get_WhatFind_Array

Func _CloseExcel_Hide()
	Local $a_List
	$a_List = WinList('[Class:XLMAIN]')
	If $a_List[0][0] Then
		For $i = 1 To $a_List[0][0]
			If Not BitAND(WinGetState($a_List[$i][1]), 2) Then
				WinClose($a_List[$i][1])
			EndIf
		Next
	EndIf
EndFunc   ;==>_CloseExcel_Hide

Func _Start()
	Local $s_Dir = @AppDataDir & '\FindExcel', $o_Excel, $a_Sheet

	If FileExists($s_Dir) Then DirRemove($s_Dir, 1)
	DirCreate($s_Dir)
	$o_Excel = _ExcelBookOpen($sFileDataBase, 0)
	If @error Then Return SetError(1)
	$a_Sheet = _ExcelSheetList($o_Excel)
	If @error Then
		_ExcelBookClose($o_Excel, 0)
		Return SetError(1)
	EndIf
	For $i = 1 To $a_Sheet[0]
		_ExcelSheetActivate($o_Excel, $i)
		If @error Then
			_ExcelBookClose($o_Excel, 0)
			Return SetError(1)
		EndIf
		_ExcelBookSaveAs($o_Excel, $s_Dir & '\' & $a_Sheet[$i], 'txt')
		If @error Then
			_ExcelBookClose($o_Excel, 0)
			Return SetError(1)
		EndIf
	Next
	_ExcelBookClose($o_Excel, 0)
	Return SetError(0)
EndFunc   ;==>_Start

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _Finish()
	Local $s_Dir = @AppDataDir & '\FindExcel'
	If FileExists($s_Dir) Then DirRemove($s_Dir, 1)
	_CloseExcel_Hide()
EndFunc   ;==>_Finish

Func _WhatFind_Exists()
	Local $s_FileWhatFind = 'WhatFind.xls', _
			$s_Title = '[Title:' & $s_FileWhatFind & ';Class:XLMAIN]'
	If WinActive($s_Title) Then
		$fWhatFind = True
	Else
		$aWhatFind[0][0] = 0
		$fWhatFind = False
	EndIf
EndFunc   ;==>_WhatFind_Exists

Func _Search_In_DataBase($a_Array)
	Local $s_Dir = @AppDataDir & '\FindExcel', $h_File, $s_Text, $s_Return_String

	If Not FileExists($s_Dir & '\' & $a_Array[1][0] & '.txt') Then _
			Return SetError(0, -1, 'В базе нет листа ' & $a_Array[1][0])

	$h_File = FileOpen($s_Dir & '\' & $a_Array[1][0] & '.txt')
	If $h_File = -1 Then Return SetError(0, -1, 'Ошибка открытия файла')
	$s_Text = FileRead($h_File)
	FileClose($h_File)
	If Not $s_Text Then
		Return SetError(0, -1, 'Ошибка чтения файла')
	EndIf
	If Not StringInStr($s_Text, $a_Array[1][1]) Then Return SetError(0, -1, 'Отсутствует ' & $a_Array[1][1])
	$s_Return_String = StringRegExpReplace($s_Text, '(?s).*?(' & $a_Array[1][1] & '.*?)\r?\n.*', '$1')
	If @extended <> 1 Then Return SetError(0, -1, 'Ошибка обработки текста')
	$s_Return_String = StringReplace($s_Return_String, @TAB, '|')
	Return SetError(0, 0, $s_Return_String)
EndFunc   ;==>_Search_In_DataBase

Func _ErrFunc()
	$iError = $oError.Number
EndFunc   ;==>_ErrFunc
 
Верх