Vba runtime error 1004 невозможно получить свойство match класса worksheetfunction

Обновлено: 07.07.2024

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

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

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

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

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

Версия Excel: 2010

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

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

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

Два момента, которые я уже пробовал, следующие:

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

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

ОТВЕТЫ

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Посмотрите на Range. это не имеет никакого смысла. Изменен диапазон от "AC8:C" до "AC8:AC" , и он отлично работает

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

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

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

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

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

версия Excel: 2010

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

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

Windows 7 (не то, что я думаю, что это было бы уместно)

два момента, которые я уже пробовал:

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

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

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

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

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

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

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

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

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

посмотрите на диапазон. это не имеет смысла. Изменен диапазон от "AC8:C" to "AC8:AC" и он будет работать отлично


Ошибка VBA 1004 - это ошибка, с которой мы сталкиваемся при выполнении кода в VBA. Он также известен как ошибка времени выполнения VBA. Когда мы работаем в VBA или на любом другом языке программирования или даже в нашей повседневной работе, мы сталкиваемся с различными видами ошибок. Иногда даже мы пропускаем один символ в коде, что приводит к тому, что весь код не работает или, возможно, весь код неверен.

Ошибки, безусловно, являются частью кода, который мы пишем. Это может быть непреднамеренным, но они существуют. Независимо от того, насколько мы профессиональны в кодировании, ошибки во время выполнения могут возникнуть где угодно. Как объяснено выше VBA 1004 Ошибка - это ошибка, которая возникает во время выполнения кода в Excel. Это также называется ошибкой приложения или объекта.

Существуют различные типы причин, по которым мы получаем VBA Runtime Error 1004 в Excel, давайте рассмотрим некоторые из них.

  • Ошибка выполнения VBA 1004: сбой метода «Диапазон» объекта «_ Global»:

Эта ошибка возникает, когда значение диапазона, которое мы ссылаемся на VBA, неверно. Он также называется метод «Диапазон» объекта «_ Global» не удалось.

  • Ошибка выполнения VBA 1004: это имя уже занято.Попробуйте другой:

Мы присваиваем одно и то же имя рабочему листу, который уже занесен другим рабочим листом.

  • Ошибка выполнения VBA 1004: невозможно получить свойство select класса Range:

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

  • Ошибка выполнения VBA 1004: сбой метода «Открыть» объекта «Книги»:

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

  • Ошибка выполнения VBA 1004: извините, мы не смогли найти:

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

Как мы узнали, могут быть разные причины, по которым мы получаем ошибку во время выполнения. Ошибка выполнения может возникнуть в любой строке кода. Нам нужно научиться обрабатывать эти ошибки, и это называется VBA Error Handling.

Пример VBA Runtime Ошибка 1004 в Excel

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

Вы можете скачать этот шаблон Excel с ошибкой VBA 1004 здесь - Шаблон Excel с ошибкой VBA 1004

Ошибка выполнения VBA 1004 - Пример № 1

Как объяснено об этой ошибке, эта ошибка возникает, когда мы ссылаемся на неверное значение именованного диапазона в VBA. Это может произойти, если мы допустим орфографическую ошибку именованного диапазона, чтобы сослаться на диапазон, который даже не существует. Чтобы продемонстрировать это, давайте сначала создадим именованный диапазон. У меня есть следующие данные здесь.


  • Давайте назовем этот заголовок таблицы как DATA .


  • Перейдите на вкладку Разработчик, нажмите на Visual Basic, чтобы открыть VB Editor.


Код:


  • Вызовите заголовок, который мы назвали следующим кодом, написанным ниже.

Код:


  • Когда мы запускаем код, мы видим в Excel, что он был выбран, поскольку мы правильно вызвали заголовок.
  • Теперь мы неправильно написали орфографию имени заголовка.

Код:


  • Запустите код еще раз, чтобы увидеть результат.

Мы получаем Excel VBA Runtime Ошибка 1004, потому что мы неправильно написали имя диапазона.

Ошибка выполнения VBA 1004 - Пример № 2

Мы получаем эту ошибку, когда пытаемся переименовать лист с именем, которое уже занято. Например, я переименовал лист 1 в « Ананд », и я постараюсь переименовать лист 2 в тот же, чтобы увидеть результат.


  • Перейдите на вкладку Разработчик, нажмите на Visual Basic, чтобы открыть VB Editor.
  • Объявите подфункцию, чтобы начать писать код.

Код:


  • Попробуйте переименовать лист 2 в Anand с помощью следующего кода ниже,

Код:


  • Запустите приведенный выше код и посмотрите результат.

Ошибка выполнения VBA 1004 - Пример № 3

Я попытаюсь добавить значение из листа 2 к переменной на листе 3. Но я не буду активировать лист 2 и посмотрю, что произойдет.

  • Перейдите на вкладку Разработчик, нажмите на Visual Basic, чтобы открыть VB Editor.
  • Объявите подфункцию, чтобы начать писать код.

Код:


  • Объявите две переменные A и B как целое число.

Код:


  • В переменной B сохраните значение A в дополнение к ячейке A1 листа 2.

Код:


  • Давайте предположим, что код работает, и используем функцию msgbox для отображения значения B.

Код:


  • Запустите код, чтобы увидеть полученный результат.

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

Ошибка выполнения VBA 1004 - Пример № 4

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

В этом примере я уже переименовал свою книгу в VBA 1004 Error.xlsm, и я попытаюсь снова открыть ее, которая уже открыта, и посмотреть, получу ли я ошибку VBA 1004.

  • Перейдите на вкладку Разработчик, нажмите на Visual Basic, чтобы открыть VB Editor.
  • Объявите подфункцию, чтобы начать писать код.

Код:


  • Объявите переменную в качестве рабочей книги.

Код:


Попробуйте открыть книгу, которую мы уже открыли, с помощью следующего кода.

Код:


Запустите приведенный выше код, чтобы увидеть результат.

Мы получаем эту ошибку, потому что мы уже открыли ту же книгу.

Ошибка выполнения VBA 1004 - Пример № 5

Мы получаем эту ошибку, когда пытаемся открыть книгу, которой не существует. Это в некоторой степени похоже на приведенную выше ошибку, поскольку VBA не может найти книгу.

  • Перейдите на вкладку Разработчик, нажмите на Visual Basic, чтобы открыть VB Editor.
  • Объявите подфункцию, чтобы начать писать код.

Код:


  • Попробуйте открыть любую книгу с помощью следующего кода,

Код:


  • Я уже удалил лист с места.
  • Запустите код, чтобы увидеть результат.

Поскольку лист не существует в данном месте, мы получаем эту ошибку.

То, что нужно запомнить

  • Всегда проверяйте на наличие орфографических ошибок.
  • Не переименовывайте несколько листов с одинаковыми именами.
  • Перед звонком по любой другой ссылке обязательно активируйте соответствующий лист.
  • Прежде чем пытаться открыть любой другой лист, убедитесь, что указан правильный путь.

Рекомендуемые статьи

Это было руководство к VBA 1004 Ошибка. Здесь мы обсудили Excel VBA Runtime Error 1004 вместе с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи -

«Ошибка во время выполнения 4 1004 ’:
Не удалось скопировать метод класса листа»

«Ошибка во время выполнения 4 1004 ’:
Ошибка приложения или объекта»


В отличие от наихудших технических проблем, причина ошибки 1004 во время выполнения в Microsoft Excel известна. Ошибка 1004 времени выполнения возникает, когда выполняемый макрос копирует исходную рабочую таблицу в рабочую книгу с определенным именем, которое вы не сохранили и не закрыли до запуска макроса. Пример такого макроса можно увидеть в следующем коде:

Поскольку причина ошибки 1004 времени выполнения в контексте Microsoft Excel известна, также как и ее разрешение. В дополнение к решению этой проблемы пользователям, затронутым ею, также доступен обходной путь, который можно использовать в случае, если решение не работает или они не находят решение приемлемым вариантом.

Решение:

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

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

Обходной путь:

Как указывалось ранее, решение этой конкретной проблемы также существует. Чтобы обойти эту проблему, достаточно просто вставить новый лист из шаблона вместо создания копии существующего листа. Если вы хотите обойти эту проблему, вот что вам нужно сделать:

  1. запуск превосходить.
  2. Создать новую рабочую книгу и удалять каждый отдельный лист содержит только один.
  3. Формат Рабочая тетрадь.
  4. Добавьте любой текст, данные и / или диаграммы, которые вы хотите иметь в шаблоне по умолчанию, на единственный лист, который теперь содержит книга.
  5. Если вы используете Excel 2003 или более раннюю версию, нажмите на файл >Сохранить как. Если вы используете Excel 2007 или более поздней версии, с другой стороны, нажмите на Microsoft Office кнопку, а затем нажмите на Сохранить как.
  6. в Имя файла: В поле введите любой желаемый шаблон.
  7. Откройте раскрывающееся меню рядом с Сохранить как тип: поле и нажмите на превосходитьШаблон (.xlt) если вы используете Excel 2003 или более раннюю версию, или превосходитьШаблон (.xltx) если вы используете Excel 2007 или более поздней версии, чтобы выбрать его.
  8. Нажмите на Сохранить.
  9. После того, как вы успешно создали шаблон, вы можете вставить его программно, используя следующую строку кода:
    Sheets.Add Type: =дорожка\имя файла

Замечания: В строке кода, описанной выше, путь \ имя_файла Необходимо заменить полным путем (включая полное имя файла) для местоположения шаблона листа, который вы только что создали.

То , что я пытаюсь сделать, основано на ячейке oSht_Input.Cells(Rows, 7) , я хочу найти совпадение в столбце а другого листа (periodSheet) и получить соответствующее значение на основе данного столбца.

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

Ошибка времени выполнения '1004': не удалось получить свойство Match класса WorksheetFunction.

Что я делаю не так?

Я немного запутался в использовании Application.Match и Application.WorksheetFunction.Match .

Правка: решил добавить немного больше контекста для лучшего разъяснения на основе первоначальной обратной связи.

dateCell будет принимать значение ячейки, которое определенно является значением даты. Колонка а в periodSheet содержит EVERY единственную дату с 1 января 2000 года по 31 декабря 2020 года, по существу охватывающую все возможные даты. Вы можете смело предположить, что значение от dateCell будет находиться в этом диапазоне 20 лет.

This is the oSht_Input, where Column G is the date

1. Это oSht_Input, где столбец G - дата

This is the PeriodMetadata sheet, where I am trying to match to Column A (which contains every single date of year 2000-2020 before finding the value based on the .index function

2. это лист PeriodMetadata, где я пытаюсь сопоставить его со столбцом А (который содержит каждую отдельную дату 2000-2020 годов, прежде чем найти значение на основе функции .index.

2 ответа

Я пытаюсь выполнить поиск соответствия между двумя книгами, чтобы увидеть, находится ли имя, введенное в Wbook1, в столбце А Wbook2. Например. У меня есть name1 в ячейке D4 workbook1. Затем я хочу, чтобы макрос искал столбец A workbook2, чтобы найти, где находится name1. Я не беспокоюсь о том.

Я пытаюсь разработать форму для отслеживания счетов-фактур по мере их поступления. В форме будет combobox, на который я могу нажать и выбрать номер поставщика. Я хочу, чтобы textbox автоматически заполнялся на основе номера поставщика, выбранного из combobox. Вот что у меня есть до сих пор.

Вместо этого используйте CLng() или .Value2 при работе с датами:

Это происходит из - за того, что Excel хранит даты в виде чисел-то, что иногда приходится учитывать в VBA

Когда совпадение не найдено, вы получаете ошибку.

В приведенном ниже примере, например,

работает нормально, возвращая "4", как и ожидалось, но

выдает ошибку "Unable to get the Match property of the WorksheetFunction class".

enter image description here

Также смотрите Эту заметку о том, как Worksheetfunction и Application ведут себя по-разному.

Похожие вопросы:

Я получаю эту ошибку в VBA, когда пытаюсь получить коэффициент корреляции двух массивов Arr1 и Arr2 Dim arr1() As Variant Dim arr2() As Variant arr1 and arr2 are initialized in the function. Dim.

Следующий код: For i = startRow To startRow + (nRows - 1) Set lookUp = Range(col & i) Range(I & i) = IIf(WorksheetFunction.lookUp(lookUp, Sheets(P&C curves).Columns(A)) = lookUp, 1, 0).

Я пытаюсь выполнить поиск соответствия между двумя книгами, чтобы увидеть, находится ли имя, введенное в Wbook1, в столбце А Wbook2. Например. У меня есть name1 в ячейке D4 workbook1. Затем я.

Я пытаюсь разработать форму для отслеживания счетов-фактур по мере их поступления. В форме будет combobox, на который я могу нажать и выбрать номер поставщика. Я хочу, чтобы textbox автоматически.

Я новичок в использовании vba, пытаясь сделать простую программу, у нее есть listbox, как только пользователь нажимает на элемент из списка, другая информация об этом элементе должна появиться в.

я пытаюсь сделать так, чтобы оба comboboxes(valuerFirmCB, valuerNameCB) были динамичными, то есть valuerNameCB будет отображать только имена соответственно фирме. Это работает, но, однако, я получил.

У меня есть следующий код, но я получаю ошибку: unable to get the match property of the worksheetfunction class кто - нибудь может мне помочь? Sub ASub() 'This part is for the Fully Dynamic and.

У меня есть ошибка на vlookup, ошибка говорит: не удалось получить свойство vlookup класса worksheetfunction. это мой код: Private Sub Yes_Click() Dim input_value As Variant Dim rg As Range Set rg =.

каждый раз, когда я запускаю код, возникает ошибка Ошибка времени выполнения 1004: не удалось получить свойство HLookup класса worksheetfunction когда я делаю hlookup в листе excel с теми же.

Читайте также: