помесячное распределение сумм

Программирование на Visual Basic for Applications
olegspb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 12.01.2006 (Чт) 15:04

помесячное распределение сумм

Сообщение olegspb » 20.09.2007 (Чт) 12:44

Есть следующая таблица:

Начало | Конец | Сумма | 01.01.07| 01.02.07| 01.03.07|
обеспеч. | обеспеч. |

01.01.07 | 01.03.07 | 120р.|

01.02.07 | 01.03.07 | 400р.|


Необходимо, чтобы макрос распределил Сумму по месяцам в зависимости от сроков обеспечения. Должно получиться так:

Начало | Конец | Сумма | 01.01.07| 01.02.07| 01.03.07|
обеспеч. | обеспеч. |

01.01.07 | 01.03.07 | 120р. | 40р. | 40р.| 40р.|

01.02.07 | 01.03.07 | 400р.| ____ | 200р. | 200р.|


Пишу:
Sub summonth()

For counter = 2 To 12
FirstDate = Cells(counter, 1).Value 'первый срок обеспечения
LastDate = Cells(counter, 2).Value 'последний срок обеспечения
k = Round((LastDate - FirstDate) / 30) 'количество месяцев обеспечения
With Range("d1:o1")
Set c = .find(Cells(counter, 1), LookIn:=xlValues, lookat:=xlWhole)
'сравниваю сроки начала обеспечения с месяцами в первой строке
If Not c Is Nothing Then
firstaddress = c.Address
Do
c.Offset(counter - 1, 0) = Cells(counter, 1).Offset(0, 2) / k
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstaddress

End If
End With
Next counter
End Sub

Этот макрос ставит сумму только в первый месяц обеспечения, а надо, чтобы он распределял сумму по всем месяцам обеспечения. И так я пытался и эдак. Не выходит.
Буду благодарен за любые подсказки. :roll:

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 20.09.2007 (Чт) 13:51

Код: Выделить всё
Public Sub Test()
    Dim counter As Integer
    Dim period_in_month As Integer
    Dim date_b As Date
    Dim date_e As Date
    Dim start_plat As Integer
    Dim summa As Double
    Dim i As Integer
   
    For counter = 2 To 5
        'выбираем данные
        date_b = CDate(Cells(counter, 1))
        date_e = CDate(Cells(counter, 2))
        summa = Cells(counter, 3)
       
        'определяем кол-во месяцев в периоде обеспечения
        period_in_month = DateDiff("m", date_b, date_e)
       
        'определяем первый месяц обеспечения
        start_plat = Month(date_b)
       
        'распределяем суммы
        For i = 0 To period_in_month
            Cells(counter, 3 + start_plat + i).Value = summa / (period_in_month + 1)
        Next i
       
    Next counter
End Sub

пойдет?
I Have Nine Lives You Have One Only
THINK!

olegspb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 12.01.2006 (Чт) 15:04

Сообщение olegspb » 20.09.2007 (Чт) 14:38

Как же все просто, когда знаешь. :lol:
Спасибо HandKot, снова помог.

Маленькое дополнение к задачке, если не затруднит.

Если сейчас сентябрь, а срок обеспечения попадает на август, т.е. в прошлый период. Возмжно ли суммировать сумму прошлых периодов с текущим месяцем?
Например:
макрос распределил сумму 300 р. по месяцам:
август 100 р
сентябрь 100 р
октябрь 100 р

А должно быть:
сентябрь 200 р.
октябрь 100 р.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 20.09.2007 (Чт) 15:53

Добавьте условие в For
Код: Выделить всё
summa = summa + summa / (period_in_month + 1)
If Not (Проверка на Прошлый_период) Then
  Cells(counter, 3 + start_plat + i).Value = summa
  summa = 0
endif
I Have Nine Lives You Have One Only
THINK!

olegspb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 12.01.2006 (Чт) 15:04

Сообщение olegspb » 20.09.2007 (Чт) 17:24

Что-то пока не получается.
Возникла еще одна проблема:
start_plat = Month(date_b) подходит если работать в пределах одного года, но если date_b например 01.07.2008 или 01.07.2009 года, макрос все равно будет считать start_plat = 7, а это соответственно откатывает распределение сумм в 2007 год вместо 2008 или 2009. Как с этим бороться?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 21.09.2007 (Пт) 8:04

включить мозг?
I Have Nine Lives You Have One Only
THINK!

olegspb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 12.01.2006 (Чт) 15:04

Сообщение olegspb » 21.09.2007 (Пт) 8:12

И на этом спасибо.

olegspb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 12.01.2006 (Чт) 15:04

Сообщение olegspb » 21.09.2007 (Пт) 13:46

В результате медитации в течение половины дня получилось следующее:
YearFirstDate = Year(FirstDate)
If YearFirstDate Like 2007 Then
start_plat = start_plat
ElseIf YearFirstDate Like 2008 Then
start_plat = (start_plat + 12)
ElseIf YearFirstDate Like 2009 Then
start_plat = (start_plat + 24)
End If

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 24.09.2007 (Пн) 8:31

ИМХО лучше так
Код: Выделить всё
start_plat = Month(date_b) + DateDiff("yyyy", Strat_date, date_b) * 12


Код: Выделить всё
Public Sub Test(Start_Date)
    Dim counter As Integer
    Dim period_in_month As Integer
    Dim date_b As Date
    Dim date_e As Date
    Dim start_plat As Integer
    Dim summa As Double
    Dim i As Integer
       
    For counter = 2 To 5
        'выбираем данные
        date_b = CDate(Cells(counter, 1))
        date_e = CDate(Cells(counter, 2))
        summa = Cells(counter, 3)
       
        'определяем кол-во месяцев в периоде обеспечения
        period_in_month = DateDiff("m", date_b, date_e)
       
        'определяем первый месяц обеспечения
        start_plat = Month(date_b) + DateDiff("yyyy", Strat_date, date_b) * 12
       
        'распределяем суммы
        For i = 0 To period_in_month
            summa = summa + summa / (period_in_month + 1)
            If Start_Date < DateAdd("m", i, date_b) Then
                Cells(counter, 3 + start_plat + i).Value = summa
                'обнуляем сумму
                summa = 0
            End If
        Next i
       
    Next counter
End Sub
I Have Nine Lives You Have One Only
THINK!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 58

    TopList