1

Тема: AHK: запуск файла excel через run и чтение из него данных

Здравствуйте! Я пришла просить помощи, у мудрых и знающих программистов, т.к. сама - глупая женщина, которая не может дать ладу в, как мне поначалу казалось, простом деле.
Что требуется:
1. Запустить файл Excel через run. -- Это у меня получилось
2. Считать данные из ячеек в этом файле. -- а вот тут все, кранты. Никак не пойму как обратиться к данным.

Подскажите, как это делается или ссылочкой полезной поделитесь, буду премного благодарна.

2 (изменено: svoboden, 2018-02-09 05:35:08)

Re: AHK: запуск файла excel через run и чтение из него данных

Через com, конечно.

1::
xl := ComObjActive("Excel.Application")

a := []
loop, 57
{
	a.push(xl.Range("A" A_Index).value)
}

msgbox % a[1]
return

А так можно открыть/закрывать Excel или файл.

filepath := ("C:\Книга1.xlsx")

2::
objExcel := ComObjCreate("Excel.Application")
objExcel.Workbooks.Open(filepath)
return

3::
objExcel := ComObjGet(filepath)
objExcel.close
return

Правда, в диспетчере может оставаться висеть Excel.

3

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden пишет:

objExcel.close

А откуда вы такой метод взяли?

4

Re: AHK: запуск файла excel через run и чтение из него данных

Malcev пишет:

А откуда вы такой метод взяли?

https://autohotkey.com/boards/viewtopic … +ComObjGet

5

Re: AHK: запуск файла excel через run и чтение из него данных

У меня в диспетчере задач excel не остаётся если в первую часть кода добавить objExcel.Quit().

6

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden
Спасибо вам за ответ!
К сожалению, ничего не выходит. Если пытаюсь открыть файл, с помощью команды run, то прога ругается на:

svoboden пишет:

xl := ComObjActive("Excel.Application")

Может дело в том, я не могу их связать, не знаю.

Открытие файла через path мне не подходит, по причине того что файл Excel, который я пытаюсь открыть запустить, не простой Он содержит в себе код, который при открытии данного файла, посылает запрос данных на сервер. Считывает их и перезаписывает ячейки со старыми данными на полученные новые. Если я запускаю файл через path, то он просто открывается, а запроса к серверу не происходит.
А вот если использовать команду run, то файл запускается и запрос с обновлением выполняются. А дальше все...ничего не пойму.

7 (изменено: stealzy, 2017-10-13 15:43:27)

Re: AHK: запуск файла excel через run и чтение из него данных

objExcel.Calculate ; думаю, из названия метода все понятно (мной не испытывалось)

8 (изменено: svoboden, 2018-02-09 05:36:41)

Re: AHK: запуск файла excel через run и чтение из него данных

st-shony пишет:

Может дело в том, что я не могу их связать, не знаю.

Скорее всего, т.к, что там непонятного? Так, например, считывает 20 ячеек колонки "А", можно считать больше.


1::
xl := ComObjActive("Excel.Application")

a := []
loop, 20
{
	a.push(xl.Range("A" A_Index).value) ; тут меняется колонка по умолчанию стоит "А"
    d .= a[A_Index]"`n"
}

msgbox % d
d := ""
return

По поводу, что открытия файла через path не подходит. Я думаю, что все там работает, просто надо перед закрытием файла его сохранить, когда файл обновит данные, как это делается, я показал по ссылке выше.

9

Re: AHK: запуск файла excel через run и чтение из него данных

И при objExcel.close тоже не остается. При выходе из скрипта, Excel закрывается.

10

Re: AHK: запуск файла excel через run и чтение из него данных

В первом вашем случае такого метода нету:

objExcel := ComObjCreate("Excel.Application")
objExcel.close

А для чего вам нужна эта переменная MyIndex := A_Index ?
И зачем вы используете массивы, если всё-равно потом в переменную d записываете?

11

Re: AHK: запуск файла excel через run и чтение из него данных

Malcev я думал, про переменные stealzy спросит. Я просто сказал, что метод objExcel.close тоже закрывает Excel.

12 (изменено: Malcev, 2017-10-13 23:55:15)

Re: AHK: запуск файла excel через run и чтение из него данных

Я имею в виду не то, что у вас в коде нету, а то, что такого метода в принципе нету у Application object.
https://msdn.microsoft.com/en-us/vba/ex … ject-excel
А при чем тут stealzy?
Просто лишние действия в коде и прочий мусор (типа неиспользуемых переменных) только усложняют его понимание.

13 (изменено: svoboden, 2017-10-14 00:07:35)

Re: AHK: запуск файла excel через run и чтение из него данных

Как причем? Ко всему придирается, а нормально ответить сам не может.

Хорошо, тогда скажите, зачем здесь нужны переменные? А насчет методов, то я их не ищу в msdn.

14

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden пишет:

зачем здесь нужны переменные?

Ну а как там без них?
У вас есть предложения?

15 (изменено: svoboden, 2017-12-07 19:33:25)

Re: AHK: запуск файла excel через run и чтение из него данных

Какие еще предложения? http://s2.rimg.info/5602a4cac8909fc6c1ce0e23fa5bdb6d.gif Просто я не могу понять, зачем они там нужны, и без них тоже все работает?

16

Re: AHK: запуск файла excel через run и чтение из него данных

Приведите пример, как без них всё будет работать.
У вас все будет работать так:

1::
xl := ComObjActive("Excel.Application")
d := ""
loop, 20
   d .= xl.Range("A" A_Index).value "`n"
msgbox % d

17 (изменено: svoboden, 2017-10-14 03:42:39)

Re: AHK: запуск файла excel через run и чтение из него данных

А вы говорили про усложнения понимания кода, а не про работает - не работает.

18 (изменено: Malcev, 2017-10-14 01:12:22)

Re: AHK: запуск файла excel через run и чтение из него данных

Я имел в виду, что для работоспособности вашего кода переменная MyIndex не нужна, так как нигде не используется.
И массивы тоже излишни, так как вы все складываете в одну переменную.
В моем же коде все переменные используются и без них мой код работать не будет.
Разницу улавливаете?
Если у вас есть предложения по его модернизации, то я только за.

19 (изменено: svoboden, 2017-10-15 18:32:42)

Re: AHK: запуск файла excel через run и чтение из него данных

Как они используются? Их можно удалить, и все равно все работает, соответственно, зачем они там надо?

20

Re: AHK: запуск файла excel через run и чтение из него данных

Я вас не понимаю.
Если вы имеете в виду приравнивание переменных к нулю, то это я сделал дабы избежать таких моментов:

str1 = 68376123454132178
str2 = 12

Prev := "", n := MaxN := Sum := MaxSum := 0
Loop, Parse, str1
{
   if (A_LoopField -1 = Prev)
      Sum += A_LoopField, n++
   else
      Sum := A_LoopField, n := 1
   if (n > maxN)
      maxN := n, MaxSum := Sum
   Prev := A_LoopField
}
msgbox % MaxSum

;Prev := "", n := MaxN := Sum := MaxSum := 0
Loop, Parse, str2
{
   if (A_LoopField -1 = Prev)
      Sum += A_LoopField, n++
   else
      Sum := A_LoopField, n := 1
   if (n > maxN)
      maxN := n, MaxSum := Sum
   Prev := A_LoopField
}
msgbox % MaxSum

21 (изменено: st-shony, 2017-10-17 01:03:34)

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden

svoboden пишет:

По поводу, что открытия файла через path не подходит. Я думаю, что все там работает, просто надо перед закрытием файла его сохранить, когда файл обновит данные, как это делается, я показал по ссылке выше.

Вы не поняли. Файл не обновляет данные, если он запускается посредством:


filepath := ("C:\Книга1.xlsx")
objExcel := ComObjCreate("Excel.Application")
objExcel.Workbooks.Open(filepath)

Он открывается со старыми данными и все.

22

Re: AHK: запуск файла excel через run и чтение из него данных

А так?

filepath := ("C:\Книга1.xlsx")
objExcel := ComObjCreate("Excel.Application")
WorkBook := objExcel.Workbooks.Open(filepath)
Workbook.RefreshAll

23

Re: AHK: запуск файла excel через run и чтение из него данных

Malcev
Тоже не работает.
Поэтому я и пытаюсь через run. Работает только он.

24

Re: AHK: запуск файла excel через run и чтение из него данных

st-shony, файл дайте. У Excel сотни методов, но какой из них отвечает за выполнение макроса при открытии...

25 (изменено: svoboden, 2017-10-18 02:24:00)

Re: AHK: запуск файла excel через run и чтение из него данных

st-shony, если вам так нравится, то запускайте через Run, а данные из ячеек, сумели хоть считать.

26 (изменено: st-shony, 2017-10-19 14:45:28)

Re: AHK: запуск файла excel через run и чтение из него данных

stealzy
Запрос делается не через макрос. А через специальную штуку, встроенную в Excel (2007) - "Подключения". В них настроен ряд обычных select'ов к SQL-серверу. В свойствах подключения, во кладке - "Использование" стоит галочка напротив: "Обновление при открытии файла". Вот так это работает.

27 (изменено: st-shony, 2017-10-19 15:09:58)

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden
Все получилось! Урааа!
Сердечное спасибо!!!

28 (изменено: st-shony, 2017-10-19 16:03:55)

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden
Рано обрадовалась....
Запустила один раз - все отработалось как надо, запустила второй и прога выдала ошибку:
Error: 0x80040101E3 - Операция недоступна
--->        objExcel := ComObjActive("Excel.Application")

Хотя я ничего не меняла:

 
Run, G:\....xls
sleep 10000
objExcel := ComObjActive("Excel.Application")
d := ""
loop
{
     d .= objExcel.Range("B" . 6).value
}
msgbox % d

29 (изменено: Malcev, 2017-10-19 16:16:21)

Re: AHK: запуск файла excel через run и чтение из него данных

Так, по идее, эксел должен обновлять только те подключения ,у которых стоит галочка "Обновление при открытии файла":

filepath := ("C:\Книга1.xlsx")
objExcel := ComObjCreate("Excel.Application")
objExcel.Visible := true
WorkBook := objExcel.Workbooks.Open(filepath)
for connection in WorkBook.Connections
{
   if (connection.type = 1)
      connectionType := connection.OLEDBConnection
   else if (connection.type = 2)
      connectionType := connection.ODBCConnection
   else
      msgbox % "error connectionType - " connection.type
   if (connectionType.RefreshOnFileOpen = -1)
      connection.Refresh
}
objExcel.CalculateUntilAsyncQueriesDone
msgbox done

30 (изменено: svoboden, 2017-10-19 16:47:13)

Re: AHK: запуск файла excel через run и чтение из него данных

st-shony, при втором запуске не нужно запускать: Run, G:\....xls
sleep 10000. Скрипт может еще выдать ошибку, если ячейка редактируется, т.е., когда установлен в ней курсор.

31

Re: AHK: запуск файла excel через run и чтение из него данных

Malcev
Ваш код отработал как надо! Спасибо огромное!

32

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden
Фм...не. Что-то не то.
Перед вторым запуском я все закрыла. И код, и excel и в процессах ничего не осталось.
Это был такой же тест, как и все.
А курсор там вообще не поставишь, пока данные обновляются.

33 (изменено: svoboden, 2017-10-19 18:32:37)

Re: AHK: запуск файла excel через run и чтение из него данных

Ну, у меня все работает, я не знаю, почему он не считывает данные, если файл открыт - это ерунда уже какая-то. Может, дело в версии Excel у меня 2010.

34 (изменено: svoboden, 2017-10-19 19:49:48)

Re: AHK: запуск файла excel через run и чтение из него данных

А так считывает?:

FilePath := "C:\Книга.xlsx"
oWorkbook := ComObjGet(FilePath)
MsgBox % oWorkbook.Sheets(1).Range("A1").Value ; здесь колонку "А" ячейку 1 считывает

Это для проверки, Excel открывать не надо.

35

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden
Да, считывает.

36 (изменено: svoboden, 2017-10-19 20:02:24)

Re: AHK: запуск файла excel через run и чтение из него данных

st-shony, ну, значит, работает. Тогда также и открытый Excel должен считать,
а можно из закрытого считывать данные.

37

Re: AHK: запуск файла excel через run и чтение из него данных

svoboden
должен, но не работает.