Что нового

Обратиться к уже открытому файлу xlsx (Ввернуть существующий экземпляр объекта открытой рабочей книги Excel)

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Есть открытый файл Эксель. С ним нужно будет провести определенные манипуляции (удаление колонок, добавление значений и тп). Но не получается до него достучаться. Пробовал так:
Код:
Local $oExcel = _Excel_Open()
Local $sWorkbook = "path\name.xlsx"
Local $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook)

Но в таком виде открывает копию для чтения и висит два открытых файла: первый нормальный и один открытый для чтения.
Пробовал вот так:
Код:
$sFilePath = "path\name.xlsx"
$oExcel = _ExcelBookAttach($sFilePath)

Пишет, что нет такой функции
При этом если я открываю этот же файл скриптом, то все манипуляции получаются.
Ещё пробовал так:
Код:
Local $oExcel = _Excel_Open()
Local $sWorkbook = "path\name.xlsx"
Local $oWorkbook = _Excel_BookOpen('', $sWorkbook)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen Example 1", "Error opening '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended & 'ошибка')

Но так только запускается эксель и пишет ошибку, что не может открыть файл
 
Последнее редактирование:

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
Func __ExcelBookAttach($s_string, $s_mode = "FilePath")
	Local $o_Result
	If $s_mode = "filepath" Then
		$o_Result = ObjGet($s_string)
		If Not @error And IsObj($o_Result) Then
			Return $o_Result
		EndIf
	EndIf
	$o_Result = ObjGet("", "Excel.Application")
	If @error Or Not IsObj($o_Result) Then
		Return SetError(1, 1, 0)
	EndIf
	Local $o_workbooks = $o_Result.Application.Workbooks
	If Not IsObj($o_workbooks) Or $o_workbooks.Count = 0 Then
		Return SetError(1, 2, 0)
	EndIf
	For $o_workbook In $o_workbooks
		Switch $s_mode
			Case "filename"
				If $o_workbook.Name = $s_string Then
					Return $o_workbook
				EndIf
			Case "filepath"
				If $o_workbook.FullName = $s_string Then
					Return $o_workbook
				EndIf
			Case "title"
				If ($o_workbook.Application.Caption) = $s_string Then
					Return $o_workbook
				EndIf
			Case Else
				Return SetError(1, 3, 0)
		EndSwitch
	Next
	Return SetError(1, 5, 0)
EndFunc   ;==>_ExcelBookAttach
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
В UDF "Excel.au3> есть же эта функция (_Excel_BookAttach)
Код:
#include <Excel.au3>

Local $oExcel = _Excel_Open()
Local $sWorkbook = @ScriptDir&"\name.xlsx"
Local $oWorkbook = _Excel_BookAttach($sWorkbook)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen Example 1", "Error opening '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended & 'ошибка')
;Дальше работаем с $oWorkbook, например:
_Excel_RangeWrite($oWorkbook,Default,'Hello world !!!','B3')
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
В UDF "Excel.au3> есть же эта функция (_Excel_BookAttach)
Честно говоря в саму UDF не заглядывал. Или имелось ввиду, что нужно #include <Excel.au3> добавить? Так оно было.
В таком виде вроде как работает, но дополнительно открывается окно экселя, которое висит активным на переднем плане, а за ним нужный файл, правда уже измененный. Как бы без этого окна эксель и с нужным файлом на переднем плане?
Хотя, если убрать
Код:
Local $oExcel = _Excel_Open()
то дополнительное окошко экселя не открывается.
Но все равно не понятно, почему в моем случае тогда не срабатывало и писало, что такой функции нет. Понять бы и можно было закрыть тему
 
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
нужно #include <Excel.au3> добавить? Так оно было.
Понятно, что было , без этого Ваш скрипт не найдёт функций из этой UDF

но дополнительно открывается окно экселя, которое висит активным на переднем плане, а за ним нужный файл
Странно, никаких дополнительных окон открываться не должно, просто скрипт присоединяется к открытой книге и работает с ней.
Проверил у себя, ничего дополнительно не открывается, только уже открытая книга выводится поверх всех окон.
Честно говоря в саму UDF не заглядывал.
Зря, там есть перечень всех функций этой UDF, правда описание можно найти только на английском, но есть в описаниях простые примеры в которых не сложно разобраться
 
Верх