使用DateValue()在函数中输入Mismatch错误,如何排除故障?

时间:2013-07-30 23:03:46

标签: excel vba excel-vba

警告:我是菜鸟。

我写了一个Sub来查找带有红色文本的单元格并更改它们。

@ThinkerIV给了我一个很好的功能来放入一个单元格并将公式拖到相邻的单元格中,但由于要处理的工作表数量,这不起作用。 所以我写了我的Sub,调用他的函数(见下面的代码)。我把它传给了一个单元格的范围,所以在我看来它应该有效吗?

但是,它一直在函数调用DateValue()的行上抛出Type Mismatch(运行时错误代码13)!当我在编辑器中将鼠标悬停在它上面时,传递的范围显示值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

EDIT  我还无法发布自己的答案,所以我正在添加这个解决方案:

当向Format()提供数据时,为红色格式化的第一个单元格的内容不是文本形式。我没有采取任何方式确保我传递正确的数据类型。因此,在将单元格传递给函数之前将单元格格式化为文本(foundCell.NumberFormat =“@”)的行就是修复它的行。

当我将代码复制/粘贴到问题中时,实际上已经编写了解决方案 - 我只是不知道它已修复它因为另一个Sub上的另一个错误。 (我是一个菜鸟,很困惑处理多个潜艇中的多个错误)我以为我已经用新线路再次尝试了它,但是没有,所以仍然认为它不起作用。

感谢所有帮助过的人。我现在感觉有点傻,发现它就像那样。希望你能原谅我的新手 - 在编辑器的一个巨大的列表中有太多的子和功能,我感到'头晕'......至少我可以发布一个解决方案,以防其他一些菜鸟需要它!

1 个答案:

答案 0 :(得分:0)

好的,我认为这里有两件事。首先,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