Страница 1 из 1
Работа с датой
Добавлено: 20 апр 2009, 16:35
vint
Здраствуйте !
Подскажите пожалуста, как узнать что значение ячейки в столбце с датой входит в диапазон дат 1 квартала, 2,3 или 4 настоящего года (год смотреть системный). Это необходимо чтобы далее отбирать нужные строки для последующей работы(раз в квартал).
Заранее благодарен!
Re: Работа с датой
Добавлено: 20 апр 2009, 19:33
Teslenko_EA
Здравствуйте
vint.
С применением VBA, можно создать собственную функцию для решения этой задачи
Код: Выделить всё
Public Function quart(dDate) As String
Dim i%
If Not IsDate(dDate) Then Exit Function
i = Month(CDate(dDate))
Select Case i
Case 1 To 3: quart = "первый"
Case 4 To 6: quart = "второй"
Case 7 To 9: quart = "третий"
Case 10 To 12: quart = "четвертый"
End Select
End Function
Простые встроенные функции Excel, для решения этой задачи, возможно существуют, но я их не знаю.
Евгений.
Re: Работа с датой
Добавлено: 21 апр 2009, 00:39
Aent
Teslenko_EA писал(а):Простые встроенные функции Excel, для решения этой задачи, возможно существуют
Ну это просто. Правда вы,
vint, не указали что выводить для НЕ текущего года ..
В предположении что в A1 дата
=ЕСЛИ(ГОД(A1)=ГОД(СЕГОДНЯ());ОКРУГЛВВЕРХ(МЕСЯЦ(A1)/3;0);"?")
Re: Работа с датой
Добавлено: 21 апр 2009, 08:52
vint
Да да именно на VBA.
Уважаемый Teslenko_EA , спасибо за пример, щас попробую с ним разобраться.
Кстати, а как насчет применить в цикле перебора строк функцию DatePart с "q", только как чтобы она смотрела именно текущий год.
Извините меня может это глупые вопросы, просто программированием занялся недавно и с датами ещё не работал - не хочется наделать косяков.
По поводу вопроса Aent
"Правда вы, vint, не указали что выводить для НЕ текущего года "
да, виноват, то что не попадает в указанный квартал текущего года - ни как не реагировать.
Вообщем у меня мысль такая, выдать юзеру форму с четырьмя кнопками,
"Сформировать заявку на 1 квартал", на 2-ой, 3-ий и 4-ый.,и при нажатии на кнопку например 2-ой квартал, запустить цикл перебора строк пока непусто в колонке А (там указана фамилия, она присутствует всегда, а дата может отсутствовать вообще), смотреть в колонку F с датой и если она не пустая и входит в диапазон дат 2-го квартала текущего года то копировать строку в необходимый лист в противном случае переход на следующую строку (пока есть фамилия).
Как сделать цикл я догадываюсь, что-то типа этого
'Dim d As Date 'переменная для диапазон дат 2 -го квартала текущ. года
' d = "диапазон" 'незнаю что здесь писать
'iRow = 1 'начальная строка поиска
'While (Application.ActiveWorkbook.Worksheets("ФИО").Range("A" & iRow).Value <> "") 'цикл пока не пусто
'Dim s As Variant
's = Application.ActiveWorkbook.Worksheets("ФИО").Range("F" & iRow).Value 'переменная где ищем
'If s Like d Then 'если попало в диапазон тогда копируем
'MsgBox "Можно копировать "
' 'здесь процедура копирования
'End If
'iRow = iRow + 1 'Если нет, идём на след. строку ( цикл )
'Wend 'Конец цикла While
а вот как критерий отбора организовать чтото не доходит.
Буду копаться дальше.
Если есть мысль, подскажите пожалуста толкните в нужное русло.
Зараннее благодарю.
Re: Работа с датой
Добавлено: 21 апр 2009, 13:16
Aent
Vint, для публикации текста программ на этом форуме принято использовать теги [noparse]
[/noparse]
См:
http://forum.developing.ru/misc.php?do=bbcode
Re: Работа с датой
Добавлено: 21 апр 2009, 13:40
vint
Извиняюсь. Обещаю, больше не буду.

--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вот выдумал!
Код: Выделить всё
Dim k As Variant 'переменная номера квартала
k = 2 'например для 2-го квартала можно будет брать это из формы
iRow = 1 'начальная строка поиска и цикл пока не пусто ФИО
While (Application.ActiveWorkbook.Worksheets("ФИО").Range("A" & iRow).Value <> "")
Dim s As Variant 'переменная где ищем
s = Application.ActiveWorkbook.Worksheets("ФИО").Range("F" & iRow).Value
Dim TheDate As Date 'переменная для DatePart
TheDate = Application.ActiveWorkbook.Worksheets("ФИО").Range("F" & iRow).Value
Dim d As Variant 'переменная для выяснения принадлежности к кварталу, даёт 1,2,3 или 4
d = DatePart("q", TheDate)
If (s <> "") And (d = k) Then 'если попало в диапазон тогда копируем
MsgBox "Можно копировать "
'здесь процедура копирования
End If
iRow = iRow + 1 'Если нет, идём на след. строку ( цикл )
Wend 'Конец цикла While
Только вот проблема осталась ему пофиг какой год, а мне надо сегодняшний.
Подскажите пожалуста куда и что надо влепить чтобы он реагировал только на системный год.
Спасибо!
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Объясните мне дураку почему функция
выдаёт мне 01.07.1905, а не 2009 на сколько я понимаю назначение этой функции.
У меня уже нервы сдают.
ХЕЕЕЕЕЕЛП.
Re: Работа с датой
Добавлено: 21 апр 2009, 15:53
mc-black
Тип переменной надо сделать целый (Integer, либо Long), а не Date, так как номер года сам по себе датой и временем не является.
Re: Работа с датой
Добавлено: 21 апр 2009, 18:55
Teslenko_EA
Здравствуйте
vint.
"цикл перебора" не используется, а функцию DatePart применить конечно же можно.
Код дополните одной строкой:
Код: Выделить всё
Public Function quart(dDate) As String
If Not IsDate(dDate) Then Exit Function
If Not Year(CDate(dDate)) = Year(Date) Then Exit Function ' !!!
Select Case DatePart("q", dDate)
Case 1: quart = 1 '"первый"
Case 2: quart = "II" '"второй"
Case 3: quart = "третий"
Case 4: quart = "IV" ' "четвертый"
End Select
End Function
После размещения исправленного кода в модуле документа, использование функции в листе документа будет выглядеть так:
=quart(D10)
D10 ячейка данные которой проверяются на принадлежность даты (если она содержит дату) кварталу
текущего года.
Евгений.
Re: Работа с датой
Добавлено: 21 апр 2009, 22:45
vint
Всё разобрался.
Всем спасибо за помощь !!!
Вопрос закрыт.