Vba #用户定义函数中的值错误

Vba #用户定义函数中的值错误,vba,function,excel,user-defined,Vba,Function,Excel,User Defined,我编写了一个VBA函数,它可以检查一些内容并返回一个代码 这会触发条件格式。一切都很好,除了 公式经常触发一个#值错误。它可以为所有人做到这一点 包含公式的单元格(几千个)。出现错误 每当我打开另一个工作簿时。有时候我不知道的时候就会发生 打开另一个工作簿 功能如下: Function jjcheck(STDTRow As Integer, cuCOL As Integer, cuMax As Integer, trmEnd As Integer, trmEMax As Integer, w

我编写了一个VBA函数,它可以检查一些内容并返回一个代码 这会触发条件格式。一切都很好,除了 公式经常触发一个
#值
错误。它可以为所有人做到这一点 包含公式的单元格(几千个)。出现错误 每当我打开另一个工作簿时。有时候我不知道的时候就会发生 打开另一个工作簿

功能如下:

  Function jjcheck(STDTRow As Integer, cuCOL As Integer, cuMax As Integer, trmEnd As Integer, trmEMax As Integer, worksheetSRC As String, lstCTCT As Date) As Variant
   'use in spreadsheet =jjcheck(B2,Variables!$G$4,Variables!$G$2,Variables!$F$2,"SRM",U2)
   '=jjcheck(B2,Variables!$G$4,Variables!$F$4,Variables!$G$2,Variables!$F$2,"SRM",IF(ISBLANK(U2),TODAY(),U2))
   Dim V() As String, dayMax As Integer, lookup As Date, theDiff As Integer, lstContact As String
   V = Split(ActiveWorkbook.ActiveSheet.Cells(1, 2).Value, "-"): dayMax = V(1): theDiff = 256
   lookup = lstCTCT
   theDiff = DateDiff("d", lookup, Date): lstContact = ""
   If theDiff > dayMax Then lstContact = "Alert"
   Dim STDcu As Integer, STtrmEnd As Date, daysTOtrmend As Integer
   STDcu = ActiveWorkbook.Worksheets(worksheetSRC).Cells(STDTRow, cuCOL).Value
   STtrmEnd = ActiveWorkbook.Worksheets(worksheetSRC).Cells(STDTRow, trmEnd).Value
   daysTOtrmend = DateDiff("d", Date, STtrmEnd)
   If STDcu < cuMax And daysTOtrmend < trmEMax Then
       jjcheck = "CHECK" & lstContact
   ElseIf daysTOtrmend < trmEMax / 2 Then
       jjcheck = "ETerm" & lstContact
   Else
       jjcheck = "" & lstContact
   End If
End Function
函数jjcheck(STDTRow为整数,cuCOL为整数,cuMax为整数,trmEnd为整数,trmEMax为整数,worksheetSRC为字符串,lstctctct为日期)作为变量
'在电子表格中使用=jjcheck(B2,变量!$G$4,变量!$G$2,变量!$F$2,“SRM”,U2)
'=jjcheck(B2,变量!$G$4,变量!$F$4,变量!$G$2,变量!$F$2,“SRM”,如果(ISBLANK(U2),TODAY(),U2))
Dim V()作为字符串,dayMax作为整数,lookup作为日期,Diff作为整数,lstContact作为字符串
V=Split(ActiveWorkbook.ActiveSheet.Cells(1,2).值“-”):dayMax=V(1):theDiff=256
查找=lstCTCT
theDiff=DateDiff(“d”,查找,日期):lstContact=“”
如果DIFF>dayMax,则lstContact=“警报”
Dim STDcu为整数,STRMEND为日期,daysTOtrmend为整数
STDcu=ActiveWorkbook.Worksheets(worksheetSRC).Cells(STDTRow,cuCOL).Value
STtrmEnd=ActiveWorkbook.Worksheets(worksheetSRC).Cells(STDTRow,trmEnd).Value
daysTOtrmend=DateDiff(“d”,日期,STtrmEnd)
如果STDcu
由于怀疑错误可能是由于时间单元格
U2
为空,我 将我为
lstCTCT
添加的内容更改为
IF(ISBLANK(U2),TODAY(),U2)
这似乎没有帮助。
谢谢你对这方面的见解。

如果这有什么不同,请告诉我?主要的变化是
ActiveWorkbook
ThisWorkbook
。(其他一些只是为了整理)

函数jjcheck(STDTRow为整数,cuCOL为整数,cuMax为整数,trmEnd为整数,trmEMax为整数,worksheetSRC为字符串,lstctctct为日期)作为变量
'在电子表格中使用=jjcheck(B2,变量!$G$4,变量!$G$2,变量!$F$2,“SRM”,U2)
'=jjcheck(B2,变量!$G$4,变量!$F$4,变量!$G$2,变量!$F$2,“SRM”,如果(ISBLANK(U2),TODAY(),U2))
Dim V()作为字符串,lstContact作为字符串
Dim dayMax为整数,DIFF为整数,STDcu为整数,daysTOtrmend为整数
Dim查找为日期,STRMEND为日期
STDcu=ThisWorkbook.Worksheets(worksheetSRC).Cells(STDTRow,cuCOL).Value
STtrmEnd=此工作簿.工作表(worksheetSRC).Cells(STDTRow,trmEnd).Value
daysTOtrmend=DateDiff(“d”,日期,STtrmEnd)
V=Split(this工作簿.ActiveSheet.Cells(1,2).Value“-”):dayMax=V(1):theDiff=256
查找=lstCTCT
theDiff=DateDiff(“d”,查找,日期):lstContact=VbNullString
如果DIFF>dayMax,则lstContact=“警报”
如果STDcu
如果这有什么不同,请告诉我?主要的变化是
ActiveWorkbook
ThisWorkbook
。(其他一些只是为了整理)

函数jjcheck(STDTRow为整数,cuCOL为整数,cuMax为整数,trmEnd为整数,trmEMax为整数,worksheetSRC为字符串,lstctctct为日期)作为变量
'在电子表格中使用=jjcheck(B2,变量!$G$4,变量!$G$2,变量!$F$2,“SRM”,U2)
'=jjcheck(B2,变量!$G$4,变量!$F$4,变量!$G$2,变量!$F$2,“SRM”,如果(ISBLANK(U2),TODAY(),U2))
Dim V()作为字符串,lstContact作为字符串
Dim dayMax为整数,DIFF为整数,STDcu为整数,daysTOtrmend为整数
Dim查找为日期,STRMEND为日期
STDcu=ThisWorkbook.Worksheets(worksheetSRC).Cells(STDTRow,cuCOL).Value
STtrmEnd=此工作簿.工作表(worksheetSRC).Cells(STDTRow,trmEnd).Value
daysTOtrmend=DateDiff(“d”,日期,STtrmEnd)
V=Split(this工作簿.ActiveSheet.Cells(1,2).Value“-”):dayMax=V(1):theDiff=256
查找=lstCTCT
theDiff=DateDiff(“d”,查找,日期):lstContact=VbNullString
如果DIFF>dayMax,则lstContact=“警报”
如果STDcu您应该考虑使用<代码>此工作簿< /C> >而不是<代码> ActudiWorkBoo> <代码>或更好,给出您的工作表名称(在VBA编辑器中)并直接引用它们--<代码> WKSHOME(范围)…<代码>。<>代码> ActudioWorkBoo/<代码>的问题在于,它取决于你上一个交互的工作簿。你应该考虑使用<代码>此工作簿< /C> >而不是<代码> ActudiWorkBoo> <代码>,或者更好地给出你的工作表名称(在VBA编辑器中)并直接引用它们--<代码> WKSMOM.Read(…)< /代码>。
ActiveWorkbook
的问题在于,它会根据您上次使用的工作簿而变化。非常感谢。似乎就是这样。很好的解释。谢谢。没问题@TMZ如果你很高兴这回答了你的问题,请选择此答案旁边的勾号,将其标记为已接受。谢谢,我不知道我可以这样做。我曾尝试投票,但由于我是新成员,所以无法投票。无论如何,这个答案在大部分情况下都非常有效。当我打开新的电子表格时,错误不再出现。但是,它有时仍会出现(不太频繁)。我怀疑它是在同一工作表中的一些“无关”宏运行时出现的。我怀疑其他宏与该函数有相同的问题,但奇怪的是,该错误出现在这个“不相关”函数中。没问题-我的建议是t
Function jjcheck(STDTRow As Integer, cuCOL As Integer, cuMax As Integer, trmEnd     As Integer, trmEMax As Integer, worksheetSRC As String, lstCTCT As Date) as Variant

'use in spreadsheet   =jjcheck(B2,Variables!$G$4,Variables!$G$2,Variables!$F$2,"SRM",U2)
'=jjcheck(B2,Variables!$G$4,Variables!$F$4,Variables!$G$2,Variables!$F$2,"SRM",IF(ISBLANK(U2),TODAY(),U2))

Dim V() As String, lstContact As String
Dim dayMax As Integer, theDiff As Integer, STDcu As Integer, daysTOtrmend As Integer
Dim lookup As Date, STtrmEnd As Date

STDcu = ThisWorkbook.Worksheets(worksheetSRC).Cells(STDTRow, cuCOL).Value
STtrmEnd = ThisWorkbook.Worksheets(worksheetSRC).Cells(STDTRow, trmEnd).Value
daysTOtrmend = DateDiff("d", Date, STtrmEnd)
V = Split(ThisWorkbook.ActiveSheet.Cells(1, 2).Value, "-"): dayMax = V(1): theDiff = 256
lookup = lstCTCT
theDiff = DateDiff("d", lookup, Date): lstContact = vbNulltring

If theDiff > dayMax Then lstContact = "Alert"

If STDcu < cuMax And daysTOtrmend < trmEMax Then
    jjcheck = "CHECK" & lstContact
ElseIf daysTOtrmend < trmEMax / 2 Then
    jjcheck = "ETerm" & lstContact
Else
    jjcheck = vbNullString & lstContact
End If
End Function