2013-02-19 4 views
1

Я пишу сценарий, который будет считать количество дней между несколькими отдельными датами. У меня есть данные в ячейке, например:Ошибка во время выполнения «13»: в моем коде Excel V12

1-В ходе # 02 присваиваетса команды # 22/01/2013 14: 54: 23,4-О удержании # 02 присваиваетса команды # 18/01/2013 16: 02: 03,1-In Progress # 02-НАЗНАЧЕН в команду # 18/01/2013 16:02:03

Это информация о моем статусе сделки. Я хочу подсчитать количество дней, в течение которых эта транзакция находилась в «4-On 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 

Буду очень признателен за любую помощь.

+1

Привет, в вашем коде я вижу много необъявленных переменных. Вы знаете опцию Explicit? Если вы не используете его, попробуйте его здесь. Напишите его в самой первой строке вашего кода. Затем в редакторе VBA перейдите в Debug -> Compile и проверьте, хорошо ли объявлены все ваши переменные. – dee

+0

Thx для справки. Этот вариант очень помогает. Теперь я смогу это сделать :) – user2086238

ответ

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 

Затем вы можете увидеть, что возвращает эта функция.

+0

Thx для справки. Я получаю ясную коробку, поэтому я должен решить эту проблему сейчас. – user2086238

+0

Добро пожаловать :) Рад, что у вас возникла проблема ... –

0

Я попытался запустить ваш код, но немного сложно понять, что именно вы хотите сделать. Частью этого является код на вашем языке, но код также трудно прочесть из-за отсутствия отступов и т. Д. :)

Кроме того, я не понимаю, как выглядят данные на листе. Тем не менее, я действительно запустил его, угадывая, и когда я это сделал, я получил ту же ошибку, которую вы описываете во втором запуске цикла For - это потому, что строка koniectekstu была пуста. Не уверен, что это ваша проблема, поэтому мое решение является очень общим.

Для решения такого рода проблем:

  1. Использование Option Explicit в верхней части модуля кода. Это заставит вас объявить все переменные, используемые в модуле, и вы устраните многие из проблем, возникших перед запуском кода.Например, вы объявляете переменную status4jest, но используя другую переменную, называемую staus4jest, и Excel не будет жаловаться, если вы не используете Option Explicit.

  2. Объявите типы возврата для своих функций.

  3. Отформатируйте свой код, чтобы его было легче читать. Используйте пробелы до и после операторов. Прокомментируйте все! Вы сделали некоторые, но убедитесь, что новичок может понять. Я отредактирую вам код как пример отступа.

  4. Отладка! Пройдите свой код, используя F8 и убедитесь, что все переменные содержат то, что, по вашему мнению, они делают. Вы, скорее всего, решите свою проблему, отлаживая код таким образом.

  5. Обратитесь за помощью к конкретным проблемам, с которыми вы столкнулись или как решить конкретные проблемы, не отправляйте весь код и не спрашивайте, почему он не работает. Если вы разложите свои проблемы на части и спросите отдельно, вы узнаете сам VBA намного быстрее.

  6. Конкретный отзыв о вашем коде: найдите функцию Split. Он может принимать строку и создавать массив на основе разделителя. Пример: Split(tekstwsadowy, ",") предоставит вам массив строк с текстом между запятыми.

  7. Я упоминал Option Explicit? ;)

В любом случае, я надеюсь, что это поможет, даже если я не решит точную ошибку, которую вы получаете.

+0

Я использую «Option Explicit» и исправляю некоторые ошибки. Например, поскольку вы описываете «staus4jest», должен быть «status4jest» :), я буду лоток с функцией Split и пойдите с информацией, если мне удастся с моей проблемой :) – user2086238

+0

Отлично, удачи! –

Смежные вопросы