VBA excel中的行计数
我正在VBA中设计一个函数,形式为myFunction(x,y,z),其中z是一个表,x可以取列标题的值。作为函数的一部分,我需要找到z中的行数 我在这方面遇到了问题,因为我到处查看都建议使用VBA excel中的行计数,excel,vba,Excel,Vba,我正在VBA中设计一个函数,形式为myFunction(x,y,z),其中z是一个表,x可以取列标题的值。作为函数的一部分,我需要找到z中的行数 我在这方面遇到了问题,因为我到处查看都建议使用length=z.Rows.Count,但当我尝试输出此值时(如中,setmyFunction=length),它会产生一个值错误。但是,当我输出的myFunction=a不直接使用length(一旦开始工作,它最终将成为IF语句的一部分)时,函数工作正常。我的代码如下: Public Function m
length=z.Rows.Count
,但当我尝试输出此值时(如中,setmyFunction=length
),它会产生一个值错误。但是,当我输出的myFunction=a
不直接使用length
(一旦开始工作,它最终将成为IF语句的一部分)时,函数工作正常。我的代码如下:
Public Function myFunction(x As String, y As Double, z As Range) As Double
Dim upper_threshold As Double
Dim lower_threshold As Double
Dim a As Double
Dim rates As Variant
Dim u As Byte
Dim l As Byte
Dim r As Byte
Dim length As Byte
a = 0
u = 2
l = 1
rates = Application.WorksheetFunction.Index(z, 1, 0)
r = Application.WorksheetFunction.Match(x, rates, 0)
length = z.rows.Count
upper_threshold = z(u, 1)
Do While y > upper_threshold
u = u + 1
l = l + 1
upper_threshold = z(u, 1)
lower_threshold = z(l, 1)
If y < upper_threshold Then
a = a + z(l, r) * (y - lower_threshold)
Else
a = a + z(l, r) * (upper_threshold - lower_threshold)
End If
Loop
myFunction = a
End Function
这个函数本身可以很好地工作,但是当我尝试在另一个函数中使用它时,仍然会得到一个值错误。我试着将长度定义为我能想到的每一种类型,但似乎没有任何帮助
有人知道发生了什么事吗
编辑:我显然没有说得很清楚。没有两行表示长度的函数按我的预期工作。但是,我需要添加一些代码来增加它的功能,这涉及到计算表z中的行数。当我将这里显示的两行添加到函数中时,它会继续工作,因为它不会影响输出。但是,如果我随后将输出设置为显示长度,即将倒数第二行更改为myFunction=length
,则会给出一个值错误。就我所知,这给我留下了两个选择:要么程序中的其他东西影响了这两行(语法冲突或其他东西),要么我犯了一个错误,以为我可以像那样输出length
。您的问题在于:
rates = Application.WorksheetFunction.Index(z, 1, 0)
索引
只接受一行或一列,否则您会得到一个值
错误。您知道只保存0到255之间的值吗?如果z
中的行数大于255,则可能会出现溢出错误。如果您不知道这一点,那么尝试将length
声明为Long
。它最多只能达到10左右,所以字节就可以了。正如我所说,我还尝试将其声明为各种其他类型。双精度、变量、长…您是否尝试过传递z
byRef
?这有什么作用?(很抱歉,我对VBA不是很熟悉!)我不太明白的是,第二个函数本质上是第一个函数的一个非常精简的版本,它工作得很好。所以我不明白为什么它在上面的版本中不起作用。尽管该函数的其余部分独立工作,但其中一定有某种东西以某种方式“中断”了行的计数。很抱歉,您没有理解:)属性.rows.Count
属于范围对象
。它返回范围内使用的最后一行。length=z.Rows.Count
和myRows=myTable.Rows.Count
功能相同。你的问题在别的地方,我想道格已经给了你答案不,这不是问题所在,因为我知道它以前是有效的。问题肯定只在于行的计数。如您所见,长度并没有直接用于计算,正如我所示。一旦我让它工作起来,它将成为if循环中的一个条件。函数的输出是正确的,但当我尝试输出长度时,得到的值是错误的。+1用于挖掘深度。如果有人说,这个
不起作用,这可能意味着,其他的东西
实际上不起作用。在提问时,我建议将你的例子简化为最简单的例子来说明这个问题。这样人们就不会因为你的其他编码错误而分心了:)。这很公平,只是我不明白那一行怎么会错,因为当我删除与长度相关的两行时,它工作得非常好。编辑:我不确定我是否可以简化这个例子,因为如果我下面给出的函数有效,那么它一定是其他地方的函数?
rates = Application.WorksheetFunction.Index(z, 1, 0)