2013-07-02 35 views
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()将查找源表中符合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

+0

所以出了什么问题,你有错误,还是只是不按预期工作? –

+0

顺便说一句,找到最后一行,你可能只是有一行代码喜欢这个:'LastRow = Cells.Find(“*”,SearchOrder:= xlByRows,SearchDirection:= xlPrevious).Row' –

+0

@Philip对不起,忘了提到这一点。为了解释,请参阅更新的帖子。 – KnutFH

回答

2

首先,您Function exData应而建成的过程Sub exData

第二个,你不需要调用这条线Call Functions.FromRowNum,因为它什么都不做。返回的函数值不会传递到任何地方。

,以确保您以这种方式调用正确的函数传递参数给exData

Call exData(Token1, WSout, Functions.FromRowNum) 

第四,这可能是最大的问题。您需要在此行

Function exData(Tokens, WSoutX, FromRowNum) 

改变FromRowNumber parameter到不同的东西,如:

Function exData(Tokens, WSoutX, FromRowNumParam) 

,并在函数中改变FromRowNum variable相应。如果不是,每次在函数中使用FromRowNum variable,而是调用FromRowNum function而不是使用传递给该函数的值。