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
asked Feb 29, 2016 at 17:27
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
4
Содержание
- Неправильное количество аргументов (ошибка 450)
- Поддержка и обратная связь
- Wrong number of arguments (Error 450)
- Support and feedback
- Как исправить время выполнения Ошибка 450 Неверное количество аргументов или недопустимое присвоение свойств
- Ошибки в макросе
- Краткое руководство по обработке ошибок
- Введение
- Ошибки VBA
- Заявление об ошибке
- Err объект
- Логирование
- Другие элементы, связанные с ошибками
- Простая стратегия обработки ошибок
- Полная стратегия обработки ошибок
Неправильное количество аргументов (ошибка 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 есть три типа ошибок
- Синтаксис
- Компиляция
- Время выполнения
Мы используем обработку ошибок для устранения ошибок во время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было ясно, что такое ошибка во время выполнения.
Синтаксические ошибки
Если вы использовали 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.
Заявление об ошибке
Как мы видели, есть два способа обработки ошибок во время выполнения
- Ожидаемые ошибки — напишите конкретный код для их обработки.
- Неожиданные ошибки — используйте операторы обработки ошибок VBA для их обработки.
Оператор VBA On Error используется для обработки ошибок. Этот оператор выполняет некоторые действия при возникновении ошибки во время выполнения.
Есть четыре различных способа использовать это утверждение
- On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
- On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
- On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
- 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. В этом разделе я покажу вам, как реализовать простую стратегию обработки ошибок, которую вы можете использовать во всех своих приложениях.
Основная реализация
Это простой обзор нашей стратегии
- Поместите строку On Error Goto Label в начале нашего верхнего Sub.
- Поместите Label у обработки ошибок в конце нашего верхнего
Sub. - Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
- Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
- В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.
На следующем рисунке показан обзор того, как это выглядит
Следующий код показывает простую реализацию этой стратегии
Это хороший способ реализации обработки ошибок, потому что
- Нам не нужно добавлять код обработки ошибок в каждую подпрограмму.
- Если возникает ошибка, то VBA корректно завершает работу приложения.
Полная стратегия обработки ошибок
Стратегия выше имеет один недостаток. Он не сообщает вам, где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы должны сделать это сами.
В этом разделе я собираюсь представить более полную стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.
Целью этой стратегии является предоставление вам стека * и номера строки в случае возникновения ошибки.
* Стек — это список вспомогательных функций, которые использовались в данный момент при возникновении ошибки.
Это наша стратегия
- Разместите обработку ошибок во всех подпрограммах.
- Когда происходит ошибка, обработчик ошибок добавляет подробности к ошибке и вызывает ее снова.
- Когда ошибка достигает самой верхней подпрограммы, она отображается.
Мы просто «всплываем» из-за ошибки. Следующая диаграмма показывает простое визуальное представление о том, что происходит, когда в Sub3 возникает ошибка
Единственная грязная часть этого — правильное форматирование строк. Я написал две подводные лодки, которые справляются с этим, поэтому он позаботится о вас.
Это две вспомогательные подводные лодки
Пример использования этой стратегии
Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.
Результат выглядит так
Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.
Примечание: вы можете получить следующую ошибку при использовании этого кода:
“Programmatic Access to Visual Basic Project is not trusted”
Чтобы решить эту проблему, выполните следующие действия.
- Перейдите в раздел «Разработчик» на ленте и нажмите «Macro Security», которая находится под кодом.
- Нажмите «Настройка макроса» в левом списке.
- Поставьте флажок в поле «Доверительный доступ к объектной модели проекта VBA».
- Нажмите 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 аж второй день) Миниатюры
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 |
vbCritical + vbOkOnly — вот твоя проблема, должно быть что-то одно! это не так, почему не могут быть вместе красный крест и кнопка «ОК» (см. рис.) я думаю нужно искать в Tools/References… Missing‘и Изображения
0 |
Модератор 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 |
в програмке параметра нет, а вызывается она откуда-то с параметром Что это за параметр? И откуда он взялся, если я программку не изменял?
0 |
5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
|
28.01.2014, 14:42 |
6 |
У меня работает.
0 |
5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
|
28.01.2014, 14:59 |
7 |
Обратите внимание на разницу в срабатывании клика по OptionButton3 и OptionButton4 в файле примера. Миниатюры
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 как решение Решение Я привел пример в качестве прикола, как делать не надо, но Вас так могут надуть.
Именно эта процедура и вызывает ошибку, так как нельзя называть свои процедуры, функции и переменные словами, зарезервированными в языке.
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 |
|||||||
Здравствуйте,
А это выводит ошибку Wrong number of arguments or invalid property assignment :
все же верно…. должно быть……. вроде….?
0 |
Заблокирован |
|
28.09.2016, 11:19 |
14 |
Это ж надо было так ошибиться mrf, поищите в своем проекте, где и зачем вы переопределили Range?
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
28.09.2016, 11:32 |
15 |
|||
mrf первый фрагмент работает, потому что там нет действия .Select и сравнивать его со 2-м — бессмысленно. Если в столбце С ничего нет, то строка
вызовет ошибку , так как мы пытаемся выделить строку, ниже максимального количества строк. Если нет ни одной открытой книги — ошибка, негде взять Range, нет активного листа. В обоих случаях это «Application-degined or object-defined error» (Офис 2010)
0 |
mrf 12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
||||||||
28.09.2016, 11:43 |
16 |
|||||||
да вроде нигде…
другой модуль:
так вот lastrow отдельно работает, и все ок даже на сочетание клавиш, а в связке с риббоном- нет.. На сколько понимаю, если проблема с RANGE, то не работало бы и в др. мете.. или не так? Добавлено через 1 минуту
0 |
Заблокирован |
|
28.09.2016, 11:51 |
17 |
Попробуйте заменить
Range на Excel.Range?
0 |
12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
|
28.09.2016, 12:49 |
18 |
не работает… Добавлено через 50 минут
0 |
iam1968 Пользователь Сообщений: 184 |
#1 31.03.2013 18:04:39 Добрый день, форумчане. http://planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=47142&MID=391830#message391830 Никак не получается. Как только ввожу первую цифру в этот КомбоБокс, появляется окошко Ну и в коде желтым заливается выделенная полужирным строка
Пример после максимального урезания весит 215КБ. Попробую вложить. Может пройдёт… Не прошло. В следующем посте выложу полный код на форму. Изменено: iam1968 — 02.04.2013 03:15:20 |
||
iam1968 Пользователь Сообщений: 184 |
#2 31.03.2013 18:09:13
|
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
iam1968, вот странные вы люди(день дурака завтра будет, напоминаю)! Нафиг выкладывать пятистраничный листинг без файла? Нам за Вас нарисовать файл, форму, контролы, чтоб проверить, Вам помочь? Не проще ли Вам выложить файл-пример с указанием строки, где ошибка? Нам это не надо — надо Вам. Я сам — дурнее всякого примера! … |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Если уж и показывать код, то ведь можно его прицепить в txt-файле… |
iam1968 Пользователь Сообщений: 184 |
Простите. Слепил новый файл. Прикладываю. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Да, уж… проблема с вводом даты в ОДИН КомбоБокс, а в «маленьком» файле форма на весь экран… |
iam1968 Пользователь Сообщений: 184 |
Так мне и надо «на весь экран». Вернее не мне , а регистратору. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Понятно, что Вам НЕ понятно )) |
iam1968 Пользователь Сообщений: 184 |
Я очень слабо разбираюсь в VBA, и мне не хотелось бы создать ситуацию, когда я чрезмерно урежу пример, кто-то потратит время на урезанный пример, даст ответ на мой вопрос на этом примере, а потом окажется, что пример ЧРЕЗМЕРНО сокращён и в нём не хватает какой-то существенной «мелочи». И придется вновь разворачивать тему и проходить всё заново. Изменено: iam1968 — 31.03.2013 19:16:06 |
RAN Пользователь Сообщений: 7091 |
#10 31.03.2013 19:46:10 Затрудняюсь сказать, откуда этот код в таком виде вылез, но поясняю.
было введено для оформления кода в виде функций с вызовом данной функции по нажатию любой кнопки.
Должно заработать. PS для фрейма можно так
Прикрепленные файлы
Изменено: RAN — 31.03.2013 19:57:50 |
||||||
iam1968 Пользователь Сообщений: 184 |
То есть, заменяю Combo с датами на Text, удаляю указанные Вами строки. Пробуем. Спасибо. Пошёл. |
iam1968 Пользователь Сообщений: 184 |
#12 31.03.2013 20:52:17 В форме и коде заменил СВ4 на TextBox7. Получилось:
Что делать? Изменено: iam1968 — 02.04.2013 03:17:54 |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#13 31.03.2013 20:54:26
Значит есть ЕЩЁ процедура с таким же именем, а это недопустимо. |
||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
Собственно вот они: Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
iam1968 Пользователь Сообщений: 184 |
#15 31.03.2013 23:23:04 Получилось! Комбобокс в форме был заменен на TextBox7.
Всем спасибо. Доброй ночи. |
|
vikttur Пользователь Сообщений: 47199 |
#16 02.04.2013 03:20:24 iam1968, в следующий раз код будет удален. Вместе с сообщениями! |
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.