Error 450 vba excel

Im writing an excel sheet for work that when I press a button a loop runs through some rows and will edit some data if they’re empty but I cant seem to get the macro to run as it keeps returning the 450 error.
heres a simplified version of the code that wont run.(starts at option explicit ends at end sub formatting is acting up when I paste in)

Option Explicit

Sub Copypaste()
'
' Copypaste Macro
'
' Keyboard Shortcut: Ctrl+p
'
    Dim i As Integer, j As Integer
    Dim ls As Boolean

    i = 2
    j = 24
    ls = True

    Do While ls = True

        If IsEmpty(i, j) = True Then
            Cells(i, j).Value = 10
            ls = False
        Else
            ls = True
        End If

        i = i + 1
        j = j + 1

        If i > 10 Then
            ls = False
        End If
    Loop
End Sub

Ive searched loads of threads and I cant seem to find anyone with the same issue as mine as any fixes ive made don’t seem to be the problem.

New to macro as in discovered it today so could be a case of multiple errors

Community's user avatar

asked Feb 29, 2016 at 17:27

Naish O'Loughlin's user avatar

0

You need to change

If IsEmpty(i, j) = True Then

to

If IsEmpty(Cells(i, j).Value2) = True Then

answered Feb 29, 2016 at 17:33

Ralph's user avatar

4

Содержание

  1. Неправильное количество аргументов (ошибка 450)
  2. Поддержка и обратная связь
  3. Wrong number of arguments (Error 450)
  4. Support and feedback
  5. Как исправить время выполнения Ошибка 450 Неверное количество аргументов или недопустимое присвоение свойств
  6. Ошибки в макросе
  7. Краткое руководство по обработке ошибок
  8. Введение
  9. Ошибки VBA
  10. Заявление об ошибке
  11. Err объект
  12. Логирование
  13. Другие элементы, связанные с ошибками
  14. Простая стратегия обработки ошибок
  15. Полная стратегия обработки ошибок

Неправильное количество аргументов (ошибка 450)

Число аргументов процедуры должно совпадать с числом параметров в объявлении процедуры. Эта ошибка имеет следующие причины и способы решения:

Число аргументов при вызове процедуры не совпадает с числом ее обязательных аргументов. Сверьте список аргументов вызова с объявлением или определением процедуры.

Указан индекс элемента, не являющийся частью массива элементов управления.

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

Совершена попытка присваивания значения свойству, открытому только для чтения, или свойству, для которого существует процедура Property Let.

Назначение значения свойству аналогично передаче значения в качестве аргумента процедуре Property Let объекта. Правильно определите процедуру Property Let ; Он должен иметь на один аргумент больше, чем соответствующая процедура Property Get . Если свойство предназначено только для чтения, вы не можете присвоить ему значение.

Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Wrong number of arguments (Error 450)

The number of arguments to a procedure must match the number of parameters in the procedure’s definition. This error has the following causes and solutions:

The number of arguments in the call to the procedure wasn’t the same as the number of required arguments expected by the procedure. Check the argument list in the call against the procedure declaration or definition.

You specified an index for a control that isn’t part of a control array.

The index specification is interpreted as an argument but neither an index nor an argument is expected, so the error occurs. Remove the index specification, or follow the procedure for creating a control array. Set the Index property to a nonzero value in the control’s property sheet or property window at design time.

You tried to assign a value to a read-only property, or you tried to assign a value to a property for which no Property Let procedure exists.

Assigning a value to a property is the same as passing the value as an argument to the object’s Property Let procedure. Properly define the Property Let procedure; it must have one more argument than the corresponding Property Get procedure. If the property is meant to be read-only, you can’t assign a value to it.

For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Как исправить время выполнения Ошибка 450 Неверное количество аргументов или недопустимое присвоение свойств

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

Информация об ошибке

Имя ошибки: Неверное количество аргументов или недопустимое присвоение свойств
Номер ошибки: Ошибка 450
Описание: Количество аргументов процедуры должно соответствовать количеству параметров в определении процедуры.
Программное обеспечение: Windows
Разработчик: Microsoft

Этот инструмент исправления может устранить такие распространенные компьютерные ошибки, как BSODs, зависание системы и сбои. Он может заменить отсутствующие файлы операционной системы и библиотеки DLL, удалить вредоносное ПО и устранить вызванные им повреждения, а также оптимизировать ваш компьютер для максимальной производительности.

О программе Runtime Ошибка 450

Время выполнения Ошибка 450 происходит, когда Windows дает сбой или падает во время запуска, отсюда и название. Это не обязательно означает, что код был каким-то образом поврежден, просто он не сработал во время выполнения. Такая ошибка появляется на экране в виде раздражающего уведомления, если ее не устранить. Вот симптомы, причины и способы устранения проблемы.

Определения (Бета)

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

  • Определение — общий тег для тем, содержащий определения.
  • Соответствие — концепция программирования о поиске результатов на основе некоторого поиск
  • Параметры . Параметры — это тип переменной, используемый в подпрограмме для ссылки на данные, предоставленные в качестве входных для подпрограммы.
  • Процедура — Процедура — это подпрограмма, которая не возвращает значение.
  • Свойство — Свойство в некоторых объектно-ориентированных языках программирования представляет собой особый вид члена класса , промежуточное звено между полем или элементом данных и методом
  • Назначение — процесс установки или повторной установки значения, хранящегося в местах хранения, обозначенных именем переменной.
  • Число . Число — это математический объект, используемый для подсчета, измерения и маркировки.
Симптомы Ошибка 450 — Неверное количество аргументов или недопустимое присвоение свойств

Ошибки времени выполнения происходят без предупреждения. Сообщение об ошибке может появиться на экране при любом запуске %программы%. Фактически, сообщение об ошибке или другое диалоговое окно может появляться снова и снова, если не принять меры на ранней стадии.

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

(Неверное количество аргументов или недопустимое присвоение свойств) Repair Tool»/>
(Только для примера)

Причины Неверное количество аргументов или недопустимое присвоение свойств — Ошибка 450

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

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

Методы исправления

Ошибки времени выполнения могут быть раздражающими и постоянными, но это не совсем безнадежно, существует возможность ремонта. Вот способы сделать это.

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

Источник

Ошибки в макросе

Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.

Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.

Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.

Краткое руководство по обработке ошибок

Пункт Описание
On Error Goto 0 При возникновении ошибки код останавливается и отображает
ошибку.
On Error Resume Next Игнорирует ошибку и
продолжает.
On Error Goto [Label] Переход к определенной метке при возникновении ошибки.
Это позволяет нам справиться
с ошибкой.
Err Object При возникновении ошибки
информация об ошибке
сохраняется здесь.
Err.Number Номер ошибки.
(Полезно, только если вам
нужно проверить, произошла ли конкретная ошибка.)
Err.Description Содержит текст ошибки.
Err.Source Вы можете заполнить это, когда используете Err.Raise.
Err.Raise Функция, которая позволяет
генерировать вашу собственную ошибку.
Error Function Возвращает текст ошибки из
номера ошибки.
Вышло из употребления.
Error Statement Имитирует ошибку. Вместо этого используйте Err.Raise.

Введение

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

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

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

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

Ошибки VBA

В VBA есть три типа ошибок

  1. Синтаксис
  2. Компиляция
  3. Время выполнения

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

Синтаксические ошибки

Если вы использовали VBA в течение какого-то времени, вы увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return, VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.

Например, если вы введете If и забудете ключевое слово Then, VBA отобразит следующее сообщение об ошибке.

Некоторые примеры синтаксических ошибок

Синтаксические ошибки относятся только к одной строке. Они возникают, когда синтаксис одной строки неверен.

Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.

Ошибки компиляции

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

Примеры ошибок компиляции:

  • Оператор If без соответствующего оператора End If
  • For без Next
  • Select без End Select
  • Вызов Sub или Function, которые не существуют
  • Вызов Sub или Function с неверными параметрами
  • Присвоение Sub или Function того же имени, что и для модуля
  • Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)

На следующем снимке экрана показана ошибка компиляции, которая возникает, когда цикл For не имеет соответствующего оператора Next.

Использование Debug-> Compile

Чтобы найти ошибки компиляции, мы используем Debug-> Compile VBA Project из меню Visual Basic.

Когда вы выбираете Debug-> Compile, VBA отображает первую обнаруженную ошибку.

Когда эта ошибка исправлена, вы можете снова запустить Compile, и VBA найдет следующую ошибку.

Debug-> Compile также будет включать синтаксические ошибки в поиск, что очень полезно.

Если ошибок не осталось и вы запускаете Debug-> Compile, может показаться, что ничего не произошло. Однако «Компиляция» будет недоступна в меню «Отладка». Это означает, что ваше приложение не имеет ошибок компиляции в текущий момент.

Debug->Compile Error Summary

Debug-> Compile находит ошибки компиляции (проекта).

Он также найдет синтаксические ошибки.

Он находит одну ошибку каждый раз, когда вы ее используете.

Если нет ошибок компиляции, оставленная опция Компиляция будет отображаться серым цветом в меню.

Debug-> Compile Usage

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

Если вы не запускаете Debug-> Compile, то VBA может обнаружить ошибки компиляции при запуске. Их не следует путать с ошибками времени выполнения.

Ошибки во время выполнения

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

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

Другие примеры ошибок времени выполнения

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

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

Ожидаемые и неожиданные ошибки

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

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

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

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

Ошибки времени выполнения, которые не являются ошибками VBA

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

Позвольте мне объяснить это на примере. Представьте, что у вас есть приложение, которое требует, чтобы вы добавили значения в переменные a и b

Допустим, вы по ошибке используете звездочку вместо знака плюс

Это не ошибка VBA. Ваш синтаксис кода является совершенно законным. Однако, с вашей точки зрения, это ошибка.

Эти ошибки не могут быть обработаны с помощью обработки ошибок, поскольку они, очевидно, не будут генерировать никаких ошибок. Вы можете справиться с этими ошибками, используя Unit Testing and Assertions.

Заявление об ошибке

Как мы видели, есть два способа обработки ошибок во время выполнения

  1. Ожидаемые ошибки — напишите конкретный код для их обработки.
  2. Неожиданные ошибки — используйте операторы обработки ошибок VBA для их обработки.

Оператор VBA On Error используется для обработки ошибок. Этот оператор выполняет некоторые действия при возникновении ошибки во время выполнения.

Есть четыре различных способа использовать это утверждение

  1. On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
  2. On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
  3. On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
  4. On Error Goto -1 — очищает текущую ошибку.

Давайте посмотрим на каждое из этих утверждений по очереди.

On Error Goto 0

Это поведение по умолчанию VBA. Другими словами, если вы не используете On Error, это поведение вы увидите.

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

Давайте посмотрим на пример. В следующем коде мы не использовали строку On Error, поэтому VBA будет использовать поведение On Error Goto 0 по умолчанию.

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

Когда появляется ошибка, вы можете выбрать End или Debug

Если вы выберете Конец, то приложение просто остановится.

Если вы выберете Отладить, приложение остановится на строке ошибки, как показано на скриншоте ниже.

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

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

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

Используя On Error Goto [label], мы можем дать пользователю более контролируемое сообщение об ошибке. Это также предотвращает остановку приложения. Мы можем заставить приложение работать предопределенным образом.

On Error Resume Next

Использование On Error Resume Next указывает VBA игнорировать ошибку и продолжать работу.

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

Если мы добавим Resume Next к нашему примеру Sub, то VBA проигнорирует ошибку деления на ноль

Это не очень хорошая идея, чтобы сделать это. Если вы игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может повлиять на приложение несколькими способами. Вы можете получить неверные данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что вы подавили ошибку.

Приведенный ниже код является примером использования Resume Next.

В этом коде мы проверяем, доступен ли Microsoft Outlook на компьютере. Все, что мы хотим знать — это доступно или нет. Нас не интересует конкретная ошибка.

В приведенном выше коде мы продолжаем, если есть ошибка. Затем в следующей строке мы проверяем значение переменной Outlook. Если произошла ошибка, тогда значение этой переменной будет установлено равным Nothing.

Это пример того, когда Резюме может быть полезным. Дело в том, что, хотя мы используем Resume, мы все равно проверяем наличие ошибки. Подавляющее большинство времени вам не нужно будет использовать Resume.

On Error Goto [label]

Вот как мы используем обработку ошибок в VBA. Это эквивалент функциональности Try and Catch, которую вы видите на таких языках, как C # и Java.

При возникновении ошибки вы отправляете ошибку на определенный ярлык. Обычно это внизу саба.

Давайте применим это к подводной лодке, которую мы использовали

Снимок экрана ниже показывает, что происходит при возникновении ошибки.

VBA переходит на метку eh, потому что мы указали это в строке «Перейти к ошибке».

Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.

Примечание 2: Когда возникает ошибка при использовании On Error Goto [label], обработка ошибок возвращается к поведению по умолчанию, т.е. код остановится на строке с ошибкой и отобразит сообщение об ошибке. См. Следующий раздел для получения дополнительной информации об этом.

On Error Goto -1

Это утверждение отличается от других трех. Он используется для очистки текущей ошибки, а не для настройки конкретного поведения.

При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.

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

Посмотрите на код ниже. Первая ошибка приведет к переходу кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.

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

В коде ниже мы добавили строку

после того как мы поймаем первую ошибку.

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

Для устранения ошибки мы используем On Error Goto -1. Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам нужно установить ее снова.

В приведенном ниже коде мы добавляем эту строку, и вторая ошибка теперь приведет к переходу кода на метку eh_other.

Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.

Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.

Использование On Error

Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:

  • Остановитесь и отобразите ошибку.
  • Игнорируйте ошибку и продолжайте.
  • Перейти к определенной строке.

VBA всегда будет настроен на одно из этих действий. Когда вы используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.

В следующем подпункте VBA изменяет поведение ошибки каждый раз, когда мы используем оператор On Error

Err объект

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

При возникновении ошибки времени выполнения VBA автоматически заполняет объект Err деталями.

Приведенный ниже код выведет «Error Number: 13 Type Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в длинное целое число.

Err.Description предоставляет подробную информацию об ошибке, которая происходит. Это текст, который вы обычно видите, когда возникает ошибка, например, «Несоответствие типов»

Err.Number — это идентификационный номер ошибки, например, номер ошибки для «Несоответствие типов» — 13. Единственное время, когда вам действительно нужно это, если вы проверяете, что произошла конкретная ошибка, и это необходимо только в редких случаях.

Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.

Получение номера строки

Функция Erl используется для возврата номера строки, где произошла ошибка.

Это часто вызывает путаницу. В следующем коде Erl вернет ноль.

Это потому, что нет номеров строк. Большинство людей не понимают этого, но VBA позволяет вам иметь номера строк.

Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.

Добавление номеров строк в код вручную затруднительно. Однако есть инструменты, которые позволят вам легко добавлять и удалять номера строк в подпрограмме.

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

Использование Err.Raise

Err.Raise позволяет нам создавать ошибки. Мы можем использовать его для создания пользовательских ошибок для нашего приложения, что очень полезно. Это эквивалент оператора Throw в Java C #.

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

Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером, например

Использование Err.Clear

Err.Clear используется для очистки текста и чисел из объекта Err.Object. Другими словами, он очищает описание и номер.

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

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

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

Примечание: Err.Clear сбрасывает текст и цифры в объекте ошибки, но не очищает ошибку — см. On Error Goto -1 для получения дополнительной информации об очистке фактической ошибки.

Логирование

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

Код ниже показывает очень простую процедуру регистрации

Вы можете использовать это так:

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

Ниже приведен пример регистрации. То, как вы реализуете журналирование, зависит от характера приложения и его полезности.

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

Другие элементы, связанные с ошибками

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

Функция ошибки

Функция Error используется для печати описания ошибки с заданным номером ошибки. Он включен в VBA для обеспечения обратной совместимости и не нужен, поскольку вместо него можно использовать описание Err.Description.

Ниже приведены некоторые примеры

Заявление об ошибке

Заявление об ошибке позволяет имитировать ошибку. Он включен в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.

В следующем коде мы моделируем ошибку «Разделить на ноль».

Это утверждение включено в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.

Простая стратегия обработки ошибок

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

Основная реализация

Это простой обзор нашей стратегии

  1. Поместите строку On Error Goto Label в начале нашего верхнего Sub.
  2. Поместите Label у обработки ошибок в конце нашего верхнего
    Sub.
  3. Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
  4. Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
  5. В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.

На следующем рисунке показан обзор того, как это выглядит

Следующий код показывает простую реализацию этой стратегии

Это хороший способ реализации обработки ошибок, потому что

  • Нам не нужно добавлять код обработки ошибок в каждую подпрограмму.
  • Если возникает ошибка, то VBA корректно завершает работу приложения.

Полная стратегия обработки ошибок

Стратегия выше имеет один недостаток. Он не сообщает вам, где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы должны сделать это сами.

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

Целью этой стратегии является предоставление вам стека * и номера строки в случае возникновения ошибки.

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

Это наша стратегия

  1. Разместите обработку ошибок во всех подпрограммах.
  2. Когда происходит ошибка, обработчик ошибок добавляет подробности к ошибке и вызывает ее снова.
  3. Когда ошибка достигает самой верхней подпрограммы, она отображается.

Мы просто «всплываем» из-за ошибки. Следующая диаграмма показывает простое визуальное представление о том, что происходит, когда в Sub3 возникает ошибка

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

Это две вспомогательные подводные лодки

Пример использования этой стратегии

Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.

Результат выглядит так

Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.

Примечание: вы можете получить следующую ошибку при использовании этого кода:

“Programmatic Access to Visual Basic Project is not trusted”

Чтобы решить эту проблему, выполните следующие действия.

  1. Перейдите в раздел «Разработчик» на ленте и нажмите «Macro Security», которая находится под кодом.
  2. Нажмите «Настройка макроса» в левом списке.
  3. Поставьте флажок в поле «Доверительный доступ к объектной модели проекта VBA».
  4. Нажмите Ok.

Источник

2 / 2 / 0

Регистрация: 29.09.2010

Сообщений: 207

1

28.01.2014, 01:04. Показов 19020. Ответов 17


Студворк — интернет-сервис помощи студентам

При выполнении этой программки вылетает вот такое сообщение: Wrong number of arguments or invalid property assignment. В чём проблема? Строго не судите, изучаю VBA аж второй день)

Миниатюры

Wrong number of arguments or invalid property assignment (Error 450)
 



0



98 / 49 / 0

Регистрация: 14.08.2013

Сообщений: 230

Записей в блоге: 4

28.01.2014, 07:16

2

vbCritical + vbOkOnly — вот твоя проблема, должно быть что-то одно!



0



здесь больше нет…

3372 / 1670 / 184

Регистрация: 03.02.2010

Сообщений: 1,219

28.01.2014, 10:13

3

Цитата
Сообщение от DimN
Посмотреть сообщение

vbCritical + vbOkOnly — вот твоя проблема, должно быть что-то одно!

это не так, почему не могут быть вместе красный крест и кнопка «ОК» (см. рис.)

я думаю нужно искать в Tools/References…

Missing‘и

Изображения

 



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

28.01.2014, 10:38

4

ДЕЛО в private sub
=====
в програмке параметра нет, а вызывается она откуда-то с параметром



0



2 / 2 / 0

Регистрация: 29.09.2010

Сообщений: 207

28.01.2014, 13:42

 [ТС]

5

Цитата
Сообщение от shanemac51
Посмотреть сообщение

в програмке параметра нет, а вызывается она откуда-то с параметром

Что это за параметр? И откуда он взялся, если я программку не изменял?



0



5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

28.01.2014, 14:42

6

У меня работает.
Вероятно на форме нет контрола OptionButton4 .



0



5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

28.01.2014, 14:59

7

Обратите внимание на разницу в срабатывании клика по OptionButton3 и OptionButton4 в файле примера.
Правда и тот и другой без ошибок.
Секрет в редактировании модуля в Word со вставкой неразрывных пробелов в выражение vbCritical* + *vbOkOnly и последующем импортировании модуля в файл Excel.

Миниатюры

Wrong number of arguments or invalid property assignment (Error 450)
 



0



2 / 2 / 0

Регистрация: 29.09.2010

Сообщений: 207

28.01.2014, 15:48

 [ТС]

8

KoGG, так мне что, постоянно в Ворде писать, а потом переносить в Эксель?

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



0



Апострофф

Заблокирован

28.01.2014, 15:50

9

Yoooo, если бы вы приложили файл с проблемой вместо картинки, задача давно была бы решена.



0



2 / 2 / 0

Регистрация: 29.09.2010

Сообщений: 207

28.01.2014, 15:52

 [ТС]

10

Апострофф, уже сделал)



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

28.01.2014, 16:11

11

Лучший ответ Сообщение было отмечено Yoooo как решение

Решение

Я привел пример в качестве прикола, как делать не надо, но Вас так могут надуть.
Тем не менее не оскудеет идиотами земля русская.
В Module1 приложенного файла я обнаружил процедуру:

Visual Basic
1
2
3
4
5
6
7
8
Sub MsgBox()
Da = MsgBox("Вам понравился пример?", vbYesNo, "Примерчик))")
If Da = vbYes Then
    MsgBox "Це добре", vbInformation, "Primer"
Else
    MsgBox "Це погано", vbInformation, "Primer"
End If
End Sub

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



1



2 / 2 / 0

Регистрация: 29.09.2010

Сообщений: 207

28.01.2014, 16:22

 [ТС]

12

KoGG, блиииин… Это ж надо было так ошибиться. Зато, теперь навсегда это запомню.
Спасибо за решение.



0



mrf

12 / 12 / 4

Регистрация: 16.03.2012

Сообщений: 252

28.09.2016, 11:02

13

Здравствуйте,
почему работает это:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub grey(control As IRibbonControl)
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 10921638
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

А это выводит ошибку Wrong number of arguments or invalid property assignment :

Visual Basic
1
2
3
Sub lastrowme(control As IRibbonControl)
Range("c" & Range("c1").End(xlDown).Row + 1).Select
End Sub

все же верно…. должно быть……. вроде….?



0



Shersh

Заблокирован

28.09.2016, 11:19

14

Цитата
Сообщение от Yoooo
Посмотреть сообщение

Это ж надо было так ошибиться

mrf, поищите в своем проекте, где и зачем вы переопределили Range?
(можно попробовать ПКМ на этом слове -> Definition)



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

28.09.2016, 11:32

15

mrf первый фрагмент работает, потому что там нет действия .Select и сравнивать его со 2-м — бессмысленно.

Если в столбце С ничего нет, то строка

Visual Basic
1
Range("c" & Range("c1").End(xlDown).Row + 1).Select

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

Если нет ни одной открытой книги — ошибка, негде взять Range, нет активного листа.

В обоих случаях это «Application-degined or object-defined error» (Офис 2010)



0



mrf

12 / 12 / 4

Регистрация: 16.03.2012

Сообщений: 252

28.09.2016, 11:43

16

да вроде нигде…
попробывал иначе:
модуль риббона:

Visual Basic
1
2
3
Sub lastrowme(control As IRibbonControl)
lastrow
End Sub

другой модуль:

Visual Basic
1
2
3
Sub lastrow
Range("c" & Range("c1").End(xlDown).Row + 1).Select
End Sub

так вот lastrow отдельно работает, и все ок даже на сочетание клавиш, а в связке с риббоном- нет..

На сколько понимаю, если проблема с RANGE, то не работало бы и в др. мете.. или не так?

Добавлено через 1 минуту
Когг, да есть все И лист и книга и строчки..
С риббона не работает, а отдельно работает… И так с половиной рибонна сейчас у меня..
Половина запускается, а половина — нет..



0



Shersh

Заблокирован

28.09.2016, 11:51

17

Попробуйте заменить

Цитата
Сообщение от mrf
Посмотреть сообщение

Range

на Excel.Range?



0



12 / 12 / 4

Регистрация: 16.03.2012

Сообщений: 252

28.09.2016, 12:49

18

не работает…

Добавлено через 50 минут
вроде нашел ошибку. Если есть 2 идентичных макроса по содержанию (хоть и с разными названиями и на разных листах), один из которых с control As IRibbonControl, а второй -нет , то не работает макрос с риббона.
вот, например, был макрос lastrowme (As IRibbonControl) с текстом как lastrow — не работал. Удалил макрос lastrow, и сразу
lastrowme заработал. Также проверил сейчас по двум другим макросам с риббона с аналогичной проблемой — проблема ушла.
Теперь придется что-то думать о переделке, т.к. один макрос с риббона работал, а второй с кнопки на листе делал тоже самое.. Теперь понятно, что так нельзя.



0



 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

#1

31.03.2013 18:04:39

Добрый день, форумчане.
В рабочую форму на КомбоБокс4 пытаюсь прикрутить код, ввода даты без разделителей. Взял этот код с

http://planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=47142&MID=391830#message391830

Никак не получается. Как только ввожу первую цифру в этот КомбоБокс, появляется окошко
Rin-time error 450:
wrong number of arguments or invalid property assigment

Ну и в коде желтым заливается выделенная полужирным строка

Код
Private Sub ComboBox4_Change()
 Dim DatBox As Object
 Set DatBox = Me.ActiveControl
 [B] If Len(DatBox) = 2 And Right$(DatBox, 1) = "." [/B]Then DatBox = "0" & DatBox
 If Len(DatBox) = 5 And Right$(DatBox, 1) = "." Then _
 DatBox = Left$(DatBox, 3) & "0" & Right$(DatBox, 2)
 If (Len(DatBox) = 3 Or Len(DatBox) = 6) And Right$(DatBox, 1) <> "." Then
 DatBox = Left$(DatBox, Len(DatBox) - 1) & "." & Right$(DatBox, 1)
 End If
 Set DatBox = Nothing
 '
 Call CheckCombo1
 '
End Sub

Пример после максимального урезания весит 215КБ. Попробую вложить. Может пройдёт…
Подскажите, пожалуйста, в чем может быть проблема?

Не прошло. В следующем посте выложу полный код на форму.

Изменено: iam196802.04.2013 03:15:20

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

#2

31.03.2013 18:09:13

Скрытый текст

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

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

Я сам — дурнее всякого примера! …

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Если уж и показывать код, то ведь можно его прицепить в txt-файле…
А файл почему большой? — скорее всего пытаетесь прикрепить свой рабочий файл, вместо того, чтобы создать МАЛЕНЬКИЙ файл-пример с аналогичной задачей.

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

Простите. Слепил новый файл. Прикладываю.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Да, уж… проблема с вводом даты в ОДИН КомбоБокс, а в «маленьком» файле форма на весь экран…

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

Так мне и надо «на весь экран». Вернее не мне , а регистратору.
Да и поудалял большую часть кода, не имеющую отношения к вопросу.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Понятно, что Вам НЕ понятно ))
Попробую ещё раз: у Вас есть проблема всего с одним контролом (кстати, почему КомбоБокс, а не ТекстБокс?) — не получается ввести в него дату в нужном формате. Попробуйте мне объяснить — зачем всем тем, кто захочет Вам помочь, все остальные поля ввода? Почему бы не создать действительно маленький файл с маленькой формой и показать в ней неработающий код? Не цеплять рабочую форму, а только необходимое?

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

Я очень слабо разбираюсь в VBA, и мне не хотелось бы создать ситуацию, когда я чрезмерно урежу пример, кто-то потратит время на урезанный пример, даст ответ на мой вопрос на этом примере, а потом окажется, что пример ЧРЕЗМЕРНО сокращён и в нём не хватает какой-то существенной «мелочи». И придется вновь разворачивать тему и проходить всё заново.

Изменено: iam196831.03.2013 19:16:06

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#10

31.03.2013 19:46:10

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

Код
Set DatBox = Me.ActiveControl

было введено для оформления кода в виде функций с вызовом данной функции по нажатию любой кнопки.
У вас ActiveControl — это Frame1. Соответственно код не работает.
Более того, этот код предназначался для TextBox, и с комбо не тестировался.
Часть процедур вытащена из общего модуля в модуль формы.
Замените в оригинале все DatBox на нужный контрол и удалите

Код
Set DatBox = Me.ActiveControl

Должно заработать.
Для каждого контрола должно быть три процедуры Change, Exit и KeyPress.
Вариант 1 — под форму, без общего модуля.

PS для фрейма можно так

Код
Set DatBox = Me.ActiveControl.ActiveControl

Прикрепленные файлы

  • Контроль ввода данных1.xls (90 КБ)

Изменено: RAN31.03.2013 19:57:50

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

То есть, заменяю Combo с датами на Text, удаляю указанные Вами строки. Пробуем. Спасибо. Пошёл.

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

#12

31.03.2013 20:52:17

В форме и коде заменил СВ4 на TextBox7.
В коде заменил DatBox на TextBox7.
Убрал (в одном месте) Set DatBox = Me.ActiveControl.

Получилось:

Скрытый текст

Что делать?

Изменено: iam196802.04.2013 03:17:54

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#13

31.03.2013 20:54:26

Цитата
iam1968 пишет:
ambiguus name defected: TextBox7_KeyPress

Значит есть ЕЩЁ процедура с таким же именем, а это недопустимо.

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Собственно вот они:
Private Sub TextBox7_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox7.MaxLength = 10
KeyAscii = TextBox7_KeyPress(KeyAscii)
End Sub
Function TextBox7_KeyPress(ByVal KeyAsci As Integer)
Select Case KeyAsci
Case 48 To 57: TextBox7_KeyPress = KeyAsci
Case 44 To 47, 58: TextBox7_KeyPress = 46
Case Else: TextBox7_KeyPress = 0
End Select
End Function

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

iam1968

Пользователь

Сообщений: 184
Регистрация: 12.02.2013

#15

31.03.2013 23:23:04

Получилось!

Комбобокс в форме был заменен на TextBox7.
Далее в коде DatBox был заменен на TextBox7 (не везде). Сейчас нет времени. Наверное замену DatBox на TextBox7 надо будет продолжить.

Скрытый текст

Всем спасибо. Доброй ночи.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#16

02.04.2013 03:20:24

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

I am getting a Run Time Error 450 when I try to reference a value in a range directly, but if I use an intermediate variable it works. I do not understand why so I am worried I will get the error again at some point in the future without knowing why.

I have tried using a With … End With block and it still does not work when I reference the range directly.

This code gives the error

Public Sub Test_PT()
Dim lol As String

    lol = Worksheets(1).PivotTables("PivotTable2").RowRange(2, 1).Value
    MsgBox (lol)

End Sub

While this code works fine

Public Sub Test_PT()
Dim lol As String
Dim rng As Range

    Set rng = Worksheets(1).PivotTables("PivotTable2").RowRange
    lol = rng(2, 1).Value

    MsgBox (lol)

End Sub

I do not know why it works in the 2nd code block but not in the first. I have tried variations of which level to set an intermediate variable. If I create a pivot table variable and set this appropriately, the code runs fine, but if I create a worksheet variable and try to reference the same range using the worksheet variable it does not work.

While I can get this chunk of code working by using an intermediate variable, I really want to understand WHY I need to do this in case it comes up in other contexts.

Понравилась статья? Поделить с друзьями:
  • Error 2023 vba excel
  • Erin daniels the l word
  • Ercola feat daniella every word
  • Er est word endings
  • Equivalent word for love