Как установить переменную с помощью .Evaluate () - PullRequest
0 голосов
/ 22 мая 2019

Я хочу найти n-ую заполненную строку в столбце в Excel, и у меня есть формула, которая работает, когда я просто тестирую ее в реальной электронной таблице.Но я хотел бы установить это значение в макросе, используя .Evaluate().

После того, как я скажу Dim firstRow As Long, firstRow = 0

После того, как я скажу:

firstRow = ActiveWorksheet.Evaluate("SMALL(IF($K:$K<>"", ROW($K:$K) - ROW($K$1) + 1), 2)")

firstRow по-прежнему установлен на 0.

Как получить переменную, равную значению оценки формулы?

Я пробовалдобавив .Select после оценки, я попытался изменить firstRow на Variant, и они не сработали.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Вообще говоря, использование метода Evaluate со ссылками на целые столбцы весьма обременительно.Я знаю, что часто соблазнительно использовать однострочные для кода, но это обычно только ухудшает производительность.Для выполнения этой же задачи я рекомендую использовать метод Range.Find, и он будет менее подвержен ошибкам:

Sub RangeFindMethod()

    Dim rFind As Range
    Dim firstRow As Long

    With ActiveSheet.Columns("K")
        Set rFind = .Find("*", .Cells(.Cells.Count), xlValues, xlWhole, , xlNext)
        If Not rFind Is Nothing Then
            Set rFind = .FindNext(rFind)
            firstRow = rFind.Row
        Else
            firstRow = 1
        End If
    End With

    MsgBox firstRow

End Sub
2 голосов
/ 22 мая 2019

Сначала это ActiveSheet, а затем вам нужно удвоить "

firstRow = Activesheet.Evaluate("SMALL(IF($K:$K<>"""", ROW($K:$K) - ROW($K$1) + 1), 2)")

Примечания:

  1. - ROW($K$1) + 1 не требуется с полными ссылками на столбцы.
  2. Не используйте On Error Resume Next без крайней необходимости. А затем снова включите захват ошибок с помощью On Error Goto 0, чтобы как можно быстрее перехватить ошибки, чтобы их можно было устранить.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...