首页 > 解决方案 > VBA EXCEL 自定义函数运行良好,但是当我召唤一个用户窗体时,计算的单元格值变为零

问题描述

我在 VBA 中制作了一个自定义函数,该函数没有重大问题。

此函数将一系列单元格相乘并根据特定条件返回值。

一切正常,但是当我运行其他函数或子例程时,值变为零。

任何人都可以帮忙吗?

Option Explicit
Function multiselic(a As Integer, b As Integer)

Dim i As Integer
Dim temp1 As Double

a = a + 1

temp1 = Range("G" & a).Value

a = a + 1

For i = a To b
temp1 = temp1 * Range("G" & i).Value
Next i

multiselic = temp1


End Function 

在此处输入图像描述

在此处输入图像描述

标签: excelvba

解决方案


用户定义的函数不应该从范围中读取,但必须具有作为函数参数所需的所有信息。您没有包含函数的调用方式(单元格定义),因此我无法演示如何更改函数以使其不使用该Range()函数。

此外,裸Range()函数使用ActiveSheet来引用值,因此该函数仅在源工作表处于活动状态时才有效。尝试使用Worksheet.Range()引用类型,例如Worksheets("Sheet1").Range("C7").Value从特定工作表中的单元格中提取特定值。

计算单元格的乘积时,您的代码可以简化。无需先剥离第一个值。只需从 1 开始。下面是一个一般方法的例子,如果取n一个范围内的值的乘积。

Public Function ProductOfValues(ByVal r_start as Range, ByVal n as Long) as Double
    Application.Volatile ' Per comments
    Dim i As Long
    Dim temp1 As Double
    If n=0 Then
        ProductOfValues = 1#
        Exit Function
    End If
    temp1 = 1#
    For i = 1 To n
        temp1 = temp1 * r_start.Cells(i, 1).Value
    Next i
    ProductOfValues = temp1
End Function

该功能将用作=ProductOfValues(Sheet1!G2, 10)示例。

PS。将所有Integer类型替换Long为前者是 16 位整数,后者是 32 位整数(这是您在此处的意图)。一个 16 位整数将在 16383 以上溢出,乘法很容易得到。


推荐阅读