Closed TopicStart new topicStart Poll

Страницы: (1) 1 
trifnvoleg
дата: [ i ]
  • Group Icon
  • Мастер
  • Репутация: 1187
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Уважаемые, подскажите, пожалуйста, если знаете, а то я уже долго не могу найти ответа на свои вопросы...

1. В Microsoft Excel 2002 и 2003 в Редакторе Визуального Бейсика отсутствует контролька Timer. Нет ли какой-нибудь возможности её туда заполучить? Может быть как-нибудь через опцию Additional Controls? Там огромный список открывается. Уж очень мне без Таймера неудобно, привык я к нему в Визуальном Бейсике. А в VBA только начинаю делать первые шаги и сразу такая вот неприятность... Или же там вообще нет возможности использовать привычный Таймер и всё, что с ним связано надо делать через API- функции? SetTimer и прочие... Я с ними мало общался, честно говоря, потому-то мне и хотелось бы использовать привычную контрольку...

2. В Visual Basic 6.0 столкнулся с такой проблемой... Программа должна начать работу при нажатии командной кнопки и закончить её через 3 секунды...
Текст программы приблизительно вот такой:

Option Explicit
Dim ВремяСтарта As Variant
Dim КрайнееВремяОкончанияПрограммы As Variant
Dim ТекущееВремя As Variant

Private Sub Command1_Click()
ВремяСтарта = Format(Time, "hh:mm:ss")
ТекущееВремя = ВремяСтарта
10 КрайнееВремяОкончанияПрограммы = ВремяСтарта + 3

Do While КрайнееВремяОкончанияПрограммы >= ТекущееВремя
ТекущееВремя = Format(Time, "hh:mm:ss")
DoSomeThing
Loop

End

End Sub



Private Sub DoSomeThing()

End Sub



В строке, которой я присвоил №10, должны прибавиться эти самые 3 секунды, но этого-то сделать как раз у меня и не получается. Я уж разные типы данных перепробовал: и String, и Variant... Не получается... Вроде бы нет такого типа Time? Есть только Date, но это для работы с датами (днями, месяцами и годами)...
Можно, конечно, все эти переменные интерпретировать как Стринги, а потом вырезать часы, минуты и секунды, через Val преобразовывать их в числа, потом домножить, соответственно, на 3600 и 60, ссуммировать, получать некоторое число, потом это число снова "раскладывать" на часы, минуты и секунды... Но это ж какой геморрой! Неужели нет "изящной" возможности просто приплюсовать эти самые злосчастные 3 секунды?!

Это сообщение отредактировал trifnvoleg - 30-08-2009 - 00:49
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
Кто ответит не по теме топика или в неуважительном тоне к топикстартеру, получит лично от меня вкусное предупреждение.


trifnvoleg, изящно - это использование объектов ядра и синхронизации. А для работы со временем используют не логическое сравнение, а DateDiff или что-то типа того. Тип VARIANT - это вообще универсальный тип, который аггрегирует все. В смысле вообще все. Закрепите одно понятие - унарные и бинарные операции возможны только для основных типов. Для всего остального нужны специализированные функции. Вам же не приходит в голову умножать на два строку? :)
trifnvoleg
дата: [ i ]
  • Group Icon
  • Мастер
  • Репутация: 1187
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE (JeyLo @ 30.08.2009 - время: 10:19)

trifnvoleg, изящно - это использование объектов ядра и синхронизации. А для работы со временем используют не логическое сравнение, а DateDiff или что-то типа того.


---------------------------
Спасибо за отклик, но, честно говоря, я не знаю, что такое "объекты ядра и синхронизация". Мне нужно как-нибудь (желательно, конечно, попроще) добавить ко времени старта проги 3 секунды. Хотелось бы просто услышать готовый рецепт, если можно. Ну или же услышать что-то вроде: "Не морочь себе голову, парень, в Визуальном Бейсике такой возможности не заложено, вырезай строке посредством Mid, преобразуй их в числа посредством Val, домножай на 3600 и 60, потом ссумируй, добавляй свои три секунды, потом снова (в обратном порядке) преобразуй всё в строку формата "00.00.00" и сравнивай с текущим временем. Это единственный путь, который возможен в рамках этого языка программирования, более лёгкого пути просто-таки не существует". Услышав это я бы успокоился и делал именно так, как описано выше. Но ведь обидно же, если есть возможность сделать что-то легко как-нибудь, идти по такому длинному утомительному пути...

По поводу DateDiff... Это же функция для работы с датами, а не со временем, насколько я понимаю...
DateDiff Function Example
This example uses the DateDiff function to display the number of days between a given date and today.

Dim TheDate As Date ' Declare variables.
Dim Msg
TheDate = InputBox("Enter a date")
Msg = "Days from today: " & DateDiff("d", Now, TheDate)
MsgBox Msg


А мне же не даты нужно сравнивать (дни, месяцы, годы), а часы, минуты и секунды... Или же там как-нибудь можно и секунды сравнивать тоже?
Но в любом случае, сравнивать-то придётся с тем временем, к которому УЖЕ прибавлены 3 секунды. И вопрос, как это сделать (прибавить), остается открытым... Проблема именно в строке 10, я ж её не зря выделил. А вся остальная часть кода работает без проблем...

QUOTE (JeyLo @ 30.08.2009 - время: 10:19)

Тип VARIANT - это вообще универсальный тип, который аггрегирует все. В смысле вообще все. Закрепите одно понятие - унарные и бинарные операции возможны только для основных типов. Для всего остального нужны специализированные функции. Вам же не приходит в голову умножать на два строку? :)


---------------
Да знаю я, что Variant - уто универсальный тип данных, который может интерпретироваться программой по-разному в зависимости от обстоятельств. Я ж потому его и попробовал использовать, что всё остальное уже перепробовал (String, Date) и ничего у меня не получилось. Хорошо бы, чтобы там был тип данных Time, но его вроде бы не существует вообще..

И ещё... Очень бы хотелось услышать что-нибудь по поводу Таймера в VBA и конкретно в Excel...
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
QUOTE (trifnvoleg @ 30.08.2009 - время: 13:22)
Спасибо за отклик, но, честно говоря, я не знаю, что такое "объекты ядра и синхронизация

You can use the DateDiff function to determine how many specified time intervals exist between two dates. For example, you might use DateDiff to calculate the number of days between two dates, or the number of weeks between today and the end of the year up to seconds.

Вплоть до s - секунд.

Хер знает, как переведу.
Вы можете использовать функцию DateDiff для определения сколько времени прошло между двумя датами. Для примера, вы можете использовать DateDiff для вычисления количества дней между двумя датами, или количество неделей между началом года и сегодняшним днем, с точностью до секунды.

Объекты ядра - это семафоры, эвенты и прочие. %) HANDLE, короче.
trifnvoleg
дата: [ i ]
  • Group Icon
  • Мастер
  • Репутация: 1187
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Ну а как мне ему (компу) всё-таки вдолбить-то с каким временем сравнивать? Вот, допустим на кнопку "Старт" мы нажали в 15 часов 35 минут и 46 секунд. Т.е. имеем такой Стринг "15.35.46". Как ему объяснить, что нужно сравнивать текущее время со Стрингом "15.35.49"? А если начало проги в "15.59.59", то нужно сравнивать уже с "16.00.02"? Сравнивает-то он и безо всяких DateDiff-ов без проблем (просто строки сравнивает, вот и всё), а вот как объяснить ему С ЧЕМ нужно сравнивать - вот в чём состоит проблема... Как получить это самое "конечное число", не прибегая к сложным преобразованием? Или их всё-таки не избежать? Ну не верится мне даже, что в среде разработки Visual Basic 6.0 нет возможности прибавить к определённому времени заданный интервал...
trifnvoleg
дата: [ i ]
  • Group Icon
  • Мастер
  • Репутация: 1187
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Всё!!! Эврика!!! На меня только что озарение снизошло!!! Можно же использовать обычный таймер с интервалом 3000, т.е. как раз 3 секунды и не морочить голову себе и другим коллегам своими теоретическими изысканиями smile.gif Я же, в конце концов, не профессионально коммерческие программы пишу, а так для себя время от времени, чтобы облегчить себе какие-нибудь рутинные задачи...

Теперь будет так: при загрузке формы запускается таймер, потом программа делает свои дела, а через 3 секунды он срабатывает, и прога по этому Евенту прекращает свою работу...

Я сейчас прикинул... Это будет выглядеть вот так приблизительно:

Option Explicit

Private Sub Form_Load()
Timer1.Interval = 3000
Timer1.Enabled = True

ПрогаДелаетСвоиДела

End Sub

Private Sub Timer1_Timer()
MsgBox "3 секуды истекло... Программа заканчивает свою работу..."
Timer1.Enabled = False '(можно и не выключать, на самом деле)
End
End Sub


Private Sub ПрогаДелаетСвоиДела()

End Sub



Вот ведь какая полезная штука этот Timer!!! Кто бы мне ещё подсказал, как его в Excel-ные макросы заполучить... А то ж без него ну очень неудобно...

Там задумка у меня такая - Excel импортирует данные из Интернета и помещает их в таблицу. Когда в самой важной для меня ячейке значение превысит определённый порог должен прозвучать звуковой сигнал. Ну чтобы мне у компа не сидеть целый день smile.gif Это он меня должен как бы позвать smile.gif
Ну и вот... Всё уже продумано, проблем я не вижу. Даже с воспроизведением звука в Екселе уже разобрался. Вся загвоздка в том, что программа должна постоянно просматривать значение в этой ячейке и сверять его с этим "порогом"... Если это делать в бесконечном цикле, например, то это ж сколько ресурсов он (комп) будет жрать. А мне было бы оптимально один раз в пол-секунды туда заглядывать... Вот тут-то Таймер и пригодился бы очень... Хотя сейчас вот, пока писал этот текст, в голову пришло, что можно просто на изменения значения в этой ячейке реагировать... Но всё равно с Таймером мне гораздо привычнее было бы...

Сейчас вот опять отошёл на некоторое время, призадумался. Вроде бы там всё-таки, как мне кажется, нет возможности реагировать на изменение значения в отдельной ячейке. Я где-то на каком-то форуме встречал уже фразу о том, что Рабочий Лист - это объект, а отдельная ячейка - это не объект и, следовательно, изменение одной ячейки - это не Event. А если макрос будет реагировать на изменения во всех ячейках этого листа и отфильтровывать изменения только в той, которая меня интересует, то опять же много ресурсов прога будет жрать, мне так часто совсем не надо. В самой-то этой ячейке значение не слишком часто меняется. Разочек в полсекунды заглянуть бы, да и дело с концом...
Короче, позарез нужен таймер! Люди добрые, дайте мне Таймер в Excell, озолочу!!! smile.gif Ну в смысле, тому, кто поможет, гарантирую 10 плюсов в рассрочку в течение 20 дней!

Это сообщение отредактировал trifnvoleg - 30-08-2009 - 16:50
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
... DateDiff ...
trifnvoleg
дата: [ i ]
  • Group Icon
  • Мастер
  • Репутация: 1187
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE (JeyLo @ 31.08.2009 - время: 12:55)
... DateDiff ...

----------------
Спасибо за идею! Это, конечно, не совсем то, что удобный и привычный для меня Таймер, но, в принципе, наверно, должно сработать. Надо только будет мне познакомиться с этой функцией поближе...

P.S. Я своё слово сдержу...
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
http://cpearson.com/excel/OnTime.aspx
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
М-дя.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)

Страницы: (1) 1

Closed TopicStart new topicStart Poll0


Рекомендуем почитать также топики:

Помогите разобраться - проблема с ЖЖ

Новый жесткий диск

Fortran

Как заправить картридж?!

Нужен shell экзамена Microsoft № 70-290



>