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ループの2回目の実行で説明しているのと同じエラーが発生しました-これは、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 に答える