将参数传递给函数的问题

时间:2013-07-02 10:06:57

标签: excel-vba vba excel

经过几个小时的故障排除后,我似乎无法自己找到解决此问题的任何方法。我之前从未做过任何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

1 个答案:

答案 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而不是使用传递给函数的值。