经过几个小时的故障排除后,我仍无法自己找到任何解决此问题的良好解决方案。我从来没有做过任何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()将查找源表中符合Token属性定义的条件的行。然后它会将匹配的行从源表复制到输出表。
我需要调用exData()两次,使用不同的参数,因为我需要匹配两个不同的标准。 exData()也可能有更多的调用。
粘贴第二个电话时出现问题。我调用了一个参数“FromRowNum”,我想传递给exData()。该参数告诉函数应该从哪一行开始粘贴。 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的第一个调用是我所期望的。但在第二次调用时,它将粘贴在行1 + NumberOfRowsInResult上。在我的测试案例中,这意味着它将粘贴来自第999行的第二个调用的结果。我想要发生的是从第一个空行(在第一次调用完成之后)粘贴。
这里是函数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
SOLUTION 我实现所有的变化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
所以出了什么问题,你有错误,还是只是不按预期工作? –
顺便说一句,找到最后一行,你可能只是有一行代码喜欢这个:'LastRow = Cells.Find(“*”,SearchOrder:= xlByRows,SearchDirection:= xlPrevious).Row' –
@Philip对不起,忘了提到这一点。为了解释,请参阅更新的帖子。 – KnutFH