Это решение не VBA, учитывая следующее
- Значение сделки в столбце A
- Дата начала сделки в столбце B
- Дата окончания сделки в столбце C
- Срок действия в месяцах в D
- Число оборотов в день в столбце E = = (Стоимость сделки / 365) / (Срок действия / 12)
- Строка 1 содержит любой день месяца от G1 до CX1
и формула для ввода в G2 и копирования из G2 в CX ... равна
=IF(OR($B2>EOMONTH(G$1,0),$C2<G$1-DAY(G$1)+1),0,IF($C2>EOMONTH(G$1,0),EOMONTH(G$1,0),$C2)-IF($B2>G$1-DAY(G$1)+1,$B2,G$1-DAY(G$1)+1)+1)*$E2
А VBA решение (хотя и не рекомендуется) -
Sub doCalc()
Dim TCVRng As Range, SdtRng As Range, FdtRng As Range, TermLenRng As Range, MonRng As Range
Dim i As Long
'Modify ranges according to your requirement
Set MonRng = ActiveSheet.Range("G1:CX1")
For i = 2 To 8
Set TCVRng = ActiveSheet.Cells(i, 1)
Set SdtRng = ActiveSheet.Cells(i, 2)
Set FdtRng = ActiveSheet.Cells(i, 3)
Set TermLenRng = ActiveSheet.Cells(i, 4)
'Debug.Print TCVRng.Value, SdtRng.Value, FdtRng.Value
'Debug.Print "============================================="
'to bypass any intermidate summaty rowrow
' If TCVRng.Value > 0 And IsDate(SdtRng.Value) And IsDate(FdtRng.Value) Then
MonthCal TCVRng, SdtRng, FdtRng, TermLenRng, MonRng
' End If
Next
End Sub
Private Sub MonthCal(TCVRng As Range, SdtRng As Range, FdtRng As Range, TermLenRng As Range, MonRng As Range)
Dim TCV As Single, Sdt As Date, Fdt As Date, TermLen As Single, PerDay As Single
Dim Msdt As Date, Medt As Date, MnAmnt As Single, MnDay As Integer
Dim Cel As Range, Col As Long, ofst As Long
TCV = TCVRng.Value
Sdt = SdtRng.Value
Fdt = FdtRng.Value
TermLen = TermLenRng.Value
PerDay = (TCV / 365) / (TermLen / 12)
For Each Cel In MonRng
ofst = Cel.Column - TCVRng.Column
Msdt = Cel.Value
Msdt = DateAdd("d", -Day(Msdt) + 1, Msdt)
Medt = DateAdd("m", 1, Msdt)
Medt = DateAdd("d", -1, Medt)
MnDay = IIf(Sdt > Medt Or Fdt < Msdt, 0, IIf(Fdt < Medt, Fdt, Medt) - IIf(Sdt > Msdt, Sdt, Msdt) + 1)
MnAmnt = MnDay * PerDay
'Debug.Print TCV, Sdt, Fdt, Msdt, Medt, MnDay, MnAmnt
TCVRng.Offset(, ofst).Value = MnAmnt
Next Cel
End Sub