Тема: 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"