Remkomplekty.ru

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

Argument not optional vba ошибка

VBA «Argument Not Optional» — не уверен, как объявить переменные

Я пытаюсь написать макрос VBA, который присваивает значения определенным ячейкам, вычисляя среднее значение ячеек непосредственно над и под ним. Я запускаю его, нажав кнопку Macros на панели инструментов разработчика, затем я должен ввести имя моей функции (оно не отображается в списке) «interpprob» и выбрать выполнить. Затем я получаю всплывающее окно, в котором говорится «Argument is not optional.» я не совсем уверен, в чем проблема. Полный макрос приведен ниже. «tstep» — это массив из набора строк, которые требуют изменения некоторых значений ячеек.

1 Ответ

Исходя из ваших ожиданий, измените Function на Sub и удалите параметры.

Вы также можете вставить следующие объявления сразу после Sub :

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

Чтобы сделать эту практику обязательной, вставьте следующую директиву в первую строку файла (непосредственно перед всем остальным):

Вы также можете видеть, что тип Integer был заменен на Long , потому что целое число слишком короткое (-32768 . +32767) и непрактично для стандартного использования и хранения вокруг обоих Integer и Long не имеет реальной выгоды (и имеет штраф за производительность). Просто объявите каждую целочисленную переменную как Long .

Кредиты для предложений и исправлений идут в YowE3K и robinCTS .

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

прежде всего, я использую Visual Studio MS и использую язык C. Недавно мне нужно было объявить переменные только с одним таким же оператором, который любит макрос. Однако, как вы знаете, я могу.

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

Когда я попытался объявить массив как открытый из Main Sub() в Sheet1 , он выдает ошибку компиляции: Arrays not allowed as Public Members of object Modules. То, что я пытаюсь сделать, — это объявить.

В excel vba я пытаюсь выбрать диапазон значений, начиная с ячейки O2, (O от Oyster) до конца листа, Я стараюсь: Range(O2, Range.End(xlDown)) Но это не удается с Argument Not Optional . Что я делаю.

Я не уверен, правильно ли я поступаю сейчас, объявляя глобальные переменные. Я сделал это сам: class Addition: global a,b a,b=1,3 def __init__(self): pass def add(self): return a+b Это правильный.

Я использую Access VBA, и я продолжаю получать Compile error: Argument not optional всякий раз, когда я пытаюсь передать коллекцию в функцию. Что происходит? Private Sub btnTest_Click() Dim.

Private Sub importClipboard_Click() Dim data As Collection data = getClipboardData() . do something. End Sub Function getClipboardData() As Collection . do something. End Function Я получаю.

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

Моя цель-проверить подключение к интернету в VBA, но когда я пытаюсь вызвать url с request.open, я получаю сообщение об ошибке Argument is not optional. К сожалению, интернет-исследования не дали.

Я пытаюсь отладить этот простой раздел кода: Public Sub FunctionNotValidVarType() MsgBox VarType & VarType & is not supported. Please check spelling. End Sub

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.

Читать еще:  Ошибка 6 error

Исправление ошибки 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.

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

Thread: [RESOLVED] compile error: argument not optional

Thread Tools
Display
  • Linear Mode
  • Switch to Hybrid Mode
  • Switch to Threaded Mode

[RESOLVED] compile error: argument not optional

Hello to everyone!

I’m new to programming, and in fact I’m so new that I even need some help to start programming!!

this is the code:

Private Sub Command1_Click()

then I run it and get the message: »compile error: argument not optional»

any help would be much appreciated! thanks in advance!!

using WinXP Sp2 and Visual Basic 6 classic

Re: compile error: argument not optional

Re: compile error: argument not optional

Re: compile error: argument not optional

Re: compile error: argument not optional

It happens when I run the program!! —

and highlights the word msgbox

but that’s all the code. I swear!! — nothing else!!

Re: compile error: argument not optional

Re: compile error: argument not optional

Hack — copy and paste posted code (original) to actual code window — I’m sure you’ll find it ammusing.

loverman210: you’re using single quotes (») instead of dbl quotes («) arround the «hello»
so change what you have with this:

Re: compile error: argument not optional

Hack — copy and paste posted code (original) to actual code window — I’m sure you’ll find it ammusing.

loverman210: you’re using single quotes instead of dbl quotes»
so change what you have with this:

Re: compile error: argument not optional

Oh my god!! guys you are so right.

2 nights sleepless just for the wrong quotes.

I don’t know how to thank you!!

many many thanks again!

Re: compile error: argument not optional

You’re welcome and don’t get too excided — it’s just the beginning.

On the side note: if you don’t change default options (or settings) in your VB IDE then green means commented code that doesn’t get executed nor it is ever compiled.

Re: compile error: argument not optional

you are right! I know it’s the beginning! — have to start from somewhere, right?

again thanks for noticing the unoticeable!

Re: compile error: argument not optional

Actually it would be noticeable if different code tags were used.
We used to have the VBCODE tags but since it was a hack they were gone after the major forum upgrade few months ago.
Many of us don’t like the color schema that comes with new tags so we use ordinary CODE ones.

However, try using [HIGHLIGHT=VB] tags. Here is what your code would look like — as you can see your mistake is noticeable and stands out:

Re: compile error: argument not optional

Trust me, things like single quotes, or lack there or, commas, or lack there of, will be one of your biggest nightmares.

Читать еще:  Ошибка отсутствует vcomp110 dll

If you consider this resolved, you could help us out by pulling down the Thread Tools menu and clicking the Mark Thread Resolved menu item. That will let everyone know that you have your answer.

Thank you.

Аргументы функции на VBA

Создание функции без каких-либо аргументов

Начнем с функций, которые не имеют аргументов. В качестве примера, можете вспомнить такие стандартные функции как СЕГОДНЯ() или СЛЧИС(). Эти функции не зависят от каких либо входных параметров. Давайте тоже создадим аналогичную функцию. Например функцию, которая будет возвращать нам название текущего листа (нам ведь не нужны никакие параметры в данном случае. Код функции приведен ниже:

Как видите скобки мы оставили пустые, указали наименование функции НазваниеЛиста и задали тип возвращаемых значение As String (Текстовое значение).

Единственный нюанс данной функции состоит в том, что она автоматически не изменит значение, если Вы переименуете лист. К сожалению Excel запускает процесс пересчета когда меняется какой либо аргумент, но тут их нет и функций «не знает» когда пересчитывать значение. Принудительно можно запустить пересчет книги с помощью сочетания клавиш Ctrl + Alt + F9. Чтобы заставить формулу пересчитываться всякий раз, когда происходит изменение на листе, нужно указать еще одно строку кода.

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

Создание функции с одним аргументом

В предыдущей статье Создаем свою первую функцию в Excel мы достаточно подробно рассказали о создании функции с одним аргументом. Поэтому приведем еще один пример простой но полезной функции и перейдем к следующему пункту.

Наверняка вы сталкивались с тем, что необходимо написать огромную формулу, проверяющую несколько условий с помощью функций ЕСЛИ. Получалось что-то вроде нескольких вложенных функций ЕСЛИ. Давайте попробуем решить эту задачу путем создания пользовательской функции. Например нам необходимо рассчитать значение премии в зависти от процента выполненного плана. Если план выполнен менее чем 50% нам ничего не платят. Если от 50 до 75 процентов, то дают премию 5 000 рублей. Если от 75 до 90% — 15 000 рублей. От 90 до 100% — 25 000 рублей. И если более 100%, то 50 000 тысяч. Давайте писать код:

Смысл кода думаю ясен, конструкция Select Case проверяет условие и выдает результат если условие истинно.

А теперь применим функцию и посмотрим как из сложной функции мы сделали короткую, а самое главное понятную для других пользователей функцию.

Создание функции с несколькими аргументами

Сейчас научимся создавать функции с несколькими переменными и заодно создадим достаточно полезную для работы функцию. Наверняка у всех была похожая задача. Нужно из ячейки, которая содержит ФИО извлечь, к примеру только имя или отчество. Можно обойтись набором стандартных функций, но сложновато. Подобно функциям листа, вы можете создавать функции в VBA, которые принимают несколько аргументов.

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

Когда вам необходимо использовать более одного аргумента в функции, то нужно их все перечислить в скобках через запятую. Обратите внимание, что для каждого аргумента вы можете указать тип данных. В приведенном выше примере переменная Текст была объявлена As String (как текст), а переменная Номер объявлена как Long (целое число). Если вы не укажете какой-либо тип данных, VBA считает, что тип данных Variant — этот тип переменных сам изменяет свой тип в зависимости от значения, но потребляет больше ресурсов.

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

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

Создание функции с необязательными аргументами

В Excel есть много функций, в которых некоторые аргументы являются необязательными.

Например, всем известная функция ВПР. У нее 3 обязательных аргумента и один необязательный. Он обозначается в квадратных скобках — [интервальный_просмотр].

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

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

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

Приведем пример функции с необязательными аргументами

Тут хочу обратить внимание на первую строку, а именно на:

Читать еще:  Ошибка айтюнс 1

Optional обозначает, что переменная необязательная, далее идет наименование аргумента — Прописные, далее при необходимости указывается тип данных. В нашем случае это логическая переменная Boolean. А далее? после знака равно, указывается значение по умолчанию. Если при использовании функции второй аргумент не будет указан, то переменной присвоется значение по умолчанию, в нашем случае False.

Далее в коде вы увидите строку:

Она как раз и проверяет значение необязательного аргумента. Если в качестве аргумента указано значение ИСТИНА (или 1), то функция вернет текст прописными буквами.

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

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) можно использовать переменные. Однако что произойдет с переменными после того, как они «побывают» в функции, если функция изменяет их значение? Останется ли это значение за пределами функции прежним или изменится?

Все зависит от того, как именно передаются параметры — по ссылке (по умолчанию, можно также использовать ключевое слово 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