Спасибо. Начинаю немного понимать. Есть у меня такой макрос, он показывает время, как его можно переделать, чтобы он генерировал числа в заданном диапазоне (каждую секунду или через 2)?
Код
Sub vremya()
Application.OnTime Now + TimeSerial(0, 0, 1), "vremya"
ActiveSheet.Range("N5").Value = Format(Time, "hh:mm:ss")
End Sub
Здравствуйте! Пытаюсь создать звуковой "сигнализатор", который реагирует на определенную конфигурацию данных поступающих через DDE. И для того, чтобы один и тот же звук "не доставал", решил разбавить его несколькими. К примеру совпали условия и должен проиграть один из 3х звуков. Номер звука определяется случайно. Но беда в том, что у меня достаточно плотный поток данных и случайный генератор чисел вызывает ошибку, так как он реагирует на каждое изменение. Использую СЛУЧМЕЖДУ(). Без DDE потока работает норм., но если включить dde то возникает ошибка #ИМЯ. Пробовал и такой вариант ЕСЛИ(A2=1;СЛУЧМЕЖДУ(1;3);0) Всё равно вызывает ошибку, так как за то время, что действует условие (A2=1), а это пара секунд, генератор (из-за быстрого потока данных) выходит из строя.
Господа знатоки! Может есть такой способ, при котором числа генерируются строго раз в секунду или "по требованию", а не реагируют на каждое изменение в ячейках или в книге?
Здравствуйте! Хочется услышать от вас несколько советов и ответов на вопросы по оптимизации и ускорению работы Excel. Ситуация следующая: В файл поступают данные (через DDE) из 2х разных источников. Для каждого источника выделена своя страница. Данные занимают немного (одни и те же ячейки пару раз в секунду меняют значения) Всё занимает примерно 1/2 экрана. Имеет ли смысл перевести оба источника на один лист? Далее самые важные исходные данные с обоих листов поступают на "основной" лист, где проводятся вычисления, в основном сравнения, (к примеру если > то... ) т.е. никаких супер формул, максимум только сложение-вычитание, все просто. Но таблицы с данными разбросаны у меня по экрану (для удобства восприятия), между ними расстояние в 1 столбец или в 1-2 ряда, всё вместе занимает 1.5 экрана. Имеет ли смысл скомпоновать эти таблицы "впритык"? Имеет ли смысл убрать всякие закрашивания, рамочки и т.п.? Имеет ли смысл и данные с обоих источников и вычисления разместить на одном листе? Ускорит ли это работу хотя бы на пол секунды? Ну и в целом, хотелось бы услышать советы и хитрости если таковые имеются.
Добрый день! Имеется макрос, который проигрывает звук при определенных условиях. Условия эти действуют 1-2 секунды, но за это время он успевает включить звук несколько раз . Как сделать так, чтобы макрос после первого пересчета и срабатывания, оставлял о себе след в таблице, например в ячейку [A1] вносил цифру 1. В условиях он проверяет эту ячейку и если она больше ноля, условия не выполняются и следовательно повторно звук не будет включен. Подскажите пожалуйста, какие строки нужно добавить, чтобы в ячейку [A1] он поставил 1.
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 1), "NextTime"
If [A2] > 0 And [A1] < 1 Then
Call PlayMusic(Sound1)
' ставим 1 в ячейку [A1]
End If
End Sub
И снова здравствуйте! Как мне показалось я нашел способ решения данной проблемы. Скорее всего макрос со звуком срабатывал несколько раз, так как время работы условий было 1-2 секунды и он успевал пересчитать всё 2 раза и соответственно 2 раза включить звук. Вот я и подумал, что после первого пересчета, когда он 1 раз запускает плеер, сразу после этого макрос должен "дать о себе знать" самому себе. То есть поставить в определенную ячейку цифру. И если в момент следующего пересчета он "увидит" её, то условия будут не выполнены и музыка 2ой раз не включится. Вопрос только в том, как это реализовать? Какие строки вставить?
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 1), "NextTime"
If [A2] > 0 And [A1] < 1 Then
Call PlayMusic(Sound1)
'И вот тут мы ставим 1 в ячейку [A1]
End If
End Sub
Ок. давайте удалим тему, а я продолжу в одной из своих старых, где и описание проблемы и парочка советов как её решить, которые мне не подошли (ибо тупой я как пробка)
Здравствуйте! Как доработать данный макрос, чтобы он при выполнении условий ставил цифру в ячейку?
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 1), "NextTime"
If [A2] > 0 And [A1] < 1 Then
Call PlayMusic(Sound1)
'И вот тут мы ставим 1 в ячейку [A1]
End If
End Sub
Спасибо! Я так понял, что если формулы не сложные а на уровне =ЕСЛИ(I18<>J4;I18;I17), то от того, что ПК посчитает это 10 раз ничего страшного не случится. Ну а параллельно несколько книг я не открываю, значит и риск отключения/включения итераций снят. К тому же конкретно в моем случае на пиковых нагрузках Excel съедает всего 10-25 мб оперативной памяти. Значит всё норм.? И можно не парится?
Здравствуйте! Работаю с данными поступающими через DDE. В программировании не особо силен, поэтому вместо макросов и текстбоксов использую систему зацикленных ячеек, например для хранения последних 5-10 значений изменяющейся ячейки или для фиксации времени получения новых данных. Всего таких зацикленных и взаимосвязанных ячеек около 50. Но тут на форуме весьма не однозначное отношение к такому способу хранения инф. В связи с чем у меня ряд вопросов. Чем этот способ так плох? Влияет ли это на скорость выполнения операций? На производительность и загруженность ПК?
Здравствуйте! Подскажите пожалуйста, как можно преобразовать данный макрос (см. внизу). Что бы он если выполнены условия, автоматом нажимал alt+f4 чтобы закрылась программа, которая открыта (не excel, excel свернут) .
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 1), "NextTime" 'вызов каждую 5 секунд
If [A2] > 0 Then
' нажать альт+ф4
End If
End Sub
Hugo написал: Попробуйте так. Зачем там это vremja?
Здравствуйте! При ручном вводе отлично работает, однако же через DDE молчит как партизан. А vremja для того, чтобы сравнивать текущее время с продолжительностью действий условий. То есть чтобы 0 стала 1, а затем обратно 0.
Вот файлик, хотя вряд ли он будет полезен без источника ДДЕ. Но здесь хотя бы виден алгоритм. В общем есть ли в Екселе функция sleep ? Чтобы макрос при первом срабатывании засыпал на 1-2 секунды?
Hugo написал: Подозреваю что одновременно с этим макросом срабатывает и макрос отслеживающий событие изменения ячейки. Что хотите вообще сделать? Ну и давайте файл.
У меня все данные идут через DDE. То есть сам файл наверно смысла не имеет. Все макросы, которые записаны в модуле (других в пинципе нет, так как Privat sub через DDE не робят) вот они (внизу) А задумка была в следущем, через DDE поступают данные и если совокупность данных соответсвует заданным критериям, то в ячейке меняется 0 на 1 и звучит сигнал.
Код
Dim mp As Object
Const SoundFile = "C:\Temp\1.wav"
Sub vremya()
Application.OnTime Now + TimeSerial(0, 0, 1), "vremya"
ActiveSheet.Range("N5").Value = Format(Time, "hh:mm:ss")
End Sub
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 1), "NextTime"
If [A1] > 0 Then
Call PlayMusic(SoundFile)
End If
End Sub
Sub PlayMusic(Filename)
On Error Resume Next
Dim f As String, i
f = Trim(Filename)
If Len(f) = 0 Or Len(Dir(f)) = 0 Then
' Файл не найден - воспроизводим, что найдем
i = Int(9 * Rnd + 1)
f = "C:\Temp\11" & i & ".wav"
End If
mp.stop
Set mp = CreateObject("MediaPlayer.MediaPlayer")
mp.AutoStart = True
mp.Open f
End Sub
' ZVI:2008-10-25 Останов воспроизведения звука
Sub StopMusic()
On Error Resume Next
mp.stop
Set mp = Nothing
End Sub
Исправил. Теперь всё, как я описал. Но поверьте, за эту секунду успевает по 2-3 раза включить звуковой файл. 1ый раз не до конца, так как тут же включает 2ой и вот уже во второй заход мелодия играет полностью.
Здравствуйте! Имеется макрос, который при изменении 0 на 1 (буквально на секунду) , начинает проигрывать звуковой сигнал. Но проблема в том, что за эту секунду он успевает включить его несколько раз. Может есть способ сделать так, что бы звук играл только один раз? (самый простой наверное сделать "тишину" вначале самого звукового файла) Но может есть нечто вроде функции sleep или т.п. ?
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 1), "NextTime"
If [A1] > 0 Then
Call PlayMusic(SoundFile)
End If
End Sub
Здравствуйте! Почему не преобразовывается значение функции? Да и вообще никак не хочет взаимодействовать. Например в A1:A4 стоят цифры, а в B2 стоит ЕЧЁТН(A1), а в C1 =ЕСЛИ(B1="ИСТИНА";1;0). Но почему то в любом случае, независимо истина или нет, в С1 всегда ноль. Как это исправить?
А как заставить их работать при машинном вводе? У меня такие работают только при ручном вводе. А вот макрос Sub NextTime() (пример вверху) пересчитывается каждую секунду.
Private Sub Worksheet_Change(ByVal Target As Range)
For Each cell In Target 'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("J1:J2")) Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A100
With cell.Offset(0, 1) 'вводим в соседнюю справа ячейку дату
.Value = Now
.EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
End If
Next cell
End Sub
А мне нужно чтобы из модуля можно было его вызвать, как наприер этот с названием
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 5), "NextTime" 'вызов каждую 5 секунд
iP = [N1]
iG = [N2]
iK = [K14]
iE = [K15]
If iP > iG And iK > iE Then
Call PlayMusic(SoundFile)
End If
' If [p5] > [g2] Then
' Call Звук
' End If
End Sub
Здравствуйте! У меня на самом деле много вопросов и большинство ответов я нашел в поиске. Но есть одно жирное НО. Почти всё, что нужно мне сделать в Excel делается через Privat sub макросы. Мне такой вариант не подходит, так как работаю через DDE и отсутствует ручной ввод данных, да и пересчет нужных ячеек нужно делать раз в 1-2 секунды. И что бы не создавать по несколько тем, я решил сократить кол-во вопросов до одного. (надеюсь, что решение данного вопроса, поможет мне решить все остальные) Как Privat sub'ы перевести в обычные макросы с названиями ?
Юрий М написал: В таком случае теперь поищите, какие неприятности таят в себе циклические ссылки )
Я правильно понимаю, что они порождают процесс "бесконечных" вычислений? И ограничив число итераций 10 я устраню эти "неприятности"? Или есть еще другие подводные камни?
Юрий М написал: Я бы использовал (спасибо ZVI) скрытый ТекстБокс на листе, связав его с ячейкой. И отслеживал бы событие Change этого ТекстБокса.
Вот тут то у меня начинаются проблемы. Так как я ни черта не понимаю в программировании, терминах и операторах. Но я так понял, вместе с изменением в ячейке, в другую ячейку вводится время изменения. Как это реализовать?
Юрий М Да, вы правы, данные поступают через DDE, затем пару формул и "буферизация в ячейке" То есть несмотря на изменения внешних данных число остается прежним, пока внешние данные не будут соответствовать условиям, вот тот момент, когда сложатся обстоятельства и ячейка примет другое значение, хочется зафиксировать во времени. То есть нужны не все даты/время изменений, а только 1 последнее. Есть ячейка куда макросом каждые 5 секунд прописывается текущее время. Сейчас думаю как это можно заюзать
Здравствуйте! Уже несколько дней никак не могу решить проблему. Имеются 2 ячейки, в которыx периодически (наверное раз в 5-10 минут) меняются числа. В результате кучи операций и формул. Не в ручную! Имеется код.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
For Each cell In Target 'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("J1:J2")) Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A100
With cell.Offset(0, 1) 'вводим в соседнюю справа ячейку дату
.Value = Now
.EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
End If
Next cell
End Sub
Но он считывает изменения только при ручном вводе! Как сделать чтобы данный макрос учитывал "не ручной" ввод и пересчитывался каждые 5 секунд? И в соседней ячейке писал время последнего изменения.
И еще такой вот вопрос. Как перевести эти безымянные Private Sub в обычные макросы с именем, которые можно вызывать (из других макросов например).
как здесь например:
Код
Sub NextTime()
Application.OnTime Now + TimeSerial(0, 0, 5), "NextTime" 'вызов каждую 5 секунд
iP = [N1]
iG = [N2]
iK = [K14]
iE = [K15]
If iP > iG And iK > iE Then
Call PlayMusic(SoundFile)
End If
' If [p5] > [g2] Then
' Call Звук
' End If
End Sub