VBA excel中的行计数

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

我正在VBA中设计一个函数,形式为myFunction(x,y,z),其中z是一个表,x可以取列标题的值。作为函数的一部分,我需要找到z中的行数

我在这方面遇到了问题,因为我到处查看都建议使用
length=z.Rows.Count
,但当我尝试输出此值时(如中,set
myFunction=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)