<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: ComObj Excel]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=7490</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7490&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: ComObj Excel».]]></description>
		<lastBuildDate>Sun, 20 Dec 2015 20:04:37 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: ComObj Excel]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=99814#p99814</link>
			<description><![CDATA[<p>Если ячейка в фокусе, то есть вручную редактируется, то при любом обращении пишет:</p><div class="quotebox"><blockquote><p>Вызов был отклонен</p></blockquote></div><p>Понятно что можно куда нибудь кликнуть чтобы снять фокус, или:</p><div class="codebox"><pre><code>ControlSend, ahk_parent, {Escape}, ahk_class XLMAIN</code></pre></div><p>но возможно ли это сделать силами &quot;объекта Excel&quot;?<br /></p><div class="codebox"><pre><code>
OnExit(&quot;XLQuit&quot;) 
Path = файл.xlsx

Global XL := ComObjCreate(&quot;Excel.Application&quot;) 
XL.Visible := 1 
XL.Workbooks.Open(Path)  
Return

1:: 
	???
	Xl.Cells(1, 1).Value := A_TickCount
	Return
	
XLQuit() { 
	Xl.ActiveWorkbook.Save()
	XL.Application.Quit() 
} 
</code></pre></div><p>Excel 2007.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 20 Dec 2015 20:04:37 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=99814#p99814</guid>
		</item>
		<item>
			<title><![CDATA[AHK: ComObj Excel]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=63079#p63079</link>
			<description><![CDATA[<p>Небольшой копипаст статьи <a href="http://www.autohotkey.com/community/viewtopic.php?t=74131">http://www.autohotkey.com/community/vie … hp?t=74131</a> с дополнениями.</p><p>Все прекрасно описано на сайте мелкомягких (<a href="http://msdn.microsoft.com/en-us/library/office/ff847106.aspx">http://msdn.microsoft.com/en-us/library … 47106.aspx</a>)</p><p>Без кратких лирических отступлений:</p><p><strong>Для работы с Excel используя Com необходимо создать handle</strong></p><div class="codebox"><pre><code>Xl := ComObjCreate(&quot;Excel.Application&quot;) ;создается handle для нового приложения
Xl := ComObjActive(&quot;Excel.Application&quot;) ;создается handle к текущему активному листу exel</code></pre></div><p><strong>Создание нового документа</strong></p><div class="codebox"><pre><code>Xl := ComObjCreate(&quot;Excel.Application&quot;) ;handle
Xl.Visible := True ;делает окно Exel видимым, по умолчанию скрыто
Xl.Workbooks.Add ;добавляет новую книгу</code></pre></div><p><strong>Открытие документа</strong></p><div class="codebox"><pre><code>FileSelectFile, Path
Xl := ComObjCreate(&quot;Excel.Application&quot;)
Xl.Workbooks.Open(Path) ;открывает выбраный файл
Xl.Visible := True; делает окно видимым, данную функцию можно не использовать, окно будет скрыто</code></pre></div><p><strong>Запись значений в ячейки</strong><br />1) Диапазон ячеек<br /></p><div class="codebox"><pre><code>Xl.Range(&quot;A1:B3&quot;).Value := &quot;1&quot;; заполняются ячейки А1-3 B1-3</code></pre></div><p>2) Единичная ячейка<br /></p><div class="codebox"><pre><code>Xl.Range(&quot;A1&quot;).Value := &quot;1&quot;;</code></pre></div><p>или второй вариант <br /></p><div class="codebox"><pre><code>Xl.Cells(1,5).Value := &quot;5333&quot;; где 1 номер строки, 5 номер столбца. Если передать только одно значение Cells(Х) то будет изменяться значение в 1-й строке столбце Х</code></pre></div><p>Для записи в ячейку формулы <em>.Value</em> заменяется на <em>.Formula</em>. Пример:<br /></p><div class="codebox"><pre><code>Xl.Range(&quot;A1:B3&quot;).Formula = &quot;=Rand()&quot;
Xl.Cells(1,10).Formula = &quot;=Rand()&quot;</code></pre></div><p><strong>Для присваивания ячейке значения переменной:</strong><br /></p><div class="codebox"><pre><code>helloworld:=&quot;Hello world!&quot;
Xl.Range(&quot;A1&quot;).Value := helloworld</code></pre></div><p>и наоборот<br /></p><div class="codebox"><pre><code>Xl.Range(&quot;A1&quot;).Value := &quot;hello world!&quot;
helloworld:=Xl.Range(&quot;A1&quot;).Value</code></pre></div><p><strong>Перебор ячеек циклом:</strong><br /><em>Строки или столбца</em><br /></p><div class="codebox"><pre><code>while (Xl.Cells(1,A_Index).Value != &quot;&quot;) {
Xl.Cells(1,A_Index).Value := &quot;test&quot;; для перебора столбца ...Cells(A_Index,1)....
}</code></pre></div><p>или вариант<br /></p><div class="codebox"><pre><code>while (Xl.Range(&quot;A&quot; . A_Index).Value != &quot;&quot;) {
Xl.Range(&quot;A&quot; . A_Index).Value := value
}</code></pre></div><p><em>Произвольной заданной области:</em><br /></p><div class="codebox"><pre><code>startcol:=3
startrow:=5
numbercol:=5
numberrow:=3

Loop % numberrow
{
    row:=A_Index
    Loop % numbercol
    {
        Xl.Cells(startrow-1+row,startcol-1+A_index).Value := &quot;tttttes2222&quot;
    }
}
;банально заполняется массив ячеек размерностью 5 на 3</code></pre></div><p><em>очередной копипаст. Заполняет значения заданных ячеек в строку</em><br /></p><div class="codebox"><pre><code>Row := &quot;1&quot;
Columns := Object(1,&quot;A&quot;,2,&quot;B&quot;,3,&quot;C&quot;,4,&quot;D&quot;,5,&quot;E&quot;,6,&quot;F&quot;,7,&quot;G&quot;,8,&quot;H&quot;,9,&quot;I&quot;,10,&quot;J&quot;,11,&quot;K&quot;,12,&quot;L&quot;,13,&quot;M&quot;,14,&quot;N&quot;,15,&quot;O&quot;,16,&quot;P&quot;,17,&quot;Q&quot;) ;array of column letters
For Key, Value In Columns
XL.Range(Value . Row).Value := value ;set values of each cell in a row</code></pre></div><p><strong>Очистка содержимого ячеек (.ClearContents).</strong><br /></p><div class="codebox"><pre><code>Xl.Cells(1,5).ClearContents ; Очищает ячейку F1
Xl.Rows(1).ClearContents ; Очищает всю первую строку
Xl.Columns(1).ClearContents ; Очищает 1 столбец</code></pre></div><p><strong>Удаление строк\столбцов (.Delete)</strong><br /></p><div class="codebox"><pre><code>Xl.Rows(3).Delete ;Удаляет 3 строку
Xl.Columns(3).Delete ; Удаляет 1-й столбец</code></pre></div><p>ЗЫ. Пора спать. Напоследок:</p><p><strong>Сохранение документа:</strong><br /><em>Если создавался новый:</em><br /></p><div class="codebox"><pre><code>Xl.ActiveWorkbook.SaveCopyAs(PathToNewDocumentWithName)</code></pre></div><p><em>Если открывали уже созданный</em><br /></p><div class="codebox"><pre><code>Xl.ActiveWorkbook.Save()
;или как вариант
Xl.Workbooks(1).Save()</code></pre></div><p>И самое главное - закрытие приложения, иначе после работы скрипта в процессах останется висеть Excel.exe<br /></p><div class="codebox"><pre><code>Xl.Application.Quit(); Если предварительно не сделать .SAve спросит о сохранении документа
Xl.ActiveWorkbook.Close(); При наличии одной открытой &quot;книги&quot; тоже закроет приложение</code></pre></div><p><em>Для <a href="http://msdn.microsoft.com/en-us/library/bb214129%28v=office.12%29.aspx">сохранения</a> в какой либо <a href="http://msdn.microsoft.com/en-us/library/bb241279(v=office.12).aspx">формат отличный от xls</a>, на примере txt.</em><br /></p><div class="codebox"><pre><code>Xl.ActiveWorkbook.SaveAs(&quot;C:\testexelfile.txt&quot;,20)
Xl.ActiveWorkbook.Close(true); нужно что бы эксель не спрашивал &quot;сохранить ли мне изменения в  testexelfile.txt&quot;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (chippp)]]></author>
			<pubDate>Thu, 23 Aug 2012 23:50:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=63079#p63079</guid>
		</item>
	</channel>
</rss>
