Ошибка Excel 1004. Невозможно получить свойство класса WorksheetFunction, которое отображается непоследовательно

У меня есть функция VBA в электронной таблице, которая работает с другой электронной таблицей, открытой на более раннем этапе моего макроса. Макрос раньше работал нормально, но совсем недавно начал вызывать ошибку 1004 («Невозможно получить свойство RoundDown класса WorksheetFunction») при запуске.

Я считаю, что понимаю, чем может быть вызвана ошибка (проблема с запуском RoundDown), но я не понимаю, почему она запускается в моем макросе, а странная часть заключается в том, что когда я перехожу в режим отладки и просматриваю код в VBE, ошибка не повторяется (несмотря на то, что ничего явно не меняется).

Есть ли у кого-нибудь подобный опыт непостоянного возникновения подобной ошибки и знает ли я, что я могу сделать, чтобы ее исправить?

Я достаточно разбираюсь в VBA / Excel, но любые предложения по дальнейшим действиям по диагностике будут оценены. Мне интересно, есть ли проблема с тем, что открытая электронная таблица не готова, но я не понимаю, как это сделать.

Код здесь. Ошибка возникает в строке, отмеченной комментарием.

Public Function GetDatesA(sWorkbookname As String, sSheetname As String, sCell As String) As Variant

    Dim vDateList() As Variant
    Dim currentCell As Range
    Dim n As Long

    Set currentCell = Workbooks(sWorkbookname).Worksheets(sSheetname).Range(sCell)

    n = 0

    Do
        If Trim(currentCell.Value) = "" Then
            Exit Do
        Else
            ReDim Preserve vDateList(0 To 1, 0 To n)
            vDateList(0, n) = WorksheetFunction.RoundDown(currentCell.Value, 0) 'error occcurs on this line
            vDateList(1, n) = currentCell.Column
            'Debug.Print currentCell.Value
        End If
        Set currentCell = currentCell.Offset(0, 1)
        n = n + 1
    Loop While currentCell.Column < XL_LAST_COLUMN

    GetDatesA = vDateList

End Function

Другие подробности:

  • Версия Excel: 2010

  • Открываемый файл находится локально на моем диске C :. мой макрос находится в электронной таблице в сети

  • Формат файла для обоих файлов - .xls (например, Excel 2003) - у меня нет возможности изменить это

  • Windows 7 (не думаю, что это будет актуально)

Я уже пробовал два момента:

  • Замените другую функцию рабочего листа (например, Min (currentCell)), и это также вызывает ту же проблему.

  • Кажется, что открытие файла уже решает проблему - мне интересно, есть ли способ, которым открываемая книга (а не моя основная книга с макросом в ней) не включена для макросов, и это мешает. Но даже если это причина, я не знаю, как это обойти!

Любые идеи?


person Neil    schedule 17.05.2012    source источник
comment
Если вы вставите Debug.Print currentCell.Value непосредственно перед vDateList(0, n) = WorksheetFunction.RoundDown(currentCell.Value, 0), что вы получите? Это действительный номер?   -  person Siddharth Rout    schedule 17.05.2012
comment
Также измените WorksheetFunction.RoundDown(currentCell.Value, 0) на Application.WorksheetFunction.RoundDown(currentCell.Value, 0)   -  person Siddharth Rout    schedule 17.05.2012
comment
Спасибо! Я попробовал. Я получаю список дат (фактически числа - они отображаются как дата, если я не умножу на 1, чтобы получить базовый номер Excel, соответствующий дате). Все они определенно проходят нормально, если я прохожу по коду, но не делаю этого, если позволяю ему работать самостоятельно (когда он возвращает те же самые значения), так что, вероятно, это что-то связано с WorksheetFunction, а не с моими плохими данными. Сейчас я работаю над использованием On Error ... - кажется, что это ошибка только в первый раз, поэтому kludge может сначала выполнить произвольный вызов WorksheetFunction с помощью On Resume Next, а затем выключить его после.   -  person Neil    schedule 17.05.2012
comment
Вы пробовали мое второе предложение?   -  person Siddharth Rout    schedule 17.05.2012


Ответы (3)


Эта ошибка часто возникает, когда какой-либо аргумент, переданный функции рабочего листа, имеет неправильный тип или просто не имеет смысла.

Например, у меня возникла эта проблема при вызове WorksheetFunction.Asin с аргументом больше 1. В вашем случае я бы предположил, что currentCell.Value нечисловое значение или значение, не соответствующее параметрам вашего региона относительно чисел.

Да, сообщение об ошибке действительно вводит в заблуждение.

person André Chalella    schedule 17.08.2012
comment
Для справки: та же ошибка возникает при вызове WorksheetFunction.Ln с отрицательными значениями. - person Krøllebølle; 17.06.2014
comment
или при запросе элемента в позиции 0 в коллекции Excel на основе 1, такой как sheet.Pictures (0) - person Cel; 06.08.2014
comment
Это также происходит, когда диапазон, который вы пытаетесь транспонировать, не является цельным. Таким образом, вы не можете транспонировать диапазоны, которые сломаны - person Da Spotz; 25.10.2016
comment
Увидел это при использовании WorkSheetFunction.Min (), получил ошибку, когда я передал диапазон строк, но это сработало при передаче объекта диапазона. Спасибо! - person s2t2; 30.11.2018
comment
Или при передаче строкового аргумента, где ожидается числовое значение - person Murrah; 30.03.2020

Я получил ошибку «Невозможно получить свойство * класса WorksheetFunction» с помощью функций Transpose, MMult, MDterm и MInverse.

Мне удалось запустить свой код, поместив «Option Base 1» в раздел объявлений (перед фактическим кодом) конкретного модуля в редакторе.

Excel предполагает «Option Base 0», который добавит дополнительную строку и столбец пустых ячеек. Это приведет к возникновению ошибки, которую не сразу заметить.

person James    schedule 05.06.2014

Я сталкивался с этим раньше, и для меня это было потому, что диапазон критериев не имел смысла, как сказал Андре выше.

См. Пример формулы ниже: .Cells(11, i).Formula = Application.WorksheetFunction.CountIfs(Sheets("Sheet1").Range("AC8:C" & n), "S")

Взгляните на Range ... в этом нет смысла. Изменен диапазон с "AC8:C" на "AC8:AC", и он будет работать отлично

person user1    schedule 14.12.2016