1

何時間ものトラブルシューティングを行った後でも、この問題に対する適切な解決策を自分で見つけることができないようです。私はこれまで VBA をやったことがないので、これは主に試行錯誤に基づいています。

関数 extractData_test() はいくつかの変数を定義し、作業を行うために必要な他の関数にそれらを渡します。まだいくつかの機能がありますが、私の問題では何の役割も果たさないので、それらを省略しました。

非常に多くのシートに対して extractData() を実行する必要があるため、このソリューションを使用しました。

Function extractData_test()
   'Define variables
    Dim Token1 As String
    Dim Token2 As String
    Dim WSout As String

   'Set attributes of the lines that should be returned, and to which worksheet.
    Token1 = "TROLLEY"
    Token2 = "TP"
    WSout = "testWS2"

    Sheets(WSout).Activate
    Sheets(WSout).UsedRange.ClearContents
   'Call Functions.FromRowNum //Line removed
    Call exData(Token1, WSout, Functions.FromRowNum)
   'Call Functions.FromRowNum //Line removed
    Call exData(Token2, WSout, Functions.FromRowNum)         
End Function

関数 exData() は、トークン属性によって定義された条件に一致するソース シート内の行を検索します。次に、一致する行をソース シートから出力シートにコピーします。

2 つの異なる条件に一致させる必要があるため、exData() を異なるパラメーターで 2 回呼び出す必要があります。exData() にもさらにいくつかの呼び出しがある可能性があります。

問題は、2 番目の呼び出しに貼り付けるときに発生します。呼び出すときに exData() に渡したいパラメーター「FromRowNum」を作成しました。このパラメーターは、貼り付けを開始する行を関数に指示します。FromRowNum 関数は、ActiveSheet の最後の行を検索します。しかし、すべてが正しいかどうかはわかりません。

Function FromRowNum()
    Set WSout = ActiveSheet
    With WSout
        Set LastCell = .Cells(.Rows.Count, "C").End(xlUp)
        FromRowNum = LastCell.Row
    End With
End Function

編集: 実際に何が起こっているのかを説明するのを忘れていました。すべての関数は正常に実行され、出力が得られますが、出力は間違っています。exData の最初の呼び出しは、私が期待することを行います。しかし、2 回目の呼び出しでは、行 1+NumberOfRowsInResult に貼り付けられます。私のテストケースでは、これは行 999 か​​らの 2 番目の呼び出しの結果が貼り付けられることを意味します。

これが関数 exData() です。

Function exData(Tokens, WSoutX, FromRowNumParam) 'Changed from FromRowNum to FromRowNumParam

    Dim WS As Worksheet
    Dim LastCell As Range
    Dim y As Long
    Dim x As Long
    Dim WSout As Worksheet

    'PasteFromRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

    Set WSout = Worksheets(WSoutX)
    x = 0
    xx = 0
    n = 0
    m = 0
    rownumber = inf

    Set WS = Worksheets("data")
    With WS
        Set LastCell = .Cells(.Rows.Count, "C").End(xlUp)
        y = LastCell.Row
    End With

    Dim i As Long, iMatches As Long
    Dim aTokens() As String: aTokens = Split(Tokens, "|")

    For Each cell In Sheets("data").Range("C:C")
    x = x + 1
        If x = y Then Exit For

            For i = 0 To UBound(aTokens)
            n = n + 1
                If InStr(1, cell.Value, aTokens(i), vbTextCompare) Then
                rownumber = x
                Exit For
         End If
         Next
            If rownumber = x Then Exit For
    Next

    For Each cell In Sheets("data").Range("C:C")
    xx = xx + 1
        If xx = y Then Exit For
            For j = 0 To UBound(aTokens)
            If InStr(1, cell.Value, aTokens(j), vbTextCompare) Then
                m = xx
            End If
        Next
    Next

    numrows = m - rownumber

    Sheets("data").Range(rownumber & ":" & rownumber, m & ":" & m).Copy Sheets(WSoutX).Range(FromRowNumParam& ":" & FromRowNumParam, numrows & ":" & numrows) 'Changed from FromRowNum to FromRowNumParam

End Function

解決 策 KazJaw が提案したすべての変更を実装し、さらに進めましたが、まだいくつかの問題がありました。前のコード例に追加された変更を参照してください。

この線

Sheets("data").Range(rownumber & ":" & rownumber, m & ":" & m).Copy Sheets(WSoutX).Range(FromRowNumParam& ":" & FromRowNumParam, numrows & ":" & numrows)

に変更する必要がありました

Sheets("data").Range(rownumber & ":" & rownumber, m & ":" & m).Copy Sheets(WSoutX).Range(FromRowNumParam& ":" & FromRowNumParam, FromRowNumParam+numrows & ":" & FromRowNumParam+numrows)

貼り付け範囲の終了が開始よりも小さく、問題が発生していました。したがって、追加する必要がありますFromRowNumParam+numrows

4

1 に答える 1

2

まず第一に、あなたFunction exDataはかなり手続きとして構築されるべきSub exDataです。

次に、何もしないので、この行を呼び出す必要はありCall Functions.FromRowNumません。返された関数値はどこにも渡されません。

3 番目exDataに、この方法で正しい関数パス パラメータを呼び出すようにします。

Call exData(Token1, WSout, Functions.FromRowNum)

Forth、これが最大の問題になる可能性があります。FromRowNumber parameterこの行で変更する必要があります

Function exData(Tokens, WSoutX, FromRowNum)

次のような別のものに:

Function exData(Tokens, WSoutX, FromRowNumParam)

それに応じて関数内で変更FromRowNum variableします。そうでない場合は、関数内で使用するたびに、関数に渡された値を使用する代わりにFromRowNum variable呼び出します。FromRowNum function

于 2013-07-02T10:18:05.840 に答える