【发布时间】:2021-09-24 10:57:40
【问题描述】:
我正在编写几个UDF,它们都以Range 作为输入。因为我需要检查用户输入是否有效,所以我构建了另一个Function 来检查IsNumeric 或IsEmpty 等内容。每次检查完成时,如果检测到一些问题,就会有一个MsgBox。我想保留这个MsgBox,但是因为有不同的UDF 将用于同一个Range 我想问我是否可以减少弹出窗口的数量?如果有办法“保存”另一个Function 已经完成对这个Range 的有效性检查的事实?无法提前知道函数将被调用多少次。
我的代码太长,还有其他问题,但这是基本思路:
Public Const maxn As Long = 10
Function Check(myRange As Range, p As Long, n As Long) As Boolean
Dim i As Long, k As Long, x As Long
Dim emptyCell As String, noNum As String, emptyRow As String
Dim empty(1 To maxn) As Long
For i = 1 To p
For k = 1 To n
If IsEmpty(myRange.Cells(i, k).Value) Then
x = x + 1
empty(k) = 1
If x = n Then
emptyRow = emptyRow & vbLf & CStr(myRange.Row + i - 1)
End If
ElseIf Not IsNumeric(myRange.Cells(i, k).Value) Then
noNum = noNum & vbLf & ColNo2ColLet(myRange.Column + k - 1) & CStr(myRange.Row + i - 1)
End If
If k = n And x > 0 And x <> n Then
For x = 1 To n
If empty(x) = 1 Then emptyCell = emptyCell & vbLf & ColNo2ColLet(myRange.Column + x - 1) & CStr(myRange.Row + i - 1)
Next x
End If
Next k
Next i
If emptyRow <> "" Then
emptyRow = "Following rows are empty and will not be considered:" & emptyRow
MsgBox (emptyRow)
End If
If emptyCell <> "" Then
emptyCell = "Following cells are empty and will not be considered:" & emptyCell
MsgBox (emptyCell)
End If
If noNum <> "" Then
noNum = "Following cells contain nonnumeric values:" & noNum
MsgBox (noNum)
Check = CVErr(xlErrValue)
Exit Function
End If
Check = True
End Function
Function ColNo2ColLet(x as Long) as String
'returns the Letters corresponding to the Column number provided by myRange.Column
End Function
Function sr(myRange As Range) as Double
' p, n get defined and checked
Call Check(myRange, p, n)
' other calculations
End Function
Function Q(myRange As Range) as Double
' p, n get defined and checked
Call Check(myRange, p, n)
' other calculations
End Function
【问题讨论】:
-
您是否将
Check称为工作表中的公式?然后我强烈建议不要使用MsgBox,每次重新计算工作表时都会出现所有这些弹出窗口,这一定会让人感到困惑。 UDF 应该只返回一个值或一个值数组(如果您想返回多个值)。 -
不,我只从其他公式中调用
Check.. 所以我只在Q和sr中调用它。 -
那么
Q和sr是否用作表格中的公式?这仍然会触发重新计算的所有框。那会变得非常混乱。 -
是的。我知道,但我需要它,因为我需要知道一行何时为空,并且我想避免遍历整个表格试图找出 2..5 而不是 2.5 的错字所在的位置。
-
我认为您在此处提出问题 X,而您的实际问题是 Y。请参阅 What is the X/Y-Problem。如果您在这里提出正确的问题,请重新考虑。