Работа с датой

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Здраствуйте !
Подскажите пожалуста, как узнать что значение ячейки в столбце с датой входит в диапазон дат 1 квартала, 2,3 или 4 настоящего года (год смотреть системный). Это необходимо чтобы далее отбирать нужные строки для последующей работы(раз в квартал).
Заранее благодарен!
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте 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, для решения этой задачи, возможно существуют, но я их не знаю.
Евгений.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Teslenko_EA писал(а):Простые встроенные функции Excel, для решения этой задачи, возможно существуют
Ну это просто. Правда вы, vint, не указали что выводить для НЕ текущего года ..
В предположении что в A1 дата
=ЕСЛИ(ГОД(A1)=ГОД(СЕГОДНЯ());ОКРУГЛВВЕРХ(МЕСЯЦ(A1)/3;0);"?")
Андрей Энтелис,
aentelis.livejournal.com
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Да да именно на 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
а вот как критерий отбора организовать чтото не доходит.
Буду копаться дальше.
Если есть мысль, подскажите пожалуста толкните в нужное русло.
Зараннее благодарю.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Vint, для публикации текста программ на этом форуме принято использовать теги [noparse][/noparse]
См: http://forum.developing.ru/misc.php?do=bbcode
Андрей Энтелис,
aentelis.livejournal.com
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Aent писал(а):Vint, для публикации текста программ на этом форуме принято использовать теги [noparse][/noparse]
См: http://forum.developing.ru/misc.php?do=bbcode
Извиняюсь. Обещаю, больше не буду. :(
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вот выдумал!

Код: Выделить всё

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
Только вот проблема осталась ему пофиг какой год, а мне надо сегодняшний.
Подскажите пожалуста куда и что надо влепить чтобы он реагировал только на системный год.
Спасибо!
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Объясните мне дураку почему функция

Код: Выделить всё

Dim d3 As Date
    d3 = Year(Date)
MsgBox d3
выдаёт мне 01.07.1905, а не 2009 на сколько я понимаю назначение этой функции.
У меня уже нервы сдают.
ХЕЕЕЕЕЕЛП.
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Тип переменной надо сделать целый (Integer, либо Long), а не Date, так как номер года сам по себе датой и временем не является.
На заказ: VBA, Excel mc-black@yandex.ru
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте 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 ячейка данные которой проверяются на принадлежность даты (если она содержит дату) кварталу текущего года.

Евгений.
vint
Сообщения: 37
Зарегистрирован: 19 мар 2009, 16:53

Всё разобрался.
Всем спасибо за помощь !!!
Вопрос закрыт.
Ответить