函数不传递值

时间:2015-02-18 04:42:45

标签: vba

请帮我解决这个问题。我刚刚开始使用VBA,搜索论坛后无法找到解决方案。我的电子表格中有1000个单位数字。每行20行50个数字。我的程序假设找到最大的产品。出于某种原因,我的最终答案是0.我已经做了一些调试,程序按预期完成所有循环和迭代。我怀疑我的函数没有将值传递回我的主

    Public Sub problem8()

Dim product, i, j, maxproduct As Long
maxproduct = product = 1

For i = 1 To 20
    For j = 1 To 50
        product = calcproduct(i, j)

        If product > maxproduct Then maxproduct = product
    Next j
Next i
Range("AY1").Value = maxproduct

End Sub

Function calcproduct(ByVal a As Long, ByVal b As Long) As Long

Dim i, j, count As Long
counter = calcproduct = 1
For i = a To 20
    For j = b To 50
        calcproduct = Cells(i, j).Value * calcproduct
        counter = counter + 1
        If counter = 13 Then Exit Function
    Next j
Next i

End Function

2 个答案:

答案 0 :(得分:1)

变化:

Dim product, i, j, maxproduct As Long

为:

Dim product as long, i as long, j as long, maxproduct As Long

Dim i, j, count As Long

为:

Dim i as long, j as long, count As Long

我曾经认为最后将它应用到行上的所有内容但它没有,我遇到了类似的问题。

我可能会补充一下,你这样做的方式(将i和j分配给新变量a和b然后在第二个例程中使用i和j)非常混乱,我强烈建议不要这样做。

答案 1 :(得分:0)

首先,这是表达你想要完成的事情的错误方式。

maxproduct = product = 1

这表示“maxproduct等于False” product 刚刚被声明,所以它的所有意图和目的都是零而不等于 1 。你想说,

maxproduct = 1
product = 1

如果你真的需要将最后两个放在一行,那么使用这样的冒号,

maxproduct = 1: product = 1

对于函数中的类似语法也是如此。

现在了解VBA将 True 视为 -1 并将 False 视为 0 (< EM>零)。由于您实际上是将 maxproduct product 初始化为零,因此您可以将所需的任何内容乘以它,并且最终仍然会为零。同样,对于在函数中处理此类似变量赋值的方式也是如此。

这是我对你的项目的看法。

Option Explicit

Public Const maxA As Long = 20
Public Const maxB As Long = 50
Public Const cntC As Long = 13

Public Sub problem8()
    Dim product As Long, i As Long, j As Long, maxproduct As Long
    maxproduct = 1: product = 1

    For i = 1 To maxA
        For j = 1 To maxB
            product = calcproduct(i, j)
            If product > maxproduct Then maxproduct = product
        Next j
    Next i
    Range("AY1").Value = maxproduct
End Sub

Function calcproduct(ByVal a As Long, ByVal b As Long) As Long
    Dim i As Long, j As Long, counter As Long
    counter = 1: calcproduct = 1
    For i = a To maxA
        For j = b To maxB
            calcproduct = Cells(i, j).Value * calcproduct
            counter = counter + 1
            If counter = cntC Then Exit Function
        Next j
    Next i
End Function

我将限制移动到公共常量,这使得更容易修改不同大小的区域。在你的函数中,你声明了一个 count ,然后开始使用一个名为 counter 的var,所以我改变了它以适应。正如另一篇文章中所提到的,变量声明需要具体,或者你最终得到一堆变体和一些长篇。