Функция поиска выходит после 2-го вызова - PullRequest
0 голосов
/ 02 октября 2018

У меня есть простая функция поиска - addFormulaTestDataLoop - которая вызывается несколько раз для возврата номера строки.

В первых двух вызовах (вызов 1 и вызов 2) он находит начало и конецстроки для первого блока.Затем я вызываю его еще два раза (звоните 3 и звоните 4), чтобы получить номера следующей и начальной строки. Но при третьем вызове (вызов 3), вместо возврата значения, оно переходит к End Function.Однако, когда я перебираю код, подпрограмма поиска gFindInColumn содержит правильный номер строки.

Public Function gFindInColumn(search As Variant, columnNum As Double, Optional rowNum As Double) As Double

If rowNum = 0 Then
    rowNum = 2
End If
gFindInColumn = Columns(columnNum).Find(What:=search, _
                                After:=Cells(rowNum, columnNum), _
                                LookIn:=xlValues, _
                                LookAt:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False, _
                                SearchFormat:=False).row
'MsgBox "value = " & gFindInColumn, vbExclamation, "Finished"
End Function

Эта функция вызывается так:

dlgSysteEPatchTempDateTime.Show
temp = dlgSysteEPatchTempDateTime.txtBPreBaseLineEndTemp.Value
sStr = dlgSysteEPatchTempDateTime.txtBPreBaselineStartDate.Value & " " & dlgSysteEPatchTempDateTime.txtBPreBaselineStartTime.Value
eStr = dlgSysteEPatchTempDateTime.txtBPreBaselineEndDate.Value & " " & dlgSysteEPatchTempDateTime.txtBPreBaselineEndTime.Value

sRow(1, 1) = gFindInColumn(sStr, 3)
eRow(1, 1) = gFindInColumn(eStr, 3)
Call addFormulaTestDataLoop(temp, sRow(1, 1), eRow(1, 1))

'Dur
temp = dlgSysteEPatchTempDateTime.txtBDurBaseLineEndTemp.Value
sStr = dlgSysteEPatchTempDateTime.txtBDurBaselineStartDate.Value & " " & dlgSysteEPatchTempDateTime.txtBDurBaselineStartTime.Value
eStr = dlgSysteEPatchTempDateTime.txtBDurBaselineEndtDate.Value & " " & dlgSysteEPatchTempDateTime.txtBDurBaselineEndTime.Value
qtyDur = dlgSysteEPatchTempDateTime.txtDurQty.Value

sRow(2, 2) = gFindInColumn(sStr, 3)
eRow(2, 2) = gFindInColumn(eStr, 3)
Range("A" & sRow(2, 2)).Value = "DURING"
Call addFormulaTestDataLoop(temp, sRow(2, 2), eRow(2, 2))

Сбойна sRow(2, 2) = gFindInColumn(sStr, 3), но работает на первых двух вызовах?

1 Ответ

0 голосов
/ 02 октября 2018

Кажется, что вы хотите найти только совпадения, которые встречаются после определенного номера строки: в этом случае вам нужно убедиться, что Find () не зациклился ...

Public Function gFindInColumn(search As Variant, rngCol As Range, _
                              Optional rowNum As Long = 2) As Long
    Dim f As Range
    Set f = rngCol.Find(What:=search, After:=rngCol.Cells(rowNum), _
                        LookIn:=xlValues, LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False, _
                        SearchFormat:=False)

    If Not f Is Nothing Then
        'only return non-zero if the found cell is *after* rowNum
        gFindInColumn = IIf(f.Row > rowNum, f.Row, 0)
    Else
        gFindInColumn = 0
    End If

End Function

Вы также переключили свой «столбец поиска» на объект Range, чтобы не было двусмысленности относительно того, на каком листе выполняется поиск.

Обратите внимание, что вы можете обрабатывать значения по умолчанию для необязательных параметров непосредственно в списке параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...