运行时错误“13”:在我的VBA excel代码中

时间:2013-02-19 08:50:49

标签: excel vba excel-vba

我正在写一个脚本,它将计算几个不同日期之间的天数。我在单元格中有一个数据:

  

1-In Progress#02-ASSIGNED TO TEAM#22/01/2013 14:54:23,4-On   举行#02-分配到团队#18/01/2013 16:02:03,1-进行中#02-ASSIGNED   致团队#18/01/2013 16:02:03

这是关于我的交易状态的信息。我想计算此交易在“4-On Hold”中的天数。所以在这个例子中它将在2013年1月18日至2013年1月22日之间。

我写了这样的东西(对不起文字中的母语单词)

Sub Aktywnywiersz()
    Dim wiersz, i, licz As Integer
    Dim tekstwsadowy As String
    Dim koniectekstu As String
    Dim pozostalytekst As String
    Dim dataztekstu As Date
    Dim status4jest As Boolean
    Dim status4byl As Boolean
    Dim datarozpoczecia4 As Date
    Dim datazakonczenia4 As Date
    Dim dniw4 As Long


    wiersz = 2 'I start my scrypt from second row of excel

    Do Until IsEmpty(Cells(wiersz, "A")) 'this should work until there is any text in a row

        status4jest = False 'is status 4-On Hold is now in a Loop
        status4byl = False 'is status 4-On Hold was in las loop
        dniw4 = 0 ' numbers od days in 4-On Hold status
        tekstwsadowy = Cells(wiersz, "H").Value2 'grabing text
        tekstwsadowy = dodanieprzecinka(tekstwsadowy) 'in some examples I had to add a coma at the end of text

        For i = 1 To Len(tekstwsadowy)
          If Right(Left(tekstwsadowy, i), 1) = "," Then licz = licz + 1  'count the number of comas in text that separates the changes in status
        Next

        For j = 1 To licz

            koniectekstu = funkcjaliczeniadni(tekstwsadowy) 'take last record after coma
            Cells(wiersz, "k") = koniectekstu

            dataztekstu = funkcjadataztekstu(koniectekstu) 'take the date from this record
            Cells(wiersz, "m") = dataztekstu

            status4jest = funkcjaokreslenia4(koniectekstu) 'check if there is 4-On Hold in record
            Cells(wiersz, "n") = status4jest


            If (status4byl = False And staus4jest = True) Then

                datarozpoczecia4 = dataztekstu
                status4byl = True

            ElseIf (status4byl = True And staus4jest = False) Then
                datazakonczenia4 = dataztekstu
                status4byl = False  'if elseif funkcion to check information about 4-On Hold
                dniw4 = funkcjaobliczeniadniw4(dniw4, datazakonczenia4, datarozpoczecia4) 'count days in 4-On Hold

            Else
                  'Else not needed...
            End If


            tekstwsadowy = resztatekstu(tekstwsadowy, koniectekstu) 'remove last record from main text

        Next

        Cells(wiersz, "L") = dniw4 ' show number of days in 4-On Hold status


        wiersz = wiersz + 1
    Loop
End Sub


Function funkcjaliczeniadni(tekstwsadowy As String)

    Dim a, dl As Integer
    dl = Len(tekstwsadowy)

    a = 0

On Error GoTo errhandler:

    Do Until a > dl
        a = Application.WorksheetFunction.Find(",", tekstwsadowy, a + 1)
    Loop

    funkcjaliczeniadni = tekstwsadowy
    Exit Function
errhandler:
    funkcjaliczeniadni = Right(tekstwsadowy, dl - a)

End Function


Function dodanieprzecinka(tekstwsadowy As String)

    If Right(tekstwsadowy, 1) = "," Then
        dodanieprzecinka = Left(tekstwsadowy, Len(tekstwsadowy) - 1)
    Else
        dodanieprzecinka = tekstwsadowy
    End If

End Function


Function resztatekstu(tekstwsadowy, koniectekstu As String)

    resztatekstu = Left(tekstwsadowy, Len(tekstwsadowy) - Len(koniectekstu))

End Function


Function funkcjadataztekstu(koniectekstu As String)

    funkcjadataztekstu = Right(koniectekstu, 19)
    funkcjadataztekstu = Left(funkcjadataztekstu, 10)

End Function


Function funkcjaobliczeniadniw4(dniw4 As Long, datazakonczenia4 As Date, datarozpoczecia4 As Date)

    Dim liczbadni As Integer

    liczbadni = DateDiff(d, datarozpoczecia4, datazakonczenia4)
    funkcjaobliczaniadniw4 = dniw4 + liczbadni

End Function

Function funkcjaokreslenia4(koniectekstu As String)

    Dim pierwszyznak As String

    pierwszyznak = "4"

    If pierszyznak Like Left(koniectekstu, 1) Then
        funkcjaokreslenia4 = True
    Else
        funkcjaokreslenia4 = False
    End If

End Function

现在我得到

  

运行时错误“13”

dataztekstu = funkcjadataztekstu(koniectekstu) 'take the date from this record

我将非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

由于类型不匹配,您收到该错误。 dataztekstu被声明为日期,很可能函数funkcjadataztekstu返回的表达式不是日期。你将不得不一步一步地找到你得到的回报。

这是一个复制该问题的简单示例

这会给你错误

Option Explicit

Sub Sample()
    Dim dt As String
    Dim D As Date

    dt = "Blah Blah"

    D = getdate(dt)

    Debug.Print D
End Sub

Function getdate(dd As String)
    getdate = dd
End Function

这不会

Option Explicit

Sub Sample()
    Dim dt As String
    Dim D As Date

    dt = "12/12/2014"

    D = getdate(dt)

    Debug.Print D
End Sub

Function getdate(dd As String)
    getdate = dd
End Function

如果您将功能更改为此

Function funkcjadataztekstu(koniectekstu As String)
    Dim temp As String

    temp = Right(koniectekstu, 19)
    temp = Left(temp, 10)

    MsgBox temp '<~~ This will tell you if you are getting a valid date in return

    funkcjadataztekstu = temp
End Function

然后你就可以看到那个函数正在返回什么。

答案 1 :(得分:0)

我尝试运行您的代码,但要了解您想要执行的操作有点难以理解。部分内容是您的语言代码,但由于缺少缩进等原因,代码也难以阅读。)

另外,我不明白工作表中的数据是如何看的。我确实通过猜测让它运行,当我这样做时,我在For循环的第二次运行中得到了相同的错误 - 那是因为koniectekstu字符串为空。不确定这是不是你的问题,所以我的解决方案非常通用。

为了解决这类问题:

  1. 使用代码模块顶部的Option Explicit。这将使您必须声明模块中使用的所有变量,并且您将在运行代码之前删除许多问题。例如,您声明变量status4jest但使用名为staus4jest的其他变量,除非您使用Option Explicit,否则Excel不会投诉。

  2. 声明函数的返回类型。

  3. 格式化代码,以便更容易阅读。在语句之前和之后使用空格。评论一切!你做了一些,但要确保初学者能够理解。我将编辑您的代码作为缩进的示例。

  4. <强>调试!使用 F8 逐步执行代码,并确保所有变量都包含您认为的所有变量。您很可能通过这种方式调试代码来解决您的问题。

  5. 在此处就您遇到的具体问题或如何解决具体问题寻求帮助,不要发送所有代码并询问它为什么不起作用。如果你将问题分解成部分并单独询问,你将自己更快地学习VBA。

  6. 有关您的代码的具体提示:查找Split功能。它可以使用一个字符串并根据分隔符创建一个数组 - 例如:Split(tekstwsadowy, ",")将为您提供一个字符串数组,其中包含逗号之间的文本。

  7. 我提到Option Explicit了吗? ;)

  8. 无论如何,我希望这有帮助,即使我没有解决你得到的确切错误。