1 (изменено: yl3d, 2018-12-21 12:52:44)

Тема: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Здравствуйте.

У меня есть файл xls.
В нем на листе3 в ячейке J5 - формула может выдавать либо слово "один" либо слово "два".

Как при появлении слова "один" в ячейке J5-  заставить скрипт AHK выдать сообщение, например с текстом "Событие" ?
А затем продолжить свою работу вися в трее.

Post's attachments

1.rar 6.62 kb, 2 downloads since 2018-12-16 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

http://forum.script-coding.com/viewtopic.php?id=14263

3 (изменено: svoboden, 2018-12-19 08:01:15)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Так можно для листа1:

#Persistent
XL := ComObjActive("Excel.Application")
Sheet := XL.ActiveSheet
ComObjConnect(Sheet, Worksheet)

class Worksheet {
   Calculate(cell) {
   	XL := ComObjActive("Excel.Application")
     If (XL.Range("J5").Value = "один")
     MsgBox Событие
   }
}

4

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, не работает.
Выдает ошибку "Операция недоступна".
https://b.radikal.ru/b19/1812/c2/19fe2f99e65e.jpg

На изменения в ячейке эксель - никак не реагирует.

5

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

А Excel запущен.

6 (изменено: yl3d, 2018-12-20 08:54:44)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, проверял и с запущенным экселем и с незапущенным.
Выдает ошибку и в том и в другом случае.

7

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Может, в диспетчере задач процесс excel висит лишний. У меня все работает.

8

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, в диспетчере задач - висит один-единственный процесс эксель.

9

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, пробовал открывать на Excel2003, Excel2007, Excel2013.

Не работает ни на одном.
Везде выдает одну и ту же ошибку.

10 (изменено: svoboden, 2018-12-20 09:42:28)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Вам же дали ссылку, там есть примеры. Проверяйте.

11

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, ссылка - вообще не по моему вопросу.

12

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Изучайте: https://autohotkey.com/boards/viewtopic … nect+Excel.

13 (изменено: yl3d, 2018-12-20 10:18:30)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, тоже нет ничего по моему вопросу.
Идет описание объектной модели VBA (у меня в вопросе нет ничего о ВБА)
Добавка комментариев в ячейку, сохранение ссылок, получить значения ячеек в столбце, импорт данных из текстового файла, ссылка на COM-объект, удаление столбцов, идет длинное перечисление каких-то скриптов для Word.

Чего только нет.
Только нет ответа или даже просто намека на мой вопрос.
Как выполнить - простейшую операцию.
Простейшую.

Как при появлении слова "один" в конкретной ячейке конкретного листа -  заставить скрипт AHK выдать сообщение ?

14 (изменено: svoboden, 2018-12-20 11:16:19)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

В вашем случае нужно событие Calculate. Ищите в гугле примеры этого события, если ahk не работает.

15 (изменено: yl3d, 2018-12-20 12:23:14)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, при чем тут Calculate ?
Calculate - это событие для макросов экселя.
А я говорю при реакцию на ИЗМЕНЕНИЕ ячейки.
Calculate - реагирует не на изменение ячейки, а на ПЕРЕСЧЕТ листа.

Это значит - сообщение будет выдаваться постоянно при любом пересчете листа, а не в том случае, когда меняется значение ячейки.

16

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, подскажите - почему же появляется такое сообщение об ошибке при работе вашего скрипта ?
Выдает эту ошибку - на всех видах экселя.

https://b.radikal.ru/b19/1812/c2/19fe2f99e65e.jpg

17

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

https://support.microsoft.com/en-us/hel … pplication

18

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Malcev я вроде бы спрашивал про autohotkey, а не про VBA

19

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Это ошибка не ahk, не vba, а com.

20

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, а зачем вы при отлавливании события заново подключаетесь к экселю?

21

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

У меня только так работает.

22

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

У меня эксел не стоит, но мне кажется это неправильным.
Ну и отлавливать, мне кажется, надо событие change.

23 (изменено: svoboden, 2018-12-29 22:13:41)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

Ну, не знаю, вот, например:

#Persistent
XL := ComObjActive("Excel.Application")
Sheet := XL.ActiveSheet
ComObjConnect(Sheet, Worksheet_Events)

class Worksheet_Events {
   Change(cell, sheet) {
      If (cell.address = "$J$5") and (Sheet.Cells.Range("J5").Value = "один")
       msgbox событие
   }
}

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

24

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, ну я скрипт из третьего сообщения кое-как запустил.

Этот скрипт - работает, но неправильно.
Сообщение - должно запускаться только при условии, что в ячейке было какое-то другое слово, а потом оно сменилось на слово "один".
Вот это и есть изменение значения в ячейке.

А у вас скрипт запускается даже тогда, когда в ячейке изначально было значение "один", а после пересчета листа - появляется то же самое значение "один". И скрипт опять срабатывает - выдавая сообщение. Хотя значение - не изменилось.

25 (изменено: svoboden, 2018-12-22 10:58:34)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

#Persistent
global i := 0
XL := ComObjActive("Excel.Application")
Sheet := XL.ActiveSheet
ComObjConnect(Sheet, Calculate)

   Calculate(cell) {
   	   XL := ComObjActive("Excel.Application")
     If (XL.Range("J5").Value = "один") and (i = 0)
   msgbox Событие
    i := 1
    If (XL.Range("J5").Value = "два")
      i := 0
   }

26

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, вот этот вариант работает.

Подскажите такую вещь.

Как прописать полный путь ячейки (с учетом листа и книги) ?
Книга называется 1.xls, а лист - "Лист1"

(сейчас стоит Sheet := XL.ActiveSheet , то есть активный лист, а книга вообще не указана)
Просто нужно чтобы скрипт как-то находил нужную книгу и лист в ней.

27

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

yl3d

xl.Workbooks("1.xlsx").Worksheets("Лист1").Cells(1 ,1).select

28 (изменено: yl3d, 2018-12-22 16:58:13)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

inseption86, а куда именно эту строчку добавлять в коде ?

Добавил строчку в код - вот так.
И скрипт вообще перестал реагировать на изменения в ячейке экселя.


#Persistent
global i := 0
XL := ComObjActive("Excel.Application")
Sheet := XL.Workbooks("1.xls").Worksheets("Лист1")
ComObjConnect(Sheet, Calculate)

   Calculate(cell) {
   	   XL := ComObjActive("Excel.Application")
     If (XL.Workbooks("1.xls").Worksheets("Лист1").Cells(1 ,1).Value = "один") and (i = 0)
   msgbox Событие
    i := 1
    If (XL.Workbooks("1.xls").Worksheets("Лист1").Cells(1 ,1).Value = "два")
      i := 0
   }

29 (изменено: Malcev, 2018-12-24 14:46:19)

Re: AHK: Как скриптом AHK отреагировать на изменение значения ячейки Excel

svoboden, вы немного неправильно подписываетесь на события.

#Persistent
XL := ComObjActive("Excel.Application")
Sheet := XL.ActiveSheet
ComObjConnect(Sheet, Worksheet)

class Worksheet {
   Calculate(sheet) {
   If (Sheet.Cells.Range("J5").Value = "один")
     MsgBox Событие
   }
}