Find ничего не возвращает, даже если значение существует - PullRequest
0 голосов
/ 10 июля 2019

Итак, у меня есть n-й вопрос о методе поиска.Я прочитал много вопросов об этом и проблемах, которые он несет, но все еще не мог найти решение моей проблемы.

Я просто хочу вернуть номер строки и номер столбца для определенного значения (дата),Однако код всегда запускает одну и ту же ошибку 91 (переменная объекта не установлена), потому что метод find не находит ничего.

Я пытался определить переменную как диапазон и изменить код, установив переменную (т.е. установить daterow = и т. Д.).Но проблема сохраняется.

Sub actual_cash_flow()
Dim cfdate As Long
Dim today As Long
Dim daterow As Long
Dim datecolumn As Long

today = Date
cfdate = WorksheetFunction.EoMonth(today, -1)

daterow = Sheet2.Cells.Find(What:=cfdate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, searchformat:=False).Row
datecolumn = Sheet2.Cells.Find(What:=cfdate).Column


End Sub

Я хотел бы иметь номер строки и номер столбца, чтобы идентифицировать ячейку и затем выполнить некоторые действия.

РЕДАКТИРОВАТЬ:

Редактируя код в соответствии с предложением @mikku и отлаживая диапазон, в котором есть значение и переменная, определенная в коде, я получаю одно и то же значение, однако я все равно ничего не получаю в качестве вывода.Так что я действительно не знаю, где ошибка.Смотрите изображение.

enter image description here

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Как я указывал в своем ответе на предыдущий вопрос, работать с датами и функцией Range.Find может быть сложно. Одна из причин, по-видимому, заключается в том, что тип данных VBA Date не совпадает с датой, хранящейся на листе Excel. Последний формат Double выглядит как дата.

Таким образом, особенно если вы хотите, чтобы ваш метод .Find не зависел от настроек даты, вам, вероятно, лучше не использовать метод Range.Find, а циклически проходить по данным.

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

Sub actualcf()

Dim cfdate As Long  'Yes --Long for this application
Dim daterow As Long
Dim datecolumn As Long
Dim fnd As Range

Dim srchRng As Range
Dim vSrch As Variant
Dim I As Long

With Worksheets("Peschiera CF")

'Find the row with the dates
Set srchRng = .Cells.Find(what:="Yr. Ending", after:=.Cells(1, 1), LookIn:=xlValues)

'Read that row into a VBA array, but only the columns with data
'Note that we are using `.Value2` which has no formatting
If Not srchRng Is Nothing Then
    vSrch = .Range(.Cells(srchRng.Row, 1), .Cells(srchRng.Row, .Columns.Count).End(xlToLeft)).Value2
End If

cfdate = WorksheetFunction.EoMonth(Date, -1)
For I = 1 To UBound(vSrch, 2)
    If vSrch(1, I) = cfdate Then
        daterow = srchRng.Row
        datecolumn = I
    End If
Next I

End With
End Sub
0 голосов
/ 10 июля 2019

Этот код должен работать:

Sub actual_cash_flow()

Dim cfdate As Date
Dim daterow As Long
Dim datecolumn As Long
Dim fnd As Range

cfdate = WorksheetFunction.EoMonth(Date, -1)

Set fnd = Worksheets("SheetName").Cells.Find(What:=cfdate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, searchformat:=False)

If Not fnd Is Nothing Then

    daterow = fnd.Row
    datecolumn = fnd.Column

End If

End Sub

Введите свое имя в коде.

Проблема была в настройке переменных, вы должны объявить их как дату при поиске даты.

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