После нескольких часов поиска неисправностей, я все еще не могу найти подходящего решения этой проблемы самостоятельно. Раньше я никогда не делал 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
так что происходит не так, вы получаете сообщение об ошибке, или это просто не работает должным образом? –
BTW, чтобы найти последнюю строку, вы можете просто написать строку кода: «LastRow = Cells.Find (« * », SearchOrder: = xlByRows, SearchDirection: = xlPrevious) .Row' –
@Philip Извините, забыл упомянуть об этом. Для объяснения см. Обновленную запись. – KnutFH