excel - 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
解决方案
用户定义的函数不应该从范围中读取,但必须具有作为函数参数所需的所有信息。您没有包含函数的调用方式(单元格定义),因此我无法演示如何更改函数以使其不使用该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 以上溢出,乘法很容易得到。
推荐阅读
- openmdao - Using IndepVarComp instead of metadata
- powershell - O365 电源外壳 | 将一长串列表分成两组,每组 100 个
- django - 高级 django 查询
- azure - Microsoft Graph Api - Azure Active Directory B2B 协作邀请兑换 - 失去对文档的访问权限
- c - C. 正确处理指向分配结构并返回指向它的指针的函数的双指针——在不同的函数中读取、显示、释放
- sql - 无法插入到 postgres 列
- php - 在项目页面上显示项目规格的最佳方式,以便 Google 更好地索引
- dialogflow-es - 由于 Ssml 响应的语音响应为空,无法将 Dialogflow 响应解析为 AppResponse
- excel - VBA-如果列具有某些文本并将其粘贴到某个单元格区域中,则将数据传输到另一个工作表
- javascript - React——为什么循环状态更新先于递归状态更新?