我正在写一个脚本,它将计算几个不同日期之间的天数。我在单元格中有一个数据:
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
我将非常感谢任何帮助。
答案 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
字符串为空。不确定这是不是你的问题,所以我的解决方案非常通用。
为了解决这类问题:
使用代码模块顶部的Option Explicit
。这将使您必须声明模块中使用的所有变量,并且您将在运行代码之前删除许多问题。例如,您声明变量status4jest
但使用名为staus4jest
的其他变量,除非您使用Option Explicit
,否则Excel不会投诉。
声明函数的返回类型。
格式化代码,以便更容易阅读。在语句之前和之后使用空格。评论一切!你做了一些,但要确保初学者能够理解。我将编辑您的代码作为缩进的示例。
<强>调试强>!使用 F8 逐步执行代码,并确保所有变量都包含您认为的所有变量。您很可能通过这种方式调试代码来解决您的问题。
在此处就您遇到的具体问题或如何解决具体问题寻求帮助,不要发送所有代码并询问它为什么不起作用。如果你将问题分解成部分并单独询问,你将自己更快地学习VBA。
有关您的代码的具体提示:查找Split
功能。它可以使用一个字符串并根据分隔符创建一个数组 - 例如:Split(tekstwsadowy, ",")
将为您提供一个字符串数组,其中包含逗号之间的文本。
我提到Option Explicit
了吗? ;)
无论如何,我希望这有帮助,即使我没有解决你得到的确切错误。