EXCEL VBA 自定义函数 50

Functionpbs(rngAsRange)'输入变量是一个单元格Application.Volatilea=Cells(rng.Row,1).Value'查找输入单元... Function pbs(rng As Range) '输入变量是一个单元格
Application.Volatile
a = Cells(rng.Row, 1).Value '查找输入单元格同行的第一个单元格的值为a
b = Cells(1, rng.Column).Value * 1 ‘查找输入单元格同列的第一个单元格的值为b
c = Application.Match(a, Sheets("BOM").Columns(1), 0)’在另一个工作表上查找与a匹配的行数c
d = Application.Match(b, Sheets("PBS-OUT").Rows(1), 0)’在另一个工作表上查找与a匹配的列数d
With Sheets("BOM")
rng1 = .Range(.Cells(c, 4), .Cells(c, .Cells(c, .Columns.Count).End(xlToLeft).Column))
End With'取另一个工作表匹配列外的整行(非空白)
With Sheets("PBS-OUT")
rng2 = .Range(.Cells(2, d), .Cells(.Cells(.Rows.Count, d).End(xlUp).Row, d))
End With‘取另一个工作表匹配行外的整列(非空白)
pbs = Application.MMult(rng1, rng2)’计算乘积求和

我的问题是rng1 和 rng2 是根据 输入变量rng变动的,实际其他表上的符合rng1的数据变更时,函数无法自动计算显示错误,应如何修改
展开
 我来答
万年金刚钻
2014-07-17 · TA获得超过1.6万个赞
知道大有可为答主
回答量:1.1万
采纳率:0%
帮助的人:3526万
展开全部
你的自定义函数易失性函数,不会自动更新,你只要在使用函数的公式后面加上强制更新的东西就行了
比如你的公式的结果是文本型的,那么
=pbs()&T(NOW())
比如你的公式的结果是数值型的,那么
=pbs()+N(T(NOW()))
就能强制自动更新
至于rng1和rng2,楼主试试用range的方式,也就是set rng1=range(xxxxxx)
鱼乐0117
2014-07-17 · 超过56用户采纳过TA的回答
知道答主
回答量:102
采纳率:0%
帮助的人:107万
展开全部
=SUMPRODUCT(B1:B7,C1:C7) 这个可以满足吧

平均算法

Public Function AVERAGEx(x As Range, y As Range)
Dim m
For i = 0 To x.Count - 1
If Cells(y.Row + i, y.Column).Value <> 0 Then
m = m + Cells(x.Row + i, x.Column).Value
End If
Next
AVERAGEx = m
End Function
这是自定义函数,试试吧
求采纳为满意回答。
追问
横向数组和纵向数组的乘积求和,SUMPRODUCT 好像不行

额。。没明白这串代码请加上标注
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ssfx1982
2014-07-17 · TA获得超过2241个赞
知道小有建树答主
回答量:945
采纳率:58%
帮助的人:202万
展开全部
ActiveSheet.Calculate 加个重算活动工作表看看,你这个可能还是rng变量的作用范围设立的有问题,或者加个T(now())
=value(pbs(rng)&T(now()),只要工作表有改动 公式就重算一次
追问
试过了

如果是rng1 和rng2 是输入变量就没有问题(如MMULT本身)

就是因为rng1 和rng2是由rng 决定的,所以会出现错误。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式