Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 13:18   #1
Severny
Форумчанин
 
Регистрация: 07.10.2010
Сообщений: 144
По умолчанию Макрос текущего времени и привязка его к кнопке

Доброго всем времени суток!
Решил вот написать макрос который проставляет текущее время и привязать его к кнопке (типа "Обновить")
Вот сам макрос для времени:
Код:
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Set IR = Selection
    For Each iCell In IR
        ActiveCell.FormulaR1C1 = "=NOW()"
    Next
End Sub
Объясните пожалуйста почему он не проставляет ТДАТА во все ячейки выделеного диапазона?
Severny вне форума Ответить с цитированием
Старый 16.03.2011, 13:30   #2
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от Severny Посмотреть сообщение
Объясните пожалуйста почему он не проставляет ТДАТА во все ячейки выделеного диапазона?
Потому что Вы только в активную ячейку формулу проставляете. Несколько раз. Ровно столько раз, сколько будет пройден цикл. Найдите отличия.
Код:
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Set IR = Selection
    For Each iCell In IR
        iCell.FormulaR1C1 = "=NOW()"
    Next
End Sub
А проще делать так, без цикла:

Код:
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Selection.FormulaR1C1 = "=NOW()"
End Sub
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 16.03.2011, 13:40   #3
Severny
Форумчанин
 
Регистрация: 07.10.2010
Сообщений: 144
По умолчанию

Цитата:
Сообщение от The_Prist Посмотреть сообщение
Потому что Вы только в активную ячейку формулу проставляете. Несколько раз. Ровно столько раз, сколько будет пройден цикл.
...
А проще делать так, без цикла:

Код:
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Selection.FormulaR1C1 = "=NOW()"
End Sub
Спасибо Вам!
Вы знаете, понял что у меня не правильно, но уже было позно, Вы ответили
Вот мое после доусовершенствования:
Код:
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Set IR = Selection
    For Each iCell In IR
        Selection.FormulaR1C1 = "=NOW()"
        Selection.NumberFormat = "dd/mm/yyyy""//""h:mm:ss"
    Next
End Sub
Но послушаюсь Вашего совета, обойдусь без цикла.
А вопрос такого характера: как заставить этот макрос обновлятся каждую секунду, что бы получились идущие часы?
Severny вне форума Ответить с цитированием
Старый 16.03.2011, 14:16   #4
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от Severny Посмотреть сообщение
А вопрос такого характера: как заставить этот макрос обновлятся каждую секунду, что бы получились идущие часы?
Код:
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Selection.FormulaR1C1 = "=NOW()"
    Selection.NumberFormat = "dd/mm/yyyy""//""h:mm:ss"
    Call Refresh_Time
End Sub
Sub Refresh_Time()
    ActiveSheet.Calculate
    Application.OnTime Now + TimeValue("00:00:01"), "Refresh_Time"
End Sub
Смысл в формуле теряется, если надо обновлять каждую секунду. :-) Можно сразу значения времени заносить в ячейки.
Код:
Dim rRng As Range
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Set rRng = Selection: rRng = Now
    rRng.NumberFormat = "dd/mm/yyyy""//""h:mm:ss"
    Call Refresh_Time
End Sub
Sub Refresh_Time()
    rRng = Now
    Application.OnTime Now + TimeValue("00:00:01"), "Refresh_Time"
End Sub
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 17.03.2011, 13:15   #5
Severny
Форумчанин
 
Регистрация: 07.10.2010
Сообщений: 144
По умолчанию

Цитата:
Сообщение от The_Prist Посмотреть сообщение
Смысл в формуле теряется, если надо обновлять каждую секунду. :-) Можно сразу значения времени заносить в ячейки.
Код:
Dim rRng As Range
Sub ВставкаТекущегоВремени() ' Вставка текущего времени
    Set rRng = Selection: rRng = Now
    rRng.NumberFormat = "dd/mm/yyyy""//""h:mm:ss"
    Call Refresh_Time
End Sub
Sub Refresh_Time()
    rRng = Now
    Application.OnTime Now + TimeValue("00:00:01"), "Refresh_Time"
End Sub
Не обновляет почему-то каждую секунду.
Severny вне форума Ответить с цитированием
Старый 17.03.2011, 13:47   #6
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

А если так, поместите в модуль Эта книга код
Код:
Sub Start()
    Call Refresh_Time
End Sub
теперь обновляет
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 17.03.2011, 15:46   #7
Severny
Форумчанин
 
Регистрация: 07.10.2010
Сообщений: 144
По умолчанию

Цитата:
Сообщение от VictorM Посмотреть сообщение
А если так, поместите в модуль Эта книга код
Код:
Sub Start()
    Call Refresh_Time
End Sub
теперь обновляет
Утвержтает, что не может найти макрос Refresh_Time.

Последний раз редактировалось Severny; 17.03.2011 в 15:54.
Severny вне форума Ответить с цитированием
Старый 17.03.2011, 19:46   #8
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от Severny Посмотреть сообщение
Утвержтает, что не может найти макрос Refresh_Time.
Уже странно. Если так утверждает - значит у него есть на то основания.
Вы явно размещаете код не там, где надо. Код надо поместить в стандартный модуль. Затем просто запустить процедуру ВставкаТекущегоВремени. И будет Вам счастье.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 18.03.2011, 09:59   #9
Severny
Форумчанин
 
Регистрация: 07.10.2010
Сообщений: 144
По умолчанию

Давайте начнем сначала:
Когда я вставляю этот код:
Код:
Sub ВставкаИдущегоВремени() ' Вставка текущего времени
    Dim rRng As Range
    Set rRng = Selection: rRng = Now
    rRng.NumberFormat = "dd/mm/yyyy""//""h:mm:ss"
    Call RefreshTime
End Sub

Sub RefreshTime()
    rRng = Now
    Application.OnTime Now + TimeValue("00:00:01"), "RefreshTime"
End Sub
Sub Start()
    Call RefreshTime
End Sub
в Эта книга пишет то что я описывал выше.
Если тот самый код вставляю в Module1 то Sub RefreshTime() выполняется но этого не видно в ячейке. Видно по мигающему с частотой в секунду курсору. Что я делаю не так?
Severny вне форума Ответить с цитированием
Старый 18.03.2011, 11:21   #10
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от Severny Посмотреть сообщение
в Эта книга пишет то что я описывал выше.
Если тот самый код вставляю в Module1 то Sub RefreshTime() выполняется но этого не видно в ячейке. Видно по мигающему с частотой в секунду курсору. Что я делаю не так?
Вы неверно вставляете в модуль объявление переменной:
Код:
Dim rRng As Range
Эта строка должа идти перед всеми процедурами модлуя(в области объявлений). А никак не внутри одной процедуры. Посмотрите внимательно выложенный мной код и найдите разницу в моем и Вашем с учетом написанного мной в этом посте про переменную.

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

Так вот: в нашем случае мы имеем дело - в Вашем коде с переменной процедуры. Т.е. Вы объявлили переменную rRng внутри процедуры ВставкаИдущегоВремени. А т.к. она объявлена через Dim(а не Static, но это другая история), то её значение стирается по завершении процедуры, в которой она объявлена. Таким образом, Вы один раз присваиваете значение этой переменной, меняете значение и процедура завершается, обнулив эту переменную.
Но ведь переменная эта у нас и в другой процедуре используется - RefreshTime. Вот и получается, что во второй процедуре Вы не можете изменить значение нужной ячейки, т.к. данные по ней уже стерты из памяти.

Если же объявить как я написал выше - в области объявлений - то значение переменной будет сохраняться во всех процедурах в пределах того модуля, внутри которого объявлена.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru

Последний раз редактировалось The_Prist; 18.03.2011 в 11:29.
The_Prist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка текущего времени arcer Win Api 4 02.10.2010 21:38
Чтение текущего времени на компе Explosion Общие вопросы Delphi 4 11.05.2010 13:13
Вывод текущего времени формата H:M:S:MS, где MS - миллисекунды Gypsy Помощь студентам 5 13.01.2010 18:05
Привязка макроса к кнопке VisuaL Microsoft Office Excel 7 10.05.2008 07:04
Запись текущего времени CaHeK Общие вопросы Delphi 3 06.04.2008 17:23