Одной из причин усталости является то, что вы пытались пойти на убийство, прежде чем приступить к бойне. Приведенное ниже решение заняло час, чтобы подготовиться и 10 минут, чтобы закодировать. Вставьте весь код в стандартный модуль кода и вызовите функцию MatchRow
либо из окна Immediate (? MatchRow
), либо из собственного кода, как показано ниже в тестовом процессе.
Option Explicit
Enum Nws ' worksheet navigation
' 01 Mar 2019
NwsCriteriaRow = 3
NwsList = 1 ' Columns: (1 = A)
NwsID = 3
NwsNumber ' (undefined: assigns next integer)
End Enum
Function MatchRow() As Long
' 01 Mar 2019
' return 0 if not found
Dim Ws As Worksheet
Dim Rng As Range
Dim R As Long
' The ActiveWorkbook isn't necessarily ThisWorkbook
Set Ws = ActiveWorkbook.Worksheets("Sheet2") ' replace tab's name here
With Ws
Set Rng = .Range(.Cells(NwsCriteriaRow, NwsList), .Cells(.Rows.Count, NwsList).End(xlUp))
R = FindRow(.Cells(NwsCriteriaRow, NwsID).Value, Rng, True)
If R Then ' skip if no match was found
Set Rng = .Cells(R + 1, NwsID)
Set Rng = .Range(Rng, Rng.End(xlDown))
MatchRow = FindRow(.Cells(NwsCriteriaRow, NwsNumber).Value, Rng)
End If
End With
End Function
Private Function FindRow(Crit As Variant, _
Rng As Range, _
Optional ByVal SearchFromTop As Boolean) As Long
' 01 Mar 2019
' return 0 if not found
Dim Fun As Range
Dim StartCell As Long
With Rng
If SearchFromTop Then
StartCell = 1
Else
StartCell = .Cells.Count
End If
Set Fun = .Find(What:=Crit, _
After:=.Cells(StartCell), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
MatchCase:=False)
End With
If Not Fun Is Nothing Then FindRow = Fun.Row
End Function
Функция MatchRow
возвращает номер строки Sheet2, где D3 найден, ища только ту часть столбца D, которая принадлежит списку, указанному в C3. Функция возвращает 0, если совпадений не найдено ни в списке, ни в ID.
Вы не указали, что вы хотите сделать с найденным рядом. Процедура ниже вернет данные из этой строки. Вместо этого вы можете использовать возможность адресации ячеек для записи в них.
Private Sub RetrieveData()
Dim R As Long
R = MatchRow
MsgBox "ID = " & Cells(R, NwsID).Value & vbCr & _
"Number = " & Cells(R, NwsNumber).Value
End Sub
Будучи предназначенным для тестирования только вышеупомянутого процесса, он не определяет рабочий лист и, следовательно, возвращает данные из ActiveSheet, предположительно Sheet2.
Ваш
должен иметь beforeFilter ()
метод со всеми поведениями компонента Auth . Одним из таких способов поведения является отправка, когда пользователь не вошел в систему.
вы будете искать что-то вроде:
// If cake should redirect automatically or you will do it in the User.login()
$this->Auth->autoRedirect = true;
// And if the autoRedirect is true, where to redirect
$this->Auth->loginRedirect = '/user/login';
G'luck