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

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

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-Hold”中的天数。 所以在这个例子中,它将在18/01/2013和22/01/2013之间。

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

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 

我会非常感激任何帮助。

由于types不匹配,您正在获取该错误。 dataztekstu被声明为一个date,很可能函数funkcjadataztekstu返回的expression式不是date。 你将不得不通过它来find你所获得的价值。

这是一个简单的例子来复制这个问题

这会给你这个错误

 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

 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 

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

我试着运行你的代码,但是要理解你想要做什么是有点困难的。 其中一部分是你的语言的代码,但代码也很难阅读缺乏缩进等:)

此外,我不明白如何在工作表中的数据看起来。 但是,我确实是通过猜测来得到它,而当我做了同样的错误时,你在For循环的第二次运行中得到了同样的错误 – 那是因为koniectekstustring是空的。 不知道这是否是你的问题,所以我的解决scheme是非常普遍的。

为了解决这类问题:

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

  2. 为你的函数声明返回types。

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

  4. debugging ! 使用F8浏览您的代码,并确保所有variables都包含您认为他们所做的事情。 你很可能通过这种方式debugging代码来解决你的问题。

  5. 在这里询问您遇到的特定问题或如何解决特定问题,请不要发送所有代码,并询问为什么它不起作用。 如果你把问题分解成几个部分,分别问一下,你会更快地学习VBA。

  6. 关于您的代码的特定提示:查看Splitfunction。 它可以采取一个string,并根据分隔符来创build一个数组 – 例如: Split(tekstwsadowy, ",")将为您提供一个string数组,其中包含逗号之间的文本。

  7. 我提到Option Explicit吗? ;)

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