2013-02-19 5 views
1

몇 가지 별도의 날짜 사이에 일 수를 계산하는 스크립트를 작성하고 있습니다. I 같은 셀에 데이터를 가지고런타임 오류 "13": 내 VBA Excel 코드

1 인이 진행 ## 22/01/2,013 14 팀 02 할당

: 54 : # 02이 할당 보류 23.4 - 켜짐 # 18 팀/01/2013 16 : 02 : 03,1 - 진행 중 # 팀에 을 02 할당 내 트랜잭션 상태에 대한 정보입니다 즉, # 18/01/2013 16시 2분 3초

. 이 거래가 "4-On Hold"에 있었던 일 수를 계산하고 싶습니다. 따라서이 예에서는 2013 년 1 월 18 일과 2013 년 2 월 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"을 얻을

(텍스트에서 엄마 모국어 단어 죄송) 같은 것을 썼다 in

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

어떤 도움을 주셔서 감사합니다.

+1

안녕하세요, 귀하의 코드에서 나는 많은 선언되지 않은 변수를 참조하십시오. Option Explicit를 아십니까? 그것을 사용하지 않으면, 여기 그것을 시도하십시오. 코드의 첫 줄에 씁니다. 그런 다음 VBA 편집기에서 디버그 -> 컴파일로 이동하여 모든 변수가 잘 선언되어 있는지 확인하십시오. – 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 for help. 나는 명확한 상자를 얻는다. 그래서 thats는 내가 지금 풀어야 할 문제 다. – user2086238

+0

당신은 환영합니다 :) 다행 U는 문제를 발견했습니다 ... –

0

코드를 실행 해 보았지만 원하는 것을 이해하는 것은 약간 어렵습니다. 그 중 일부는 해당 언어의 코드이지만 코드는 들여 쓰기 부족 등을 읽는 것도 어렵습니다.

또한 워크 시트의 데이터가 어떻게 보이는지 이해할 수 없습니다. 나는 그것을 추측하여 실행하도록 만들었지 만, 내가했을 때 당신은 For 루프의 두 번째 실행에 대해 설명하는 동일한 오류가 발생했습니다. 이는 koniectekstu 문자열이 비어 있었기 때문입니다. 이것이 당신의 문제인지 확신 할 수 없기 때문에 제 해결책은 매우 일반적입니다. 코드 모듈의 상단에

  1. 사용 Option Explicit : 이러한 유형의 문제를 해결하기 위해

    . 이렇게하면 모두 변수가 모듈에 사용됨을 선언해야하며 코드를 실행하기 전에 발생한 많은 문제가 제거됩니다.예를 들어 변수 status4jest을 선언했지만 을 사용하지 않으면 Excel에서 staus4jest이라는 다른 변수를 사용하고 Excel에서 불평하지 않습니다.

  2. 함수에 대한 반환 유형을 선언하십시오.

  3. 코드를 쉽게 읽을 수 있도록 포맷하십시오. 앞뒤에 공백 문자를 사용하십시오. 모든 것을 주석 달기! 당신은 어떤 일을했지만 초심자가 이해할 수 있는지 확인하십시오. 들여 쓰기의 예로서 코드를 편집하겠습니다.

  4. 디버그! F8을 사용하여 코드를 단계별로 실행하고 모든 변수에 자신이 생각하는 바를 포함시켜야합니다. 이 방법으로 코드를 디버깅하여 문제를 해결할 가능성이 큽니다.

  5. 실행중인 특정 문제 또는 특정 문제를 해결하는 방법에 대한 도움을 받으려면 모든 코드를 보내지 않고 작동하지 않는 이유를 묻습니다. 문제를 부분별로 나누어 따로 질문하면 VBA를 더 빨리 배울 수 있습니다.

  6. 코드와 관련된 팁 : Split 기능을 찾으십시오. 문자열을 가져 와서 구분 기호를 기반으로 배열을 만들 수 있습니다. 예 : Split(tekstwsadowy, ",")은 쉼표 사이의 텍스트와 함께 문자열 배열을 제공합니다.

  7. Option Explicit을 언급 했습니까? ;)

어쨌든, 나는 이것이 당신이 점점 정확한 오류가 해결되지 않은 경우에도 도움이되기를 바랍니다.

+0

나는 'Option Explicit'을 사용하고 일부 오류를 수정합니다. 예를 들어, 'staus4jest'는 'status4jest'여야합니다. :) Split 함수를 사용하여 트레이를 만들고 내 문제를 해결하면 정보가 표시됩니다. – user2086238

+0

위대한 행운! –

관련 문제