Vba 使用DateValue()的函数中存在类型不匹配错误,如何进行故障排除?

Vba 使用DateValue()的函数中存在类型不匹配错误,如何进行故障排除?,vba,excel,Vba,Excel,警告:我是个笨蛋 我写了一个子程序来查找带有红色文本的单元格并对其进行修改 @ThinkerIV给了我一个很好的函数,可以放入一个单元格,然后将公式拖到相邻的单元格中,但由于要处理的工作表太多,所以这个函数不起作用。 所以我写了我的Sub,调用他的函数,见下面的代码。我通过了一个细胞的范围,所以在我看来它应该工作 但是,它在函数调用DateValue的行中不断抛出类型不匹配的运行时错误代码13!传递的范围显示一个值1,这是当我在编辑器中将鼠标悬停在单元格上时它所指的单元格中的数字,但我不知道这是

警告:我是个笨蛋

我写了一个子程序来查找带有红色文本的单元格并对其进行修改

@ThinkerIV给了我一个很好的函数,可以放入一个单元格,然后将公式拖到相邻的单元格中,但由于要处理的工作表太多,所以这个函数不起作用。 所以我写了我的Sub,调用他的函数,见下面的代码。我通过了一个细胞的范围,所以在我看来它应该工作

但是,它在函数调用DateValue的行中不断抛出类型不匹配的运行时错误代码13!传递的范围显示一个值1,这是当我在编辑器中将鼠标悬停在单元格上时它所指的单元格中的数字,但我不知道这是单元格的内容还是显示的其他值1

所以,我真的不知道如何确切地找出为什么会发生这种情况。是不是我通过的范围不太合适?请告诉我为什么这个代码不起作用

我试着把这一行改成它下面的评论行,并做了一些其他的盲目猜测,但这也有同样的错误

提前谢谢

    Sub redTextToRealDates()

    Dim dateTemp As Date
    Dim redCell As Range
    Dim foundCell As Range
    Dim thisSheetsRange As Range
    Dim busyCell As Range
    Dim redTextCells As Range
    Set thisSheetsRange = ActiveSheet.usedRange

    'Build a range containing all the cells in a sheet containing red text.
    '  well... all cells formatted to HAVE red text, anyway.
    '  Anyone want to tell me how to write this to skip empty cells?
    '  Because I don't need to grab empty cells into this range...

    For Each busyCell In thisSheetsRange
        If (busyCell.Font.ColorIndex()) = 3 Then
            If redTextCells Is Nothing Then
            Set redTextCells = busyCell
            Else: Set redTextCells = Union(redTextCells, busyCell)
            End If
        End If
    Next busyCell

    'Change unknown format cells to date cells populated with concantenated
    'string of original contents and the active sheet's name.

    For Each foundCell In redTextCells
        foundCell.NumberFormat = "@"
        foundCell = GetConcantDate(foundCell)

    Next foundCell

    redTextCells.NumberFormat = "dd/mm/yy"
    On Error Resume Next


    End Sub


    Function GetConcantDate(rng As Range) As Date
        'Original code supplied by ThinkerIV on StackOverflow.com
        Dim dtTemp As Date
        dtTemp = DateValue(rng.Range("A1").Value & " " & rng.Parent.Name)
         'dateTemp = DateValue(foundCell.Value & " " & ActiveSheet.Name)
        GetConcantDate = dtTemp
    End Function
编辑 我还不能发布我自己的答案,因此我添加了以下解决方案:

将数据馈送到Format时,格式化为红色的第一个单元格的内容不是文本形式。我没有采取任何方法来确保我传递了正确的数据类型。因此,在将单元格传递给函数之前,将其格式化为text foundCell.NumberFormat=@的行就是修复它的行

当我将代码复制/粘贴到问题中时,解决方案实际上已经写好了-我只是不知道它已经修复了它,因为另一个Sub上出现了错误。我是一个noob,在处理多个Sub中的多个错误时感到困惑我以为我已经用那条新行再次尝试了,但没有,所以我仍然认为它不起作用


感谢所有帮助过我的人。我现在觉得自己有点傻了,因为我发现了这一点。希望你原谅我的新手失误-在编辑器的一个大列表中有太多的替补和函数,我感到“头晕”。。。至少我可以发布一个解决方案,以防其他noob需要它

好吧,我想这里有两件事。首先,DateValue函数采用日期的字符串表示形式,例如01/01/2013,当您从一个范围传递excel日期时,您传递的是一个数字,如41275。这将抛出运行时错误13

然而,如果你已经有了约会,为什么还要费心转换呢?您似乎希望所有红细胞都转换为日期+表名。为此,您必须具有字符串,例如01/01/2013 Sheet1,因此不能在此处使用DateValue。相反,或许可以尝试以下方式:

Public Function GetConcatDate(rng As Range) As String
    Dim dtTemp As String
    dtTemp = Format(rng.Range("A1").Value, "dd/mm/yyyy") & " " & rng.Parent.Name
    GetConcatDate = dtTemp
End Function

如果传递的字符串不表示日期,DateValue将抛出错误13。调试。?rng.RangeA1.Value&&rng.Parent.Name。在GetConcantDate函数中,您不应该使用rng.cells1.Value而不是rng.RangeA1.Value吗?@nemmy两者都有效,并给出相同的结果。将此行放在dtTemp=DateValue行之前:debug.print rngtmp.cells1.Value&&rng.Parent.Name,并报告在调试窗口中看到的内容调用GetConcantDate时。工作表名称是什么。可能A1的值和工作表名称无法转换为日期。日期行只是日期。例:1或28。它们在单元格中的格式是一般格式或文本格式-我不知道为什么会这样做,我没有制作表格。所以我假设是字符串被传递到函数中。见下面的答案。