2013-07-02 2 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() найдет строки в исходном листе, который соответствует критериям, определенным атрибутом маркеров. Затем он скопирует соответствующие строки из исходного листа в выходной лист.

Мне нужно вызвать 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 

EDIT: я забыл описать то, что на самом деле происходит. Все функции работают нормально, и они дают выход, но вывод неверен. Первый вызов 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

так что происходит не так, вы получаете сообщение об ошибке, или это просто не работает должным образом? –

+0

BTW, чтобы найти последнюю строку, вы можете просто написать строку кода: «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) 

Forth, который может быть самой большой проблемой. Вы должны изменить FromRowNumber parameter в этой строке

Function exData(Tokens, WSoutX, FromRowNum) 

к чему-либо иному, как:

Function exData(Tokens, WSoutX, FromRowNumParam) 

и изменить FromRowNum variable соответственно в пределах функции. Если нет, каждый раз, когда вы используете FromRowNum variable в своей функции, вы скорее вызываете FromRowNum function вместо того, чтобы использовать значение, которое было передано функции.

Смежные вопросы