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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2012, 15:49   #1
moose123
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 15
По умолчанию простинький макросс

Добрый день всем!

Помогите пожалуйста с написанием макросса

Задачу прикрепляю в виде рисунка

Нужно чтобы сверяло каждую дату из столбца D c каждой датой из столбца С и если больше чем в годе дней, тогда в столбец Е умножать на 0. тоесть нужно чтобы последняя дата была не больше чем 1 год.

вот что я написал но выводит ошибку, пока не разобрался в чем ошибка, так как новичек в этом деле

вот код:

Код:
Sub myMacro()
Dim i As Integer
Dim k As Integer
i = 1
k = 1
Do While Cells(i, 4) <> ""
    Do While Cells(k, 3) <> ""
        If Cells(i, 4) - Cells(k, 3) >= 365 Then Cells(k, 5) = 0
        k = k + 1
    Loop
    i = i + 1
Loop

End Sub
moose123 вне форума Ответить с цитированием
Старый 08.06.2012, 18:55   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Для вычитания дат используйте функцию DateDiff, которая подробно описана в справке по VBA Excel.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.06.2012, 19:22   #3
moose123
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 15
По умолчанию

Да даты оно отнимает, проблема в том что я не знаю как правильно сделать цикл, сверяло каждую дату из столбца D c каждой датой из столбца С, а вторая - если больше чем в годе дней, тогда в столбец Е умножать на 0.
moose123 вне форума Ответить с цитированием
Старый 08.06.2012, 20:06   #4
moose123
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 15
По умолчанию

Ничего не выходить ( , люди помогите )
moose123 вне форума Ответить с цитированием
Старый 08.06.2012, 22:01   #5
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Зачем Вам дополнительный цикл по одной и той же информации? Думаю, так будет проще:
Код:
Sub myMacro()
Dim li As long
For li = 1 to cells(rows.count,4).end(xlup).row
        If (Cells(li, 4) - Cells(li, 3)) >= 365 Then Cells(li, 5) = 0
next li
End Sub
Про cells(rows.count,4).end(xlup).row см.здесь.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 09.06.2012, 08:33   #6
moose123
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 15
По умолчанию

Спасибо за ответ, но почемуто когда я нажимаю запуск, ничего не происходит (

может действительно оно не отнимает даты (

Последний раз редактировалось moose123; 09.06.2012 в 08:49.
moose123 вне форума Ответить с цитированием
Старый 09.06.2012, 09:05   #7
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от moose123 Посмотреть сообщение
почемуто когда я нажимаю запуск, ничего не происходит (
Если судить по скрину, то и не должно. У Вас там нет разности дат в 365 дней и более.
Если же такие даты есть - то неплохо бы взглянуть на файл и на то, как и где Вы расположили код.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 09.06.2012, 09:32   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
Function YearDiff(ByVal Date1 As Date, ByVal Date2 As Date) As Integer
  YearDiff = Year(Date2) - Year(Date1) + IIf(Month(Date2) + IIf(Day(Date2) < Day(Date1), -1, 0) < Month(Date1), -1, 0)
End Function
примерно такая функция будет работать правильнее (учитывая и високосные года в том числе). Выводит только количество полных календарных лет.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.06.2012, 10:15   #9
moose123
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от The_Prist Посмотреть сообщение
Если судить по скрину, то и не должно. У Вас там нет разности дат в 365 дней и более.
Если же такие даты есть - то неплохо бы взглянуть на файл и на то, как и где Вы расположили код.
Почему не должно?
Я не сравниваю D2-C2, ... D5-C5, мне надо сравнить D2-C2, D3-C2 D3-C3, D4-D2 D4-D3 D4-D4, и т.д.

И что вы имеете в виду "как и где Вы расположили код."
Табличка у меня точно такая как на скрине, я нажал Алт-Ф11 на текущем листе создал макрос, сохранил, и нажал запустить.

Последний раз редактировалось moose123; 09.06.2012 в 10:19.
moose123 вне форума Ответить с цитированием
Старый 09.06.2012, 10:21   #10
moose123
Пользователь
 
Регистрация: 08.06.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Код:
Function YearDiff(ByVal Date1 As Date, ByVal Date2 As Date) As Integer
  YearDiff = Year(Date2) - Year(Date1) + IIf(Month(Date2) + IIf(Day(Date2) < Day(Date1), -1, 0) < Month(Date1), -1, 0)
End Function
примерно такая функция будет работать правильнее (учитывая и високосные года в том числе). Выводит только количество полных календарных лет.
Спасибо, да мне нужно также учитывать и высокосный год, но в том что вы написали я ни грамма не понимаю, мне нужно вставить данную функцию вместо числа "365" ?, извените за глупый вопрос.
moose123 вне форума Ответить с цитированием
Ответ


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