Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Argument not optional vba ошибка

Argument not optional vba ошибка

Я пытаюсь понять это и не могу.

Я все время получаю сообщение об ошибке: «Ошибка компиляции — аргумент не является обязательным». Я поставляю аргументы, и они установлены как Необязательно!

Попытка передать строку и массив функции и подсчитать вхождения строк массива в переданной строке.

Код перестает работать в строке:

с сообщением «Ошибка компиляции: аргумент не факультативно», выделив Val в строке:

Val — это функция VBA, для которой требуется одиночный, обязательный, аргумент. Поэтому компилятор генерирует сообщение «Аргумент не факультативный», если вы не предоставляете этот аргумент. (Документация MSDN Val )

Плохая идея использовать имена функций VBA в качестве имен переменных, поэтому я бы рекомендовал, чтобы вы не использовали Val в качестве имени переменной — используйте myVal или что-то еще, что VBA еще не использовал.

Если вы действительно хотите использовать Val (и вы уверены, что вам вообще не понадобится доступ к функции Val ), вы можете использовать его как имя переменной если вы просто объявите его как таковой, например

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

как countTextInText объявлен как Integer , а Set должен использоваться только при установке переменной в качестве ссылки на объект. Так что строка должна быть

Количество и типы аргументов должны совпадать ожидалось. The number and types of arguments must match those expected. Неправильное число аргументов является либо пропущенный аргумент не является необязательным. Either there is an incorrect number of arguments, or an omitted argument is not optional. Аргумент можно опустить из-за обращения к определяемой пользователем процедуры, только если он был объявлен Optional в определении процедуры. An argument can only be omitted from a call to a user-defined procedure if it was declared Optional in the procedure definition.

Исправление ошибки To correct this error

Введите все необходимые аргументы. Supply all necessary arguments.

Убедитесь, что пропущенные аргументы являются необязательными. Make sure omitted arguments are optional. Если они отсутствуют, либо аргумента в вызове, либо объявить параметр Optional в определении. If they are not, either supply the argument in the call, or declare the parameter Optional in the definition.

Читать еще:  Ошибка system nullreferenceexception

I’m trying to figure this out and can’t.

I keep getting an error: «Compile error — Argument not optional». I am supplying the arguments and they are set as Optional!

Trying to pass a string and an array to a function and count occurrences of the array strings within the string passed.

Code stops running at the line:

with a «Compile error: Argument not optional» message highlighting the Val in the line:

2 Answers 2

Val is a VBA function which requires a single, mandatory, argument — therefore the compiler generates the message saying «Argument not optional» if you don’t provide that argument. (MSDN documentation of Val )

It is a bad idea to use VBA function names as variable names, so I would recommend you don’t use Val as a variable name — use myVal or anything else that VBA hasn’t already used.

If you really want to use Val (and you are sure that you won’t be needing to access the Val function at all), you can use it as a variable name if you simply declare it as such, e.g.

You will also have problems with your line saying

as countTextInText has been declared to be an Integer , and Set should only be used when setting a variable to be a reference to an object. So that line should be

3.8.4 Передача параметров

Передача параметров процедурам и функциям в VBA, необязательные (optional) параметры, передача по ссылке (ByRef) и по значению (ByVal), применение ссылок при передаче параметров

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

Читать еще:  Понятие архитектуры информационной системы

Function fSum (nItem1 As Integer, nItem2 As Integer)

fSum = nItem1 + nItem2

Вызов ее может выглядеть так:

В данном случае мы объявили оба параметра как обязательные, и поэтому попытка вызвать функцию без передачи ей какого-либо параметра (например, так: MsgBox (fSum(3))) приведет к ошибке «Argument not optional» — «Параметр не является необязательным». Чтобы можно было пропускать какие-то параметры, эти параметры можно сделать необязательными. Для этой цели используется ключевое слово Optional:

Function fSum (nItem1 As Integer, Optional nItem2 As Integer)

В справке по встроенным функциям VBA необязательные параметры заключаются в квадратные скобки.

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

Вызов функции с передачей параметров может выглядеть так:

nResult = fSum (3, 2)

Однако здесь есть несколько моментов, которые необходимо рассмотреть.

В нашем примере мы передаем параметры по позиции, то есть значение 3 присваивается первому параметру (nItem1), а значение 2 — второму (nItem2). Однако параметры можно передавать и по имени:

nResult = fSum (nItem 1 := 3, nItem 2 := 2)

Обратите внимание, что несмотря на то, что здесь выполняется вполне привычная операция — присвоение значений, оператор присвоения используется не совсем обычный — двоеточие со знаком равенства, как в C++. При использовании знака равенства возникнет ошибка.

Конечно, вместо явной передачи значений (как у нас — 3 и 2) можно использовать переменные. Однако что произойдет с переменными после того, как они «побывают» в функции, если функция изменяет их значение? Останется ли это значение за пределами функции прежним или изменится?

Читать еще:  Установка linux mint с флешки на ноутбук

Все зависит от того, как именно передаются параметры — по ссылке (по умолчанию, можно также использовать ключевое слово ByRef или по значению — нужно использовать ключевое слово ByVal).

Если параметры передаются по ссылке, то фактически в вызываемую процедуру передается ссылка на эту переменную в оперативной памяти. Если эту переменную в вызываемой процедуре изменить, то значение изменится и в вызывающей функции. Это — принятое в VBA поведение по умолчанию.

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

Продемонстрировать разницу можно на простом примере:

Private Sub TestProc ()

‘Объявляем переменную nPar1 и присваиваем ей значение

Dim nPar1 As Integer

‘Передаем ее как параметр nItem1 функции fSum

MsgBox (fSum(nItem1:=nPar1, nItem2:=2))

‘А теперь проверяем, что стало в нашей переменной nPar1, ‘после того, как она побывала в функции fSum:

Function fSum(nItem1 As Integer, nItem2 As Integer)

‘Используем значение переменной

fSum = nItem 1 + nItem 2

‘А затем ее меняем!

Проверьте, что будет, если поменять строку объявления функции

Function fSum(nItem1 As Integer, nItem2 As Integer)

на следующую строку :

Function fSum(byVal nItem1 As Integer, nItem2 As Integer)

Можно продемонстрировать компилятору VBA, что то, что возвращает функция, наш совершенно не интересует. Для этого достаточно не заключать ее параметры в круглые скобки. Например, в случае со встроенной функцией MsgBox это может выглядеть так:

а для нашей функции —

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

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

Ссылка на основную публикацию
Adblock
detector