Excel·VBA加权求和函数

76 篇文章 25 订阅
Function WS(ByVal weight, ByVal data, Optional mode As Boolean = 1)
    '加权求和函数WS(权重数组, 数值数组, 模式),weight和data可以为数组、range
    'mode为0时将data中非数值部分转为0;为1时忽略data非数值部分,并重新分配权重数组
    Dim wrr(1 To 1000), drr(1 To 1000), arr, brr, i&, j&, m, n&, result
    For Each w In weight
        i = i + 1: wrr(i) = w
    Next
    For Each d In data
        j = j + 1: drr(j) = d
    Next
    If i <> j Then WS = "Error": Exit Function
    n = i: ReDim arr(1 To n): ReDim brr(1 To n): i = 0: j = 0
    If mode = False Then
        m = WorksheetFunction.sum(wrr)
        For i = 1 To n  '数据整理,将data中非数值部分转为0
            If WorksheetFunction.IsNumber(drr(i)) = True Then
                j = j + 1: arr(j) = 1 / m * wrr(i): brr(j) = drr(i)
            Else
                j = j + 1: arr(j) = 1 / m * wrr(i): brr(j) = 0
            End If
        Next
    Else
        For i = 1 To n  '数据整理,忽略data中非数值部分
            If WorksheetFunction.IsNumber(drr(i)) = True Then
                j = j + 1: arr(j) = wrr(i): brr(j) = drr(i): m = m + arr(j)
            End If
        Next
        For i = 1 To j  '重新分配权重
            arr(i) = 1 / m * arr(i)
        Next
    End If
    For i = 1 To j
        result = result + arr(i) * brr(i)
    Next
    WS = result
End Function

举例

mode参数为0时,即为F列计算结果,b1:e1权重和为100%,相当于忽略data非数值部分,其余部分权重*分值,最后求和

mode参数为1时,即为G列计算结果,忽略data非数值部分,其余部分权重重新按100%分配后再*分值,最后求和

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔_51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值