Что нового

Выдача сообщения при определенном значении в ячейке экселя

Sky Green

Новичок
Сообщения
19
Репутация
0
Здравствуйте.
Как заставить скрипт реагировать на появление в ячейке B3 (в уже открытом файле эксель) текста "Значение" ?
Причем если в ячейке уже находится такой текст - скрипт не должен реагировать на него.

Есть вот такой скрипт. Как его изменить, чтобы он выполнял эту операцию?
Код:
#include <excel.au3>

Global $beep = False

Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\14.xls")
Global $oExcel = $oWorkBook.Application

While 1

    $sResult = _Excel_RangeRead($oWorkbook, Default, 'B3')
    If $sResult Then
        If Not $beep Then
            $beep = True
            Beep()
        EndIf
    Else
        If $beep Then $beep = False
    EndIf

    Sleep(200)
WEnd

Func _Exit() ;
    _Excel_Close($oExcel)
    Exit
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Так ?
Код:
#include <excel.au3>

Global $beep = False
Global $sText = 'Значение'
Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\14.xls")
Global $oExcel = $oWorkBook.Application

$sResult = _Excel_RangeRead($oWorkBook, Default, 'B3')
If $sResult == $sText Then $beep = True

While 1

	$sResult = _Excel_RangeRead($oWorkBook, Default, 'B3')

	If $sResult == $sText Then
		If Not $beep Then
			$beep = True
			Beep()
		EndIf
	Else
		If $beep Then $beep = False
	EndIf

	Sleep(200)
WEnd

Func _Exit() ;
	_Excel_Close($oExcel)
	Exit
EndFunc   ;==>_Exit
 
Автор
S

Sky Green

Новичок
Сообщения
19
Репутация
0
ra4o, не запускается.
Выдает вот такую ошибку:

Line6 :
Global $oExcel = $oWorkBook.Application
Global $oExcel = $oWorkBook^ Error
Error: Variable must be of type "Object"
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
А так ?
Код:
#include <excel.au3>

Global $beep = False
Global $sText = 'Значение'
Global $oExcel = _Excel_Open()
Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\14.xls")

$sResult = _Excel_RangeRead($oWorkBook, Default, 'B3')
If $sResult == $sText Then $beep = True

While 1

    $sResult = _Excel_RangeRead($oWorkBook, Default, 'B3')

    If $sResult == $sText Then
        If Not $beep Then
            $beep = True
            Beep()
        EndIf
    Else
        If $beep Then $beep = False
    EndIf

    Sleep(200)
WEnd

Func _Exit() ;
    _Excel_Close($oExcel)
    Exit
EndFunc   ;==>_Exit
 
Автор
S

Sky Green

Новичок
Сообщения
19
Репутация
0
ra4o, теперь при запуске скрипта ( при открытом 14.xls в Excel2013) - появляется пустое окно программы Excel2003
Скрипт ошибки не выдает, но и не работает.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Изначально я всего лишь изменил Ваш первоначальный скрипт под ваши условия , ведь он у Вас работал ?
Пробуйте этот вариант ( я убрал строку открытия Excel и функцию выхода , ведь она никак не используется.)
Код:
#include <excel.au3>

Global $beep = False
Global $sText = 'Значение'
Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\14.xls")

$sResult = _Excel_RangeRead($oWorkBook, Default, 'B3')
If $sResult == $sText Then $beep = True

While 1

    $sResult = _Excel_RangeRead($oWorkBook, Default, 'B3')

    If $sResult == $sText Then
        If Not $beep Then
            $beep = True
            Beep()
        EndIf
    Else
        If $beep Then $beep = False
    EndIf

    Sleep(200)
WEnd
проверял у себя - работают все три варианта без ошибок...
 
Автор
S

Sky Green

Новичок
Сообщения
19
Репутация
0
ra4o в общем что-то ни один из рассмотренных вариантов не сработал.

Запустил вот этот код кое-как на WindowsSerwer2008:
Код:
#include <excel.au3>

Global $beep = False

Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\14.xls")
Global $oExcel = $oWorkBook.Application

While 1

    $sResult = _Excel_RangeRead($oWorkbook, Default, 'B3')
    If $sResult Then
        If Not $beep Then
            $beep = True
            Beep()
        EndIf
    Else
        If $beep Then $beep = False
    EndIf

    Sleep(200)
WEnd

Func _Exit() ;
    _Excel_Close($oExcel)
    Exit
EndFunc

Подскажите - как вместо Beep -поставить звук tada.wav ?
И как прописать точный адрес ячейки (с учетом листа) ?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Подскажите - как вместо Beep -поставить звук tada.wav ?
Код:
;Заменить строку
Beep()
;на строку
SoundPlay(@WindowsDir & "\media\tada.wav")

И как прописать точный адрес ячейки (с учетом листа) ?
Указать имя листа в функции "_Excel_RangeRead"
Код:
$sResult = _Excel_RangeRead($oWorkbook,'Имя листа', 'B3')

Запустил вот этот код кое-как на WindowsSerwer2008:
Этот код из Вашего первого поста и он не работает так , как Вам нужно, возьмите код из моего первого ответа.
Здесь имеет значение , скорее всего не сама операционная система, а версия установленного в системе Оффиса, например у меня случалось, что скрипты не работали с очень древними версиями оффиса.
 
Автор
S

Sky Green

Новичок
Сообщения
19
Репутация
0
ra4o, получился вот такой скрипт.
Код:
#include <excel.au3>

Global $beep = False
Global $sText = 'Значение'
Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\1.xls")
Global $oExcel = $oWorkBook.Application

$sResult = _Excel_RangeRead($oWorkbook,'Лист1', 'B3')
If $sResult == $sText Then $beep = True

While 1

    $sResult = _Excel_RangeRead($oWorkbook,'Лист1', 'B3')

    If $sResult == $sText Then
        If Not $beep Then
            $beep = True
            SoundPlay(@WindowsDir & "\media\tada.wav")
        EndIf
    Else
        If $beep Then $beep = False
    EndIf

    Sleep(200)
WEnd

Func _Exit() ;
    _Excel_Close($oExcel)
    Exit
EndFunc   ;==>_Exit

Он работает, но как-то очень необычно.
Если в ячейку вписано слово "Значение", то скрипт издает звуковые сигналы - не переставая. То есть при каждом последующем вводе числа в любую ячейку - скрипт сигналит.
Как его изменить, чтобы он срабатывал только при смене в ячейке любого содержимого, на текст "Значение" ?

А то получается, что скрипт воспринимает любое событие листа эксель (пересчет или ввод в ячейку) - как смену текста "Значение" - на текст "Значение".
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Да , действительно. Дело в том, что при редактировании любой ячейки скрипт перестаёт возвращать значение прочитанной ячейки - возвращает всегда "0" , когда редактирование таблицы завершается - возвращает реальное значение, вот и получается , что как бы значение ячейки "В3" изменилось с "0" на "Значение". Включение совместного доступа к книге Excel не исправляет ситуацию....
Пока на ум приходит только такой костыль :
Код:
If $beep and $sResult<>'0' Then $beep = False
 
Автор
S

Sky Green

Новичок
Сообщения
19
Репутация
0
ra4o, а куда именно в скрипте- эту строчку добавлять ?

Добавил вот так (не работает) :
Код:
#include <excel.au3>

Global $beep = False
Global $sText = 'Значение'
Global $oWorkBook = _Excel_BookAttach(@ScriptDir & "\1.xls")
Global $oExcel = $oWorkBook.Application

$sResult = _Excel_RangeRead($oWorkbook,'Лист1', 'B3')
If $sResult == $sText Then $beep = True

While 1

    $sResult = _Excel_RangeRead($oWorkbook,'Лист1', 'B3')

    If $sResult == $sText Then
        If Not $beep Then
            $beep = True
            SoundPlay(@WindowsDir & "\media\tada.wav")
        EndIf
    Else
        If $beep and $sResult<>'0' Then $beep = False
    EndIf

    Sleep(200)
WEnd

Func _Exit() ;
    _Excel_Close($oExcel)
    Exit
EndFunc   ;==>_Exit

Скрипт не то чтобы совсем не работает.
Просто он выдает звуковой сигнал - всего один-единственный раз.
Я имел ввиду выдачу сигнала - когда любое другое содержимое ячейки - меняется на содержимое "Значение" (но не смену слова "Значение", на слово "Значение". Иначе сигналы будут звучать постоянно при любом пересчете листа.).

А сейчас скрипт - просто один раз срабатывает на появление этого слова и все. Потом можно вписать другое слово, потом опять написать "Значение". Но скрипт реагировать уже не будет - хотя по идее при смене другого содержимого на ключевое слово - он должен среагировать.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Я имел ввиду выдачу сигнала - когда любое другое содержимое ячейки - меняется на содержимое "Значение" (но не смену слова "Значение", на слово "Значение". Иначе сигналы будут звучать постоянно при любом пересчете листа.).
Именно так он и работает, единственное ограничение, что он не будет считать изменнением содержимого ячейки, если оно будет равно "0"(причину описал в посте выше)
 
Верх