1

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

1-进行中#02-分配给团队#22/01/2013 14:54:23,4-等待中#02-分配给团队#18/01/2013 16:02:03,1-进行中#02 -分配给团队#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

如果有任何帮助,我将不胜感激。

4

2 回答 2

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

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

于 2013-02-19T09:09:24.623 回答
0

我尝试运行您的代码,但有点难以理解您想要做什么。其中一部分是您的语言中的代码,但由于缺少缩进等,代码也很难阅读:)

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

为了解决这类问题:

  1. Option Explicit在代码模块的顶部使用。这将使您必须声明模块中使用的所有变量,并且您将在运行代码之前消除许多问题。例如,您正在声明一个变量status4jest,但使用了另一个名为的变量staus4jest,Excel 不会抱怨,除非您使用Option Explicit.

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

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

  4. 调试F8使用并确保所有变量都包含您认为它们的作用来逐步检查您的代码。您很可能会通过这种方式调试代码来解决您的问题。

  5. 在此处就您遇到的特定问题或如何解决特定问题寻求帮助,不要发送所有代码并询问它为什么不起作用。如果你把你的问题分解成几个部分,分别问,你自己学习VBA会快很多。

  6. 关于您的代码的特定提示:查找Split函数。它可以接受一个字符串并根据分隔符创建一个数组 - 示例:Split(tekstwsadowy, ",")将为您提供一个字符串数组,其中包含逗号之间的文本。

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

无论如何,我希望这会有所帮助,即使我没有解决您遇到的确切错误。

于 2013-02-19T09:22:11.733 回答