1 (изменено: chippp, 2012-08-30 02:02:39)

Тема: AHK: ComObj Excel

Небольшой копипаст статьи http://www.autohotkey.com/community/vie … hp?t=74131 с дополнениями.

Все прекрасно описано на сайте мелкомягких (http://msdn.microsoft.com/en-us/library … 47106.aspx)

Без кратких лирических отступлений:

Для работы с Excel используя Com необходимо создать handle

Xl := ComObjCreate("Excel.Application") ;создается handle для нового приложения
Xl := ComObjActive("Excel.Application") ;создается handle к текущему активному листу exel

Создание нового документа

Xl := ComObjCreate("Excel.Application") ;handle
Xl.Visible := True ;делает окно Exel видимым, по умолчанию скрыто
Xl.Workbooks.Add ;добавляет новую книгу

Открытие документа

FileSelectFile, Path
Xl := ComObjCreate("Excel.Application")
Xl.Workbooks.Open(Path) ;открывает выбраный файл
Xl.Visible := True; делает окно видимым, данную функцию можно не использовать, окно будет скрыто

Запись значений в ячейки
1) Диапазон ячеек

Xl.Range("A1:B3").Value := "1"; заполняются ячейки А1-3 B1-3

2) Единичная ячейка

Xl.Range("A1").Value := "1";

или второй вариант

Xl.Cells(1,5).Value := "5333"; где 1 номер строки, 5 номер столбца. Если передать только одно значение Cells(Х) то будет изменяться значение в 1-й строке столбце Х

Для записи в ячейку формулы .Value заменяется на .Formula. Пример:

Xl.Range("A1:B3").Formula = "=Rand()"
Xl.Cells(1,10).Formula = "=Rand()"

Для присваивания ячейке значения переменной:

helloworld:="Hello world!"
Xl.Range("A1").Value := helloworld

и наоборот

Xl.Range("A1").Value := "hello world!"
helloworld:=Xl.Range("A1").Value

Перебор ячеек циклом:
Строки или столбца

while (Xl.Cells(1,A_Index).Value != "") {
Xl.Cells(1,A_Index).Value := "test"; для перебора столбца ...Cells(A_Index,1)....
}

или вариант

while (Xl.Range("A" . A_Index).Value != "") {
Xl.Range("A" . A_Index).Value := value
}

Произвольной заданной области:

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 := "tttttes2222"
    }
}
;банально заполняется массив ячеек размерностью 5 на 3

очередной копипаст. Заполняет значения заданных ячеек в строку

Row := "1"
Columns := Object(1,"A",2,"B",3,"C",4,"D",5,"E",6,"F",7,"G",8,"H",9,"I",10,"J",11,"K",12,"L",13,"M",14,"N",15,"O",16,"P",17,"Q") ;array of column letters
For Key, Value In Columns
XL.Range(Value . Row).Value := value ;set values of each cell in a row

Очистка содержимого ячеек (.ClearContents).

Xl.Cells(1,5).ClearContents ; Очищает ячейку F1
Xl.Rows(1).ClearContents ; Очищает всю первую строку
Xl.Columns(1).ClearContents ; Очищает 1 столбец

Удаление строк\столбцов (.Delete)

Xl.Rows(3).Delete ;Удаляет 3 строку
Xl.Columns(3).Delete ; Удаляет 1-й столбец

ЗЫ. Пора спать. Напоследок:

Сохранение документа:
Если создавался новый:

Xl.ActiveWorkbook.SaveCopyAs(PathToNewDocumentWithName)

Если открывали уже созданный

Xl.ActiveWorkbook.Save()
;или как вариант
Xl.Workbooks(1).Save()

И самое главное - закрытие приложения, иначе после работы скрипта в процессах останется висеть Excel.exe

Xl.Application.Quit(); Если предварительно не сделать .SAve спросит о сохранении документа
Xl.ActiveWorkbook.Close(); При наличии одной открытой "книги" тоже закроет приложение

Для сохранения в какой либо формат отличный от xls, на примере txt.

Xl.ActiveWorkbook.SaveAs("C:\testexelfile.txt",20)
Xl.ActiveWorkbook.Close(true); нужно что бы эксель не спрашивал "сохранить ли мне изменения в  testexelfile.txt"

2 (изменено: serzh82saratov, 2015-12-21 00:27:20)

Re: AHK: ComObj Excel

Если ячейка в фокусе, то есть вручную редактируется, то при любом обращении пишет:

Вызов был отклонен

Понятно что можно куда нибудь кликнуть чтобы снять фокус, или:

ControlSend, ahk_parent, {Escape}, ahk_class XLMAIN

но возможно ли это сделать силами "объекта Excel"?


OnExit("XLQuit") 
Path = файл.xlsx

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

1:: 
	???
	Xl.Cells(1, 1).Value := A_TickCount
	Return
	
XLQuit() { 
	Xl.ActiveWorkbook.Save()
	XL.Application.Quit() 
} 

Excel 2007.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui