IBNR计算(Chain Ladder方法) 实用VBA -- 选择 左上三角 / 右下三角范围



  • IBNR计算的过程中,我们常常遇到的一个问题是左上的三角和右下的三角公式不同。
    这个时候如果我们想要粘贴公式,就需要手动选择一个三角形的范围并粘贴。

    手动选择三角形的范围这个工作,我们可以通过宏来实现。

    这个宏可以实现如下功能,以左上三角形为例,当选择一个正方形或者矩形区域时:
    efd01ea1-76da-4e07-9e08-53639326b3f9-image.png
    运行代码后可以得到一个如下的上三角区域。
    2c87bb8c-481e-428d-843b-db0b95612deb-image.png

    当然,如果选择的是一个矩形
    c5376443-5d11-4067-b937-dd57b3365a0f-image.png
    仍然可以运行代码得到一个不完整的上三角形
    1dbccfb3-6230-4181-9da7-068434b6b1f5-image.png



  • 代码的实现思路是横向把每个小矩形加入到三角形之中。
    fe398b26-9d3a-4c1e-b62b-f727c9231471-image.png

    Sub LTTriangle() 
    
    ’row和col用来定义选择的矩形的长和宽
    
    Dim row As Integer
    Dim col As Integer
    
    row = Selection.Rows.Count
    col = Selection.Columns.Count
    
    'rg是一个工具范围,用来做reference
    
    Dim rg As Range
    'targetRg用来储存我们最后要得到的三角形范围
    
    Dim targetRg As Range
    
    Dim i As Integer
    
    '初始化
    'Selection代表选择的范围;rg是选择的范围的左第一列
    
    Set rg = Selection.Resize(row, 1)
    Set targetRg = Selection.Resize(row, 1)
    
    '逐渐把每个小矩形加入到目标三角形
    
    For i = 1 To col - 1
    
       If row - i > 0 Then Set targetRg = Union(targetRg, rg.Offset(0, i).Resize(row - i, 1))
        
    Next i
    
    '选择已经定义好的范围
    
    targetRg.Select
    
    End Sub
    
    


  • 留下一个题目:如何选择右下的三角形呢?欢迎大家提供答案~ 示例文件如下供大家参考~
    Triangle example.zip



  • 可以利用GetSubtractRng这个计算差集的函数来得到右下角三角形的范围

    Function GetSubtractRng(r1 As Range, r2 As Range)
        Dim r As Range, r3 As Range
        For Each r In r1
            If Intersect(r, r2) Is Nothing Then
                If r3 Is Nothing Then
                    Set r3 = r
                Else
                    Set r3 = Union(r, r3)
                End If
            End If
        Next
        Set GetSubtractRng = r3
    End Function
    
    
    Sub RBTriangle()
    
    
    Dim row As Integer
    Dim col As Integer
    
    row = Selection.Rows.Count
    col = Selection.Columns.Count
    
    
    Dim rg As Range
    
    Dim targetRg As Range
    
    Dim i As Integer
    
    Set rg = Selection.Resize(row, 1)
    Set targetRg = Selection.Resize(row, 1)
    
    
    For i = 1 To col - 1
    
       If row - i > 0 Then Set targetRg = Union(targetRg, rg.Offset(0, i).Resize(row - i, 1))
        
    Next i
    
    Set targetRg = GetSubtractRng(Selection, targetRg)
    
    targetRg.Select
    
    End Sub
    

登录后回复