何時間ものトラブルシューティングを行った後でも、この問題に対する適切な解決策を自分で見つけることができないようです。私はこれまで 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