经过几个小时的故障排除后,我似乎无法自己找到解决此问题的任何方法。我之前从未做过任何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()上还可能有几个调用。
在粘贴第二个电话时出现问题。我在调用时想要传递给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的第一次调用就是我所期望的。但在第二次调用时,它将粘贴在第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
解 我实现了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
答案 0 :(得分:2)
首先,您的Function exData
应该构建为程序Sub exData
。
第二次,您无需调用此行Call Functions.FromRowNum
,因为它不执行任何操作。返回的函数值不会在任何地方传递。
第三次,确保以这种方式将正确的函数传递参数调用到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
而不是使用传递给函数的值。