Здравствуйте есть "календарь", у которого заведена кнопка "сегодня" для выставления текущей даты Для упрощения сегодняшняя дата присваивается конечной ячейке Но применение этой функции дает ошибку.
Подскажите как правильно применить эту функцию.
если не трудно, то подскажите, как получить отдельно год, месяц и день из функции TODAY для того, чтобы присвоить их значения определенным ячейкам в коде VBA (например, N16, L16 и К16, соответственное)
код VBA:
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 2 Then Exit Sub ' проверяем, что фокус захватил единичную ячеку, а не диапазон If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,c3")) Is Nothing Then
If Not Intersect(Target, Range("L4:L15")) Is Nothing Then Cells(16, 12) = Target.Row - 3 If Not Intersect(Target, Range("n5:n12")) Is Nothing Then Cells(16, 14) = Cells(Target.Row, 14) If Not Intersect(Target, Range("d4:j15")) Is Nothing Then Cells(2, 11) = Cells(Target.Row, Target.Column)
'If Not Intersect(Target, Range("n15")) Is Nothing Then Cells(2, 12) = today() 'или 'If Not Intersect(Target, Range("n15")) Is Nothing Then ' Cells(16, 11) = ДЕНЬ(today()) ' Cells(16, 14) = МЕСЯЦ(today()) ' Cells(16, 16) = ГОД(today()) 'End If
' а так же 'If Not Intersect(Target, Range("L2")) Is Nothing Then "копирование в буфер обмена только значения"
End If
End Sub
[/vba]
2. Подскажите, пожалуйста, так же правильный код для копирования результата (ячейка L2) в буфер обмена как значение даты. Т.к. простое копирование не позволяет потом вставить просто результат из буфера без форматирования (ячейка является объединенной и форматированной)
спасибо
Здравствуйте есть "календарь", у которого заведена кнопка "сегодня" для выставления текущей даты Для упрощения сегодняшняя дата присваивается конечной ячейке Но применение этой функции дает ошибку.
Подскажите как правильно применить эту функцию.
если не трудно, то подскажите, как получить отдельно год, месяц и день из функции TODAY для того, чтобы присвоить их значения определенным ячейкам в коде VBA (например, N16, L16 и К16, соответственное)
код VBA:
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 2 Then Exit Sub ' проверяем, что фокус захватил единичную ячеку, а не диапазон If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,c3")) Is Nothing Then
If Not Intersect(Target, Range("L4:L15")) Is Nothing Then Cells(16, 12) = Target.Row - 3 If Not Intersect(Target, Range("n5:n12")) Is Nothing Then Cells(16, 14) = Cells(Target.Row, 14) If Not Intersect(Target, Range("d4:j15")) Is Nothing Then Cells(2, 11) = Cells(Target.Row, Target.Column)
'If Not Intersect(Target, Range("n15")) Is Nothing Then Cells(2, 12) = today() 'или 'If Not Intersect(Target, Range("n15")) Is Nothing Then ' Cells(16, 11) = ДЕНЬ(today()) ' Cells(16, 14) = МЕСЯЦ(today()) ' Cells(16, 16) = ГОД(today()) 'End If
' а так же 'If Not Intersect(Target, Range("L2")) Is Nothing Then "копирование в буфер обмена только значения"
End If
End Sub
[/vba]
2. Подскажите, пожалуйста, так же правильный код для копирования результата (ячейка L2) в буфер обмена как значение даты. Т.к. простое копирование не позволяет потом вставить просто результат из буфера без форматирования (ячейка является объединенной и форматированной)
по первому вопросу.... первое что бросилось в глаза [vba]
Код
If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,c3")) Is Nothing Then
[/vba] в вашем диапазоне нет n15 а чтобы узнать сегоднюшнуююую дату используйте Year(now) Mounth(now) e.c.t или просто Date
по второму вопросу...эм, честно говоря не понял)) но вот что думаю [vba]
Код
Dim Сегодня As Date Сегодня = Range("l2") Cells(21, 21) = Сегодня
[/vba]
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 2 Then Exit Sub ' проверяем, что фокус захватил единичную ячеку, а не диапазон If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,c3,n15")) Is Nothing Then
If Not Intersect(Target, Range("L4:L15")) Is Nothing Then Cells(16, 12) = Target.Row - 3 If Not Intersect(Target, Range("n5:n12")) Is Nothing Then Cells(16, 14) = Cells(Target.Row, 14) If Not Intersect(Target, Range("d4:j15")) Is Nothing Then Cells(2, 11) = Cells(Target.Row, Target.Column) If Not Intersect(Target, Range("n15")) Is Nothing Then Range("r16") = Year(Now) & " year" Range("q16") = Month(Now) & " mounth" Range("p16") = Day(Now) & " day" End If End If Dim Сегодня As Date Сегодня = Range("l2") Cells(21, 21) = Сегодня
End Sub
[/vba]
по первому вопросу.... первое что бросилось в глаза [vba]
Код
If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,c3")) Is Nothing Then
[/vba] в вашем диапазоне нет n15 а чтобы узнать сегоднюшнуююую дату используйте Year(now) Mounth(now) e.c.t или просто Date
по второму вопросу...эм, честно говоря не понял)) но вот что думаю [vba]
Код
Dim Сегодня As Date Сегодня = Range("l2") Cells(21, 21) = Сегодня
[/vba]
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 2 Then Exit Sub ' проверяем, что фокус захватил единичную ячеку, а не диапазон If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,c3,n15")) Is Nothing Then
If Not Intersect(Target, Range("L4:L15")) Is Nothing Then Cells(16, 12) = Target.Row - 3 If Not Intersect(Target, Range("n5:n12")) Is Nothing Then Cells(16, 14) = Cells(Target.Row, 14) If Not Intersect(Target, Range("d4:j15")) Is Nothing Then Cells(2, 11) = Cells(Target.Row, Target.Column) If Not Intersect(Target, Range("n15")) Is Nothing Then Range("r16") = Year(Now) & " year" Range("q16") = Month(Now) & " mounth" Range("p16") = Day(Now) & " day" End If End If Dim Сегодня As Date Сегодня = Range("l2") Cells(21, 21) = Сегодня
модераторам извинения (за неверное расположение по темам)
Матраскин, спасибо
причесал. Получилось следующее:
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 2 Then Exit Sub ' проверяем, что фокус захватил единичную ячеку, а не диапазон If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,n15")) Is Nothing Then
If Not Intersect(Target, Range("n5:n12")) Is Nothing Then Cells(16, 14) = Cells(Target.Row, 14) ' год If Not Intersect(Target, Range("L4:L15")) Is Nothing Then Cells(16, 12) = Target.Row - 3 ' месяц If Not Intersect(Target, Range("d4:j15")) Is Nothing Then Cells(16, 11) = Day(Cells(Target.Row, Target.Column)) ' день
If Not Intersect(Target, Range("n15")) Is Nothing Then Cells(16, 11) = Day(Now) Cells(16, 12) = Month(Now) Cells(16, 14) = Year(Now) End If
End If
End Sub
[/vba]
теперь работает почти как надо спасибо
один из вопросов преобразовался в следующий 1. как выделить текущую дату (образованную ячеками год, месяц и день - N16, L16, K16) в диапазоне дат (d4:j15) если кликать на ячейки - они выделяются если кликать на месяц или год, то выделенными остаются выбираемые ячейки, а полученная дата не имеет фокуса в указанном диапазоне (не понятно, рабочий это день или выходной) это не критично, но наглядности добавило бы
наверное, нужен цикл и сравнение? или есть функция для диапазона?
Саня, уточню вопрос: 2. второй вопрос - получить в буфер обмена выбранную дату (т.е. в конце подпрограммы код, который бы копировал в буфер обмена выбранную дату, т.е. DATE(N16, L16, K16)
суть - в минимизации кликов т.е. открыл лист с календарем, выбрал год, месяц дату - и уже имеешь в буфере дату вернулся к своему файлу и Ctrl+С вставил дату как данные без форматов без всяких ухищрений (чтобы не копировать в Блокнот и обратно для избавления от форматов или не искать в выпадающем меню картинку копирования только значения) т.е. за три клика имеешь в буфере "чистую" (от форматирования) дату
не знаю, что может подойти в данном случае
модераторам извинения (за неверное расположение по темам)
Матраскин, спасибо
причесал. Получилось следующее:
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 2 Then Exit Sub ' проверяем, что фокус захватил единичную ячеку, а не диапазон If Not Intersect(Target, Range("d4:j15,l4:l15,n5:n12,n15")) Is Nothing Then
If Not Intersect(Target, Range("n5:n12")) Is Nothing Then Cells(16, 14) = Cells(Target.Row, 14) ' год If Not Intersect(Target, Range("L4:L15")) Is Nothing Then Cells(16, 12) = Target.Row - 3 ' месяц If Not Intersect(Target, Range("d4:j15")) Is Nothing Then Cells(16, 11) = Day(Cells(Target.Row, Target.Column)) ' день
If Not Intersect(Target, Range("n15")) Is Nothing Then Cells(16, 11) = Day(Now) Cells(16, 12) = Month(Now) Cells(16, 14) = Year(Now) End If
End If
End Sub
[/vba]
теперь работает почти как надо спасибо
один из вопросов преобразовался в следующий 1. как выделить текущую дату (образованную ячеками год, месяц и день - N16, L16, K16) в диапазоне дат (d4:j15) если кликать на ячейки - они выделяются если кликать на месяц или год, то выделенными остаются выбираемые ячейки, а полученная дата не имеет фокуса в указанном диапазоне (не понятно, рабочий это день или выходной) это не критично, но наглядности добавило бы
наверное, нужен цикл и сравнение? или есть функция для диапазона?
Саня, уточню вопрос: 2. второй вопрос - получить в буфер обмена выбранную дату (т.е. в конце подпрограммы код, который бы копировал в буфер обмена выбранную дату, т.е. DATE(N16, L16, K16)
суть - в минимизации кликов т.е. открыл лист с календарем, выбрал год, месяц дату - и уже имеешь в буфере дату вернулся к своему файлу и Ctrl+С вставил дату как данные без форматов без всяких ухищрений (чтобы не копировать в Блокнот и обратно для избавления от форматов или не искать в выпадающем меню картинку копирования только значения) т.е. за три клика имеешь в буфере "чистую" (от форматирования) дату
не знаю, что может подойти в данном случаекарандаш
Саня, спасибо, да предложенный метод работает ))) коротко и красиво, без всяких извращений с кучей дополнительных ячеек))) про первое воскресение месяца
Саня, спасибо, да предложенный метод работает ))) коротко и красиво, без всяких извращений с кучей дополнительных ячеек))) про первое воскресение месяцакарандаш
1. для наглядности текущей даты добавь еще один условный формат если надо именно выделение, то либо циклом полностью по календарю, либо оттолкнуться опять же от 1-го воскресенья
2.
Цитата (карандаш)
имеешь в буфере "чистую" (от форматирования) дату
41397 - это 3-е мая сего года в чистом виде, так надо? дата - есть отформатированное число, так что думай, в каком виде нужно.
1. для наглядности текущей даты добавь еще один условный формат если надо именно выделение, то либо циклом полностью по календарю, либо оттолкнуться опять же от 1-го воскресенья
2.
Цитата (карандаш)
имеешь в буфере "чистую" (от форматирования) дату
41397 - это 3-е мая сего года в чистом виде, так надо? дата - есть отформатированное число, так что думай, в каком виде нужно.Саня
41397 - это 3-е мая сего года в чистом виде, так надо?
думаю, что да, ведь при вставке в ячейку, отформатированную как дата, получим дату но без размера и цвета шрифта, цвета заливки, границ и прочего формат будет местный
с дополнительным УФ попробовал это именно то, что нужно спасибо!
Саня,
Цитата (Саня)
41397 - это 3-е мая сего года в чистом виде, так надо?
думаю, что да, ведь при вставке в ячейку, отформатированную как дата, получим дату но без размера и цвета шрифта, цвета заливки, границ и прочего формат будет местный
с дополнительным УФ попробовал это именно то, что нужно спасибо!карандаш
Сообщение отредактировал карандаш - Пятница, 03.05.2013, 13:06
Sub Now2Clipboard() With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText CLng(Cells(2, 11)) .PutInClipboard End With End Sub
[/vba] 1. а без странного набора цифр в фигурных скобках можно обойтись? 2. набор цифр в фигурных скобках может быть любым? 3. GetObject порождает объект или использует готовый? 3.1. если порождает, то потом убивает или каждый клик множит кол-во объектов и они пожирают память?
спасибо работает именно так как надо
Саня, сделал так [vba]
Код
Sub Now2Clipboard() With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .SetText CLng(Cells(2, 11)) .PutInClipboard End With End Sub
[/vba] 1. а без странного набора цифр в фигурных скобках можно обойтись? 2. набор цифр в фигурных скобках может быть любым? 3. GetObject порождает объект или использует готовый? 3.1. если порождает, то потом убивает или каждый клик множит кол-во объектов и они пожирают память?
1. а без странного набора цифр в фигурных скобках можно обойтись? 2. набор цифр в фигурных скобках может быть любым?
нет, нет это guid класса DataObject, который частично может работать с буфером
Цитата (карандаш)
3. GetObject порождает объект или использует готовый? 3.1. если порождает, то потом убивает или каждый клик множит кол-во объектов и они пожирают память?
VBA очищает память при выходе из процедуры (как я знаю)
Цитата (карандаш)
1. а без странного набора цифр в фигурных скобках можно обойтись? 2. набор цифр в фигурных скобках может быть любым?
нет, нет это guid класса DataObject, который частично может работать с буфером
Цитата (карандаш)
3. GetObject порождает объект или использует готовый? 3.1. если порождает, то потом убивает или каждый клик множит кол-во объектов и они пожирают память?
VBA очищает память при выходе из процедуры (как я знаю)Саня
мммм... ну тогда автор так бы и сказал? мол, помогите выкинуть полученный результат в окно. а тут преобразование требуется. и чтобы полученное окно всплыло потом ещё. и не утонуло...
так что - не всё так просто. мне кажется.
мммм... ну тогда автор так бы и сказал? мол, помогите выкинуть полученный результат в окно. а тут преобразование требуется. и чтобы полученное окно всплыло потом ещё. и не утонуло...
имелось в виду следующее заводишь на листе кнопку и когда кликаешь по ней, то появляется окно с календарем, который получился в результате обсуждения
в нем кликаешь три раза (год, месяц, день) или меньше (если год уже совпадает с нужным) и оно исчезает, оставляя в буфере обмена результат, который вставляешь в нужное место.
а еще лучше кнопку не на листе, а на панели быстрого доступа (где можно располагать свои кнопки от самописных (и обычных) макросов)
да ладно вам
имелось в виду следующее заводишь на листе кнопку и когда кликаешь по ней, то появляется окно с календарем, который получился в результате обсуждения
в нем кликаешь три раза (год, месяц, день) или меньше (если год уже совпадает с нужным) и оно исчезает, оставляя в буфере обмена результат, который вставляешь в нужное место.
а еще лучше кнопку не на листе, а на панели быстрого доступа (где можно располагать свои кнопки от самописных (и обычных) макросов)карандаш
Сообщение отредактировал карандаш - Понедельник, 06.05.2013, 06:51
карандаш, да...можно и кнопку, см вложение. Естественно это самый черновой вариант, форма+календарь без всяких плюшек, но их легко подобавлять. кнопка сегодня например...или появление по 2 щелчку вместо кнопки и добавление даты...заказ пиццы на офис и отдых на море
P.s. а лучше кнопку забросить в ленту
карандаш, да...можно и кнопку, см вложение. Естественно это самый черновой вариант, форма+календарь без всяких плюшек, но их легко подобавлять. кнопка сегодня например...или появление по 2 щелчку вместо кнопки и добавление даты...заказ пиццы на офис и отдых на море