ExcelVBA里编一个函数,中间需要第一个变量上边的第5个的那个格的数,怎么取出来?

function里有两个自变量,我需要第一个自变量所在格上边第leftradius行的那个值怎么办?
Function judgecontinous(MaxRow As Range, LeftRadius As Double) As Double
如下图,希望在C15这个格内输入=judgecontinous(A15,D1)之后(比如D1的值是5)
要输出cell(15-D1,1)的值,也就是A10的值,就是8。。
(图中B列没啥用,忽略)

怎么实现啊。。。。
---
目前一步想实现的功能是
例如:在C15这个格内输入=judgecontinous(A14,D1)之后(比如此时D1的值是5)
要输出单元格(14-D1,1)的值,也就是输出A9的值,就是8。。
又例如在C17这个格内输入=judgecontinous(B20,D1)之后(比如此时D1的值是2)
要输出单元格(20-D1,2)的值,也就是输出B18的值,就是18。。
问过程怎么写
---
函数里的两个变量,第一个变量提供最后输出值的一个参考位置,第二个变量提供向上偏移的量。。
比如第一个例子中,最后输出的A9中的列号A是因为第一个变量的位置A14的列号是A;行号9,是用第一个变量A14中的14减去第二个变量D1中的值5得到的9
---
感谢mote75和lu_zhao_long两位网友的回答,我之所以想用vba是因为我本来要编辑的公式很复杂,我提出的问题是我整套语句的一个小单元,(如果拿全部出来问,本来我会的部分会因为思路不一样干扰到我读代码),所以单提炼出这个问题来问。。。不过网友给出了一个思路,我如何才能看到offset的VB代码呢?
另外读两位网友的话觉得是不是使用vba有什么不好啊?那不好?

第1个回答  2013-09-13
这个好像不需要自定义函数吧,EXCEL自带的函数就有这个功能。
C15中输入 =OFFSET(A14,-D1,0)
就可以了,第一个参数为参考单元格,第二个参数-D1表示以参考单元格为基准上移多少行,第三个参数0表示与参考单元格在同一列。追问

我怎么能看到你说的offset的VBA代码呢?

追答

系统的内置函数是看不到代码的。不过在VBA中,range对象有一个OFFSET属性与表格公式的OFFSET函数功能基本一样。

比如,要对C15进行上述赋值,可以用如下代码:

[c15].Value = [A14].Offset(-[D1].Value, 0).Value

第2个回答  2013-09-13
不明白你的自定义函数想实现什么功能!
我只想知道你的自定义函数中两个变量 MaxRow 和 LeftRadius 之间的运算关系。恕在下愚钝,我看不明白你说的比如 D1 一时等于 5,又一时等于 2!追问

目前一步想实现的功能是
例如:在C15这个格内输入=judgecontinous(A14,D1)之后(比如D1的值是5)
要输出单元格(14-D1,1)的值,也就是输出A9的值,就是8。。
又例如在C17这个格内输入=judgecontinous(B20,D1)之后(比如D1的值是2)
要输出单元格(20-2,2)的值,也就是输出B18的值,就是18。。
问过程怎么写

追答

我只想知道你的自定义函数中两个变量 MaxRow 和 LeftRadius 之间的运算关系。

追问

D1单元格里的数可以改的。。。。这两个例如是两次假设,之间没什么关系。。
函数里的两个变量,第一个变量提供最后输出值的一个参考位置,第二个变量提供向上偏移的量。。
比如第一个例子中,最后输出的A9中的列号A是因为第一个变量的位置A14的列号是A;行号9,是用第一个变量A14中的14减去第二个变量D1中的值5得到的9

追答

如果我帮你写函数,我只想知道你的自定义函数中两个变量 MaxRow 和 LeftRadius 之间的运算关系。
请你不要写具体的单元格,就以 MaxRow 和 LeftRadius 来讲解!

追问

我没看懂什么叫两个变量之间的运算关系。。
这样吧,你只看我需要实现的功能吧,就是我第一次追问中写的。。。。只要能实现功能剩下的都无所谓。。。。

追答

唉!很想帮你!但是……

不过,仔细看了你的要求,实际上你可以使用 Excel 自身的函数就可以实现了。以你上面的例子为例子:
C15 单元格内的公式:=OFFSET(A14,-D1,0,1,1)
C17 单元格内的公式:=OFFSET(B20,-D1,0,1,1)

如果这两个公式能够满足你的要求的话,则建议你还是不要使用自定义函数的好!

看样子楼主还是觉得有点遗憾的!
是这样的,使用 VBA 的原则一般是:如果工作量太大或重复性的工作太多,不能够通过 Excel 自身的公式来完成的话,就可以考虑了。
但是,从 Excel2007 开始,通常的工作簿中是不能保存 VBA 代码的。弄不好不能使用。

针对楼主这两天的解释,我为你写了一段自定义函数(修正了一些错误):
Public Function Judgecontinous(MaxRow As Range, LeftRadius As Range) As Variant
If (MaxRow.Row - LeftRadius.Value) < 0 Then
Judgecontinous = "#N/A : Out of worksheet's range!"
Exit Function
Else
Judgecontinous = MaxRow.Offset(0 - LeftRadius.Value, 0)
End If
End Function

本回答被网友采纳
相似回答