Compile error argument not optional vba

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

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:

Public Function countTextInText(Optional text As String, Optional toCountARR As Variant) As Integer

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

    For Each Val In toCountARR

Full code:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim nameR As Range
    Dim colR As Range

    Dim TKRcnt As Integer
    Dim TKRarr() As Variant
    TKRarr = Array("TKR", "THR", "Bipolar")

    Dim ORIFcnt As Integer
    Dim ORIFarr() As Variant
    TKRarr = Array("ORIF", "Ilizarov", "PFN")


    Set nameR = Range("P2:P9")
    Set colR = Range("B2:B50,G2:G50,L2:L50")

    For Each namecell In nameR
        For Each entrycell In colR
            If entrycell.text = namecell.text Then
                TKRcnt = countTextInText(entrycell.Offset(0, 2).text, TKRarr)
                ORIFcnt = countTextInText(entrycell.Offset(0, 2).text, TKRarr)
            End If
        Next entrycell

        MsgBox (namecell.text & " TKR count: " & TKRcnt & " ORIF count: " & ORIFcnt)

    Next namecell
End Sub

Public Function countTextInText(Optional text As String, Optional toCountARR As Variant) As Integer
    Dim cnt As Integer
    Dim inStrLoc As Integer

    For Each Val In toCountARR
        inStrLoc = InStr(1, text, Val)
        While inStrLoc <> 0
            inStrLoc = InStr(inStrLoc, text, Val)
            cnt = cnt + 1
        Wend
    Next Val

    Set countTextInText = cnt
End Function

Compile error: Argument not optional

Before we dive into the solution for the error above, let us go back to basics to make sure you understand what a function is. This will be important for fixing and troubleshooting the error. Feel free to skip ahead if you have a good grasp of this concept already.

Contents

  • What is a function?
  • Arguments in a function
  • Return value in a function
  • Defining a function with arguments and a return value
  • Built-In Functions
  • Optional arguments & the error “Argument not optional”
    • User-defined functions
    • Built-in Functions
  • Conclusion

What is a function?

A block of code that is reusable can be called a “function.” The word “reusable” tells us that the function can be called any number of times and from anywhere in the project.

If we need to make an enhancement or modification in any flow of action which is already encapsulated in a function, we only need to make the change in one place — the function. This will handle the change in flow wherever the function has been called.

The block of code with a function name that is called in several places is named the “Called Function” and the line of code that calls the function is the  “Calling function.”

Arguments in a function

Let’s say you have some data that’s required for the block of code — the function — to programmatically run. This data can be input in the same line as the function name.

These inputs are called as “Arguments” or “Parameters” in programming. We can define the data type of the arguments along with the variable names when defining the function. However, this is not mandatory.

Based on the usage of the variable arguments in the code, the data type of the arguments can be assumed too.

Return value in a function

After running the block of code programmatically, there may be some information that the function wants to pass back to the calling function. This is called the return value. Optionally, the data type of the return value can also be mentioned while defining the function.

Defining a function with arguments and a return value

Function

Let’s imagine a function called from a sub procedure of a save button on a student admission form. Let us name the function fn_SaveStudent. The function will take all the field values from the form GUI and insert them as a student record into a database.

Arguments

The field values need to be sent as arguments from the calling function to the called function.

Return Value

In turn, the database will generate a “Student ID” automatically. The function can return this value to the calling function, which in turn can display the “Student ID” on any field in the student admission form”  or in a message box.

Syntax of a function

Function <Function’s name> ([arg1 [, arg2 [, arg3 [ …… ] ] ] ] ])

<function code>

End Function

Where “arg” represents an argument.

For Example:

'Sub – procedure for the click event of a save button
Private Sub cmdSave_Click()
    strName = txtName.Value
    intAge = lstAge.Value
    strGen = lstgender.Value
    lngContact = txtcontact.Value
    Call fn_SaveStudent(strName, intAge, strGen, lngContact)
End Sub
Function fn_SaveStudent(strName As String, intAge As Integer, strGen As String, lngContact As Long) As String
    'code to insert the variable values in the parameters into the DB and get back the generated Student Id
    fnSaveStudent = strstudentId
End Function

Built-In Functions

These functions are the predefined blocks of code offered by programming languages for various purposes. In VBA, we have a wide range of built-in functions. Some examples are found below.

S.no Function Name Quick Description Syntax
1 Split Split a string using a character as a delimiter. An array of words is returned SPLIT ( <expression> [,<delimiter>] [,<limit>] [,<compare>])
2 Cdbl Convert expression to a double data type CDBL ( <expression> )
3 chr Returns a string (character value) that corresponds to te ascii value passed as a parameter. chr ( <ascii value> )
4 Mid Returns the middle part of a string when starting position and length are provided MID ( <string>, <start> [,<length>])
5 Left Returns the left portion of a string when length is specified LEFT ( <string>, <length> )
6 Right Returns the right portion of a string when length is specified RIGHT ( <string>, <length> )
7 Trim Trim the leading and trailing spaced of a string Trim ( <string> )
8 Ucase Converts all characters of the string to Upper case Ucase ( <string> )
9 Lcase Converts all characters of the string to Lower case Lcase ( <string> )
10 Instr Checks if one string is a substring of another string. If yes, it returns the starting position or else it returns 0. INSTR([<start>] ,<string1> ,<string2> [,<compare>])
11 Now Returns the current system date and time now()
12 Cstr Converts the passed parameter value to a string cstr ( <expression> )
13 Val Provides the mathematical value of the parameter. value ( <expression> )
14 Ltrim Removes the leading spaces of the string and returns it. Ltrim ( <string> )
15 Rtrim Removes the trailing spaces of the string and returns it. Rtrim ( <string> )
16 Date Returns the current system date date ( <expression> )
17 Day Returns the day from the date parameter passed. Day (<a date in the yyyy,mm,dd format>)
18 Sin Returns the sin value Sin  ( < expression> )
19 Tan Returns the tangent value Tan  ( < expression> )
20 Cot Returns the Cotangent value Cot  ( < expression> )
21 Log Returns the log value Log  ( < expression> )
22 Cos Returns the cos value Cos  ( < expression> )
23 Isnull Returns a boolean value depending on whether the parameter value is equivalent to “null” or not Isnull  ( <expression> )
24 Isnumeric Returns a boolean value depending on whether the parameter value is equivalent to a numeric value or not Isnumeric ( <expression> )
25 Rate Returns a value of double data type as the interest rate for a series of equal cash flows at regular intervals. RATE( <number_payments>, <payment>, <PV>, [<FV>], [<Type>], [<Estimate>] )
26 Cint Comvert the parameter value to an integer value cint ( <expression> )
27 Mkdir Make the directory i.e. create a folder mkdir ( <path_name> )
28 Cvar Convert the paramter value to a value of variant data type CVAR(expression)
29 Ccur Convert the paramter value to a value of currency data type ccur ( <path_name> )
30 cdate Convert the paramter value to a date cdate ( <path_name> )

Optional arguments & the error “Argument not optional”

User-defined functions

For user-defined functions, the arguments are considered optional or mandatory depending on whether you used the “OPTIONAL” keyword when defining the parameters in the called function.

Example

In this called function, no argument is defined with the “Optional” keyword, so when an argument is not passed in the calling function, we see the error message “Argument not Optional.”

Compile error argument not optional

In order to resolve this, we need to either pass the parameter in the calling function or mark the rollno argument as optional. The below piece of code fixes the error.

Sub demo1()
    Call fn_demo1("Baby Aneesh", "A+")
End Sub
Function fn_demo1(strname, strgrade, Optional ByVal introllno As Integer)
    'Just display the values of all parameters
    MsgBox "Student name: " &amp;amp;amp; strname &amp;amp;amp; vbCrLf &amp;amp;amp; "Grade: " &amp;amp;amp; strgrade &amp;amp;amp; vbCrLf &amp;amp;amp; "Roll no: " &amp;amp;amp; introllno
End Function

Built-in Functions

In the case of built-in functions, the syntax clearly states whether the parameters are optional or mandatory.

Example

Syntax of Split Function from the table above:

SPLIT ( <expression> [,<delimiter>] [,<limit>] [,<compare>])

Here only the expression i.e. the string is a mandatory argument. So, the code runs successfully even if the last two optional arguments are not passed.

Function that works

However if the mandatory argument is not passed, it results in the compile error “Argument not optional”.

Compile error argument not optional

To resolve this compile error, the mandatory arguments need to be passed to the function call.

Conclusion

The compile error discussed in this article is self-explanatory if you understand the purpose and usage of functions in general. We need to pass all mandatory arguments of the expected data type in order to avoid compile errors like this.

See also:

You’ve entered too many arguments for this function

  • Remove From My Forums
  • Question

  • I have written a program, using VBA in Excel 2007, and it runs perfect. I have been reading that it is good practice to ‘compile’ your program, not something I have previously done. When I click compile, I get the following error:  «Complie Error: Argument
    not optional». What does this mean?

    The error occurs on this line of code:  Call InsertVaRSummaryFigure

    Which calls this function (which works fine):

    Function InsertVaRSummaryFigure(SummarySheet As String)

    Worksheets(SummarySheet).Select
    strFindAddressClearSection = Range(«C1:C1000»).Find(«Total Core Rates GB», Range(«C1»), xlValues, xlWhole, xlByColumns, xlNext).Address
    Range(strFindAddressClearSection).Offset(0, 2).Formula = «=-VaRData!D11»

    End Function

    Can anyone enlighten me?

Answers

  • Hi Gazza101,

    If you write this:

    Function InsertVaRSummaryFigure(SummarySheet As String)

    This means, that the parameter SummarySheet is not optional. You
    must
    give that to the function.

    And if you write that:

    Call InsertVaRSummaryFigure 

    you have no transfer parameter, so the compiler said: «Complie Error: Argument not optional»

    You can try this:

    Function InsertVaRSummaryFigure(Optional SummarySheet As String = "NameOfYourSheet")

    or this:

    Call InsertVaRSummaryFigure("NameOfYourSheet")

    or both if you want a standard Sheet, or another different:

    Function InsertVaRSummaryFigure(Optional SummarySheet As String = "Sheet1")
    Call InsertVaRSummaryFigure

    or

    Call InsertVaRSummaryFigure("SecondSheetInBla")

    So, try

    and have a look @ http://msdn.microsoft.com/en-us/library/f25e2b6b.aspx


    Please ‘Mark as Answer’ if I helped. This helps others who have the same problem!

    • Marked as answer by

      Wednesday, September 29, 2010 11:54 AM

 

Maxim39

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

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

#1

17.09.2015 02:04:57

Доброй ночи всем!

В модуле листа условие, если ячейка O7=BACK, то запустить макрос

Код
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address <> "$O$7" Then Exit Sub
   If Target = Back Then Call Back
End Sub

В стандартном модуле должен после этого запуститься макрос Back.
Увы выдается ошибка «argument not optional». Никак её побороть не могу, подскажите куда копнуть!?

Инфу брал из:

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

Во вложении скрин ошибки и сама книга. Внимательно (!) она без программы, из которой по DDE получает инфу будет выдавать ошибки.
Цитата из файла помощи к программе:

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

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

  • error argument not optional.jpg (38.5 КБ)
  • Feeder.zip (60.9 КБ)

Изменено: Maxim3917.09.2015 11:20:12

 

JayBhagavan

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

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

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

Maxim39, здравия. Во-первых, код следует оформлять соответствующим тэгом. (кнопка на панели инструментов области текста сообщения <…>)
Во-вторых, Вы вызываете процедуру Back без параметров, а она подразумевает передачу ей обязательных параметров, судя по скрину.

Изменено: JayBhagavan17.09.2015 02:15:57

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Maxim39

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

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

#3

17.09.2015 02:21:50

Доброй ночи,

JayBhagavan

!
Спасибо что не спите (=
И за быстрый ответ, сейчас буду пробовать.

Ссори, в VBA слаб… не понял про теги. Такой код тоже вызывает ошибку:

Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$O$7" Then
     If IsEmpty(Target) Then Exit Sub
        IF Range("O7") = Back THEN
   CALL Back
     End If
End Sub 
'Инфа отсюда http://www.programmersforum.ru/showthread.php?t=60413 (второе сообщение)

Изменено: Maxim3917.09.2015 13:39:11

 

TSN

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

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

Процедура

Back

принимает четыре аргумента указанные в скобках после названия (channel as string, selection as string ….).
Ошибка означает, что Вы пытаетесь запустить

Back

без передачи аргументов, что неприемлемо.
Решение: 1. Запуск CALL Back в такой форме CALL Back («Пример1», «Пример2», «Цена вопроса», «Еще чтото»).
Таким образом запуск процедуры  Back будет выполнен успешно т.к. она получила все объявленные аргументы.
2. Второй вариант сделать аргументы опциональными и присвоить им значения по умолчанию.

Что касается тегов VBA не причем. В момент когда создаете сообщение на форуме и хотите вставить код, часть кода нужно нажать

Кнопка форматирования кода <…>

после чего вставить код в форму с серым фоном.

Изменено: TSN17.09.2015 08:45:38

 

Юрий М

Модератор

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

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

#5

17.09.2015 10:00:47

Цитата
Maxim39 написал: Ссори, в VBA слаб… не понял про теги

VBA тут ни причём )) Ищите такую кнопку (см. скрин) для оформления кода.

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

  • Тег VBA.jpg (19.2 КБ)

 

The_Prist

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

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

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

#6

17.09.2015 11:16:46

Предположу, что Back — это просто текст в ячейке и задача сравнить значение ячейки и если значение в ячейке Back, то вызвать эту процедуру

Код
IF Target = "Back" THEN Call Back

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

 

Maxim39

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

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

#7

17.09.2015 14:08:52

TSN

,

Юрий М

— с тегом поправил, спасибо!

The_Prist

— да, верно Back — это просто текст. Увы тоже выдает ошибку, Excel сам выделяет Target, может в этом подсказка!?

Цитата
TSN написал:
Решение: 1. Запуск CALL Back в такой форме CALL Back («Пример1», «Пример2», «Цена вопроса», «Еще чтото»).

Когда условие срабатывает (в ячейке O7 слово BACK), она вызывает Back там так и прописано, вписал как Вы написали, тоже ошибка.

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

  • error argument not optional 2.jpg (61.53 КБ)

 

The_Prist

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

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

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

Target.Value = «BACK»

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

 

Юрий М

Модератор

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

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

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

 

Maxim39

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

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

#10

17.09.2015 14:34:51

Цитата
The_Prist написал: Target.Value = «BACK»

Спасибо, что помогаете!

Код
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$O$7" Then Exit Sub
   If Target.Value = "B" Then Call Back 'теперь выделяется call Back
End Sub

Цитата
Юрий М написал: Поменяйте контрольное слово

Можно поменять кодовое слово на на анг B, ошибка не из-за этого…  

Изменено: Maxim3917.09.2015 15:11:58

 

Юрий М

Модератор

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

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

#11

17.09.2015 14:44:57

Цитата
Maxim39 написал: ошибка не из-за этого…

Я не про ошибку — про путаницу ))

 

Sclif666

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

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

Уже говорилось, что Sub Back требует параметров.
К тому же Module1 (судя по скринам) содержит кучу ошибок.

 

Maxim39

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

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

#13

17.09.2015 14:52:46

Цитата
Sclif666 написал: Уже говорилось, что Sub Back требует параметров.

Что значит требует параметров? Можно самый простой пример  

 

The_Prist

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

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

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

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

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

 

Maxim39

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

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

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

 

The_Prist

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

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

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

#16

17.09.2015 15:14:32

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

Если Ваша процедура BACK записана вроде:

Код
Function BACK(ByVal sArg as string)
'непосредственно код процедуры
End Function

значит она с аргументами. Т.е. если внутри скобок что-то написано и там есть хоть один As без Optional(Optional sArg as string) — значит надо в эту функцию/процедуру передать этот sArg:

Код
call Back(Target.Value)

Совет такой: потратьте пару часиков на чтение о передаче аргументов в функцию. Да и вообще об азах VBA.
Форумы никак не для обучения Вас всех самых начальных азов — это Вы должны почерпнуть из литературы и прочих материалов, коих в сети толпы.
Я привел лишь маленький пример и если не поймете — я уж извините, из темы устранюсь. Хотя может кому-то сейчас захочется посвятить Вас во все азы программирования в VBA, чтобы Вы поняли что такое аргумент в функции/процедуру и когда его надо обязательно передавать.

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

 

Sclif666

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

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

#17

17.09.2015 15:16:00

Код
Sub Back(channel As String, selection As String, price As String, amount As String)
    Back "HILO_STANDARD", "Card 1 or further", "back_price", 5 'БЕСКОНЕЧНАЯ РЕКУРСИЯ?
'''''End Sub - У ПРОЦЕДУРЫ М.Б. ТОЛЬКО ОДИН END SUB

Dim feed As Integer, counter As Integer
Dim data As String
counter = 0
feed = 0
While counter < 5 And feed = 0
  feed = Application.DDEInitiate("xfeeder", "betting")
Wend
If feed > 0 Then

  data = "back|" & channel & "|" & selection & "|" & price & "|" & amount

  
  Dim cw As Worksheet, ldws As Worksheet
  Set cw = ThisWorkbook.ActiveSheet
  Set ldws = ThisWorkbook.Worksheets("Loading")
  If cw.name = ldws.name Then
    Set cw = ThisWorkbook.Worksheets(1)
    cw.Activate
  End If
  ldws.Activate
  Range("AA1000") = data
  Application.DDEPoke feed, "bet", Range("AA1000")
  cw.Activate
End If
End Sub

'ПРИМЕР ВЫЗОВА
SUB EXAMPLE
  CALL BACK("channel", "selection", "price", "amount")
END SUB
 

Maxim39

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

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

The_Prist

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

Sclif666

, спасибо за хороший пример, что-то я ступил с несколькими End Sub, буду дальше пробовать.

Спасибо всем за подсказки, постараюсь разобраться! Если проблему решу — отпишусь здесь.  

Изменено: Maxim3917.09.2015 15:47:27

 

Maxim39

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

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

#19

18.09.2015 01:06:00

Sclif666

, огромное СПАСИБО,только сейчас понял свою ошибку, сделал как Вы написали и всё заработало как надо! (см.скриншот)
Вы хорошие люди, что не ленитесь и помогаете таким новичкам как я!  :)

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

  • error argument not optional 3.jpg (75.74 КБ)

This repository has been archived by the owner on Aug 31, 2018. It is now read-only.

Permalink

title keywords f1_keywords ms.prod ms.assetid ms.date

Argument not optional (Error 449)

vblr6.chm1011248

vblr6.chm1011248

office

04d08e66-7084-8c94-52b1-b471423846ca

06/08/2017

The number and types of arguments must match those expected. This error has the following causes and solutions:

  • Incorrect number of arguments. Supply all necessary arguments. For example, the Left function requires two arguments; the first representing the character string being operated on, and the second representing the number of characters to return from the left side of the string. Because neither argument is optional, both must be supplied.

  • Omitted argument isn’t optional. An argument can only be omitted from a call to a user-defined procedure if it was declared Optional in the procedure declaration. Either supply the argument in the call or declare theparameter Optional in the definition.

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

I’ve recorded a Macro in which I select several ranges of cells within a worksheet to be cleared, clear them, then save. It seems straight forward enough, and I’ve done this multiple times before on other duplicate worksheets without issue; however, I’ve done this several times on this sheet, but every time results in the same error for the same line in the code for this particular worksheet.

I don’t know enough about VBA (hense why I recorded the macro rather than writing it) to trouble shoot it. I could use some help. The macro is tied to a button, and appears when I click the button. Here’s the code, and the line that is highlighted when the error pops up: Compile error: Argument not optional

Sub Sheet_Clear()

‘ Sheet_Clear Macro
‘ Resets all data entry cells back to zero. Macro created by J. Streck on 10/21/2010.

Dim nResult As Long
nResult = MsgBox( _
Prompt:=»Are you sure you want to clear your sheet? Click YES to clear, or NO to stop.», _
Buttons:=vbYesNo)
If nResult = vbNo Then
Exit Sub
End If
Range(«Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67»).Select
Range(«FQ67»).Activate
Range( _
«Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85» _
).Select
Range(«FQ85»).Activate
Range( _
«Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103» _
).Select
Range(«FQ103»).Activate
Union(Range( _
«Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«FQ121»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119» _
), Range(«CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121»)).Select
Range(«HI47»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103» _
), Range(«BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121»)).Select
Range(«HQ47»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,FT70:FU83,GC70:GD83,GK70:GL83,GS70:GT82,GS83:GT83,HA70:HB83,Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101» _
), Range( _
«EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«HA70»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,FT70:FU83,GC70:GD83,GK70:GL83,GS70:GT82,GS83:GT83,HA70:HB83,HI70:HJ83,HQ70:HR83,Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85» _
), Range( _
«BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«HQ70»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,FT70:FU83,GC70:GD83,GK70:GL83,GS70:GT82,GS83:GT83,HA70:HB83,HI70:HJ83,HQ70:HR83,FT88:FU101,GC88:GD101,GK88:GL101,GS88:GT101,HA88:HB101,Q47:R65,BF47:BF65,CS47:CS65,EF47:EF65,BD67,CQ67,ED67» _
), Range( _
«BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«HA88»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,FT70:FU83,GC70:GD83,GK70:GL83,GS70:GT82,GS83:GT83,HA70:HB83,HI70:HJ83,HQ70:HR83,FT88:FU101,GC88:GD101,GK88:GL101,GS88:GT101,HA88:HB101,HI88:HJ100,HI101:HJ101,HQ88:HR101,Q47:R65,BF47:BF65» _
), Range( _
«BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«HQ88»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,FT70:FU83,GC70:GD83,GK70:GL83,GS70:GT82,GS83:GT83,HA70:HB83,HI70:HJ83,HQ70:HR83,FT88:FU101,GC88:GD101,GK88:GL101,GS88:GT101,HA88:HB101,HI88:HJ100,HI101:HJ101,HQ88:HR101,FT106:FU119» _
), Range( _
«ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«GK106»).Activate
Union(Range( _
«FT47:FU65,GC47:GD65,GK47:GL65,GS47:GT65,HA47:HB65,HI47:HJ65,HQ47:HR65,FT70:FU83,GC70:GD83,GK70:GL83,GS70:GT82,GS83:GT83,HA70:HB83,HI70:HJ83,HQ70:HR83,FT88:FU101,GC88:GD101,GK88:GL101,GS88:GT101,HA88:HB101,HI88:HJ100,HI101:HJ101,HQ88:HR101,FT106:FU119» _
), Range( _
«CS47:CS65,EF47:EF65,BD67,CQ67,ED67,FQ67,Q70:R83,BF70:BF83,CS70:CS83,EF70:EF83,BD85,CQ85,ED85,FQ85,Q88:R101,BF88:BF101,CS88:CS101,EF88:EF101,BD103,CQ103,ED103,FQ103,Q106:R119,BF106:BF119,CS106:CS119,EF106:EF119,BD121,CQ121,ED121,FQ121» _
)).Select
Range(«HQ106»).Activate
Selection.ClearContents
Range(«Q47»).Select
ActiveWorkbook.Save
End Sub

Thanks for looking.

James

afasdfsadfs

0 / 0 / 0

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

Сообщений: 186

1

13.09.2020, 22:40. Показов 3118. Ответов 14

Метки нет (Все метки)


Здравствуйте ,дорогие форумчане ! Хотел передать несколько данных одному процедуру Sub Summ и выводит ошыбку , но когда я передаю одну переменную то все нормально . Не могли бы Вы объяснить в чем проблема ? Спасибо!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Private Sub TextBox2_Change()
  
  Dim Kol_vo As Single
  
  Cells(17, 2) = TextBox2.value
  
 Kol_vo = TextBox2.value
  
 Call proc_ckidki1(Kol_vo)
 
 Call Summ1(Kol_vo)
   
End Sub
 
 
Private Sub TextBox3_Change()
 
 Dim Price As Single
  
  Cells(17, 3) = TextBox3.value
  
  Price = TextBox3.value
  
  Call Summ1(Price)
  
End Sub
 
 
Sub proc_ckidki1(Kol_vo As Single)
 Dim proc_ckidki As Single
 
 
 If Kol_vo < 10 Then
    
    proc_ckidki = 0
    
 ElseIf (Kol_vo >= 10) And (Kol_vo <= 50) Then
       proc_ckidki = 5
  
  ElseIf (Kol_vo > 50) Then
       proc_ckidki = 10
 End If
 
 
  Cells(17, 4) = proc_ckidki
  
Call Summ1(proc_ckidki)
  
  
  
  
  
End Sub
 
 
 Sub Summ1(Kol_vo As Single, Price As Single, proc_ckidki As Single)
 
 Dim Sum As Single
 
Sum = Price * Kol_vo * (100 - proc_ckidki) / 100
 
Cells(17, 5) = Sum
 
 
 
End Sub

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



4037 / 1422 / 394

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

Сообщений: 3,539

13.09.2020, 23:14

2

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



0



0 / 0 / 0

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

Сообщений: 186

14.09.2020, 12:12

 [ТС]

3

snipe, но я же передаю ей 3 переменный . По одной из каждой процедуры Sub . А можно ли другим способом отправить 3 переменных из разных процедур в один, где произведется вычисление и выведет результат в определенную ячейку . Спасибо !



0



КостяФедореев

Часто онлайн

774 / 522 / 233

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

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

14.09.2020, 12:24

4

afasdfsadfs,

в начале кода задайте переменные

Visual Basic
1
2
3
Public Kol_vo As Single
Public Price As Single
Public proc_ckidki  As Single

и со скобок уберите переменные



0



4037 / 1422 / 394

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

Сообщений: 3,539

14.09.2020, 12:39

5

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

но я же передаю ей 3 переменный . По одной из каждой процедуры Sub .

в том -то и дело что нужно не по одной передавать а все разом
т.к.

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

Sub Summ1(Kol_vo As Single, Price As Single, proc_ckidki As Single)

вот тут написано что нужно передавать именно одновременно а не по одной
ну или сделайте как написалКостяФедореев



0



0 / 0 / 0

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

Сообщений: 186

14.09.2020, 12:48

 [ТС]

6

КостяФедореев, Спасибо за ответ , задал переменные в начале кода, удалил со скобок Summ1 переменные. Теперь он выводит ошибку .Wrong number of arguments or invalid property assignment . Спасибо !



0



snipe

4037 / 1422 / 394

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

Сообщений: 3,539

14.09.2020, 12:55

7

должно быть так
(если переменные публичные)

Visual Basic
1
Call Summ1(Kol_vo, Price, proc_ckidki)



0



Часто онлайн

774 / 522 / 233

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

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

14.09.2020, 13:32

8

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

Теперь он выводит ошибку

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

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



0



1781 / 1109 / 340

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

Сообщений: 3,924

14.09.2020, 14:00

9

afasdfsadfs, а лучше перед тем как писать программу набрать в поисковике ПРОЦЕДУРЫ и ФУНКЦИИ вба и чуточку почитать



0



afasdfsadfs

0 / 0 / 0

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

Сообщений: 186

14.09.2020, 14:54

 [ТС]

10

snipe,спасибо большое ,что помогает мне . Вот что у меня вышло . Но теперь он выводит ошибку в Sub proc_ckidki1(Kol_vo As Single) Сompile error : Argument not optional .Спасибо большое ,что помогает мне !!!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 Public Kol_vo As Single
Public Price As Single
Public proc_ckidki  As Single
 
 
Private Sub TextBox2_Change()
  
  Dim Kol_vo As Single
  
  Cells(17, 2) = TextBox2.value
 
  
 Call proc_ckidki1(Kol_vo)
 
 
   
End Sub
 
 
Private Sub TextBox3_Change()
 
 Dim Price As Single
  
  Cells(17, 3) = TextBox3.value
  
  Price = TextBox3.value
  
  Call Summ1(Price)
  
End Sub
 
 
Sub proc_ckidki1(Kol_vo As Single)
 Dim proc_ckidki As Single
 
 
 If Kol_vo < 10 Then
    
    proc_ckidki = 0
    
 ElseIf (Kol_vo >= 10) And (Kol_vo <= 50) Then
       proc_ckidki = 5
  
  ElseIf (Kol_vo > 50) Then
       proc_ckidki = 10
 End If
 
 
  Cells(17, 4) = proc_ckidki
  
  Call Summ1(proc_ckidki)
  
  
  
  
  
End Sub
 
 
 Sub Summ1(Kol_vo, Price, proc_ckidki)
 
 Dim Sum As Single
 
Sum = Price * Kol_vo * (100 - proc_ckidki) / 100
 
Cells(17, 5) = Sum
 
 
 
End Sub



0



Часто онлайн

774 / 522 / 233

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

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

14.09.2020, 15:03

11

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

Решение

afasdfsadfs, так у Вас после 10 строки Kol_vo не задано
Kol_vo =TextBox2.value

Добавлено через 2 минуты
если честно, то я вообще не понимаю как у Вас это работает, я бы в одной процедуре все сделал…



0



0 / 0 / 0

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

Сообщений: 186

14.09.2020, 16:02

 [ТС]

12

КостяФедореев, просто у меня есть несколько строчек которые я получаю через TextBox ,а для каждой из них создается отдельная процедура .Или есть возможность поместить их в одну процедуру . А как бы Вы сделали ? Спасибо !



0



3817 / 2245 / 750

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

Сообщений: 5,894

14.09.2020, 16:06

13

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

Решение

файл приложить никак?



0



КостяФедореев

Часто онлайн

774 / 522 / 233

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

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

14.09.2020, 16:41

14

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

Решение

afasdfsadfs, где находятся у Вас текстбоксы?
Скиньте файл пример, так быстрей будет

Добавлено через 31 минуту
afasdfsadfs,
в модуль формы

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub TextBox3_change()
Dim Kol_vo
Dim Price
Dim proc_ckidki
Dim Sum
Cells(17, 2) = Me.TextBox2.Value
Kol_vo = Me.TextBox2.Value
Cells(17, 3) = Me.TextBox3.Value
Price = Me.TextBox3.Value
    If Kol_vo < 10 Then
        proc_ckidki = 0
    ElseIf (Kol_vo >= 10) And (Kol_vo <= 50) Then
        proc_ckidki = 5
    ElseIf (Kol_vo > 50) Then
        proc_ckidki = 10
    End If
Cells(17, 4) = proc_ckidki
Sum = Price * Kol_vo * (100 - proc_ckidki) / 100
Cells(17, 5) = Sum
End Sub



1



0 / 0 / 0

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

Сообщений: 186

14.09.2020, 17:16

 [ТС]

15

КостяФедореев, огромное спасибо Вам за помочь !!! Теперь я разобрался ,как нужно было это сделать . Еще раз ,СПАСИБО!!!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

14.09.2020, 17:16

15

  1. 08-12-2021, 01:46 PM


    #1

    DropAGearN'Disappear is offline


    Registered User


    Compile Error: Argument not optional

    I am trying to auto sort a table by date,

    I am putting the sort code into a module then calling on the sheet page where the table is located.

    my call is:

    my Module code it:

    Moderator’s note: Please take the time to review our rules. There aren’t many, and they are all important. Rule #2 requires code tags. I have added them for you this time because you are a new member. —6StringJazzer

    Last edited by DropAGearN’Disappear; 08-19-2021 at 11:10 AM.


  2. 08-12-2021, 01:57 PM


    #2

    Re: Compile Error: Argument not optional

    Sub AutoUpdater requires an argument of Target. You did not provide it when you called the sub. I am guessing you need this:

    See my note above about using code tags.

    Jeff
    | | |?| |?| |?| |?| | |:| | |?| |?|
    Read the rules
    Use code tags to [code]enclose your code![/code]


  3. 08-13-2021, 12:34 PM


    #3

    DropAGearN'Disappear is offline


    Registered User


    Re: Compile Error: Argument not optional

    Thank you and my apologies!

    There are no more error codes but the dates do not sort?

    In addition if I click run, the module doesnt show up in the macros window

    Last edited by DropAGearN’Disappear; 08-13-2021 at 12:47 PM.


  4. 08-13-2021, 02:37 PM


    #4

    Re: Compile Error: Argument not optional

    You have two problems in you AutoUpdater code as it relates you your trying to do a sort…

    The following line…

    require the range passed into it to be single cell… it’s kind of hard to sort only one cell.

    If you remove the above problem, the following line…

    doesn’t make use of the Target which may or may not be a problem BUT you are specifying a sort on cell E14 which, again, is a single cell… and again, it is hard to sort a single cell.

    Last edited by Rick Rothstein; 08-13-2021 at 03:31 PM.


  5. 08-13-2021, 03:14 PM


    #5

    Re: Compile Error: Argument not optional

    Also, not sure which macros window you mean but if you go to Developer — Macros, you won’t see it because it has an argument, and there is no way to call a sub with an argument from the worksheet interface.


  6. 08-16-2021, 09:46 AM


    #6

    DropAGearN'Disappear is offline


    Registered User


    Re: Compile Error: Argument not optional

    A help site gave that skeleton code as a basis for sorting a dynamic list by date. Here is the updated code in which I’ve altered it and only call it in a module. It still doesn’t work; do you all have any additional suggestions?


  7. 08-16-2021, 10:35 AM


    #7

    Re: Compile Error: Argument not optional

    The problem with your question is you never really told use how you want this to work. After reading over everything here I think you want to call a macro from the list of macros. I assume you will always be sorting Sheet1. I think you want this in a standard module (like Module1):

    You can now call this from the list of macros, or add a button on your worksheet to call it. (Personally, I would use Autofilter on the worksheet and not even write a macro for this.)

    Here’s why your other attempts did not work:

    Your original attempt used Worksheet_Change which is automatically called when the user changes the content of any cell. Target is the current range that the user has selected. Since you are not using that, I don’t know why you would be using this sub. That is what hampered everything else you tried.

    Worksheet_SelectionChange is an event handler. It is automatically called by VBA anytime that the user changes the cell selection. It can be called from another sub but that is not the intent and I don’t recommend it. Same idea.


  8. 08-16-2021, 10:50 AM


    #8

    DropAGearN'Disappear is offline


    Registered User


    Re: Compile Error: Argument not optional

    Trust me I wish it was that easy. This spreadsheet has to be used by non-basic excel savvy people so I must make it as automated as possible. And thank you as I am new to VBA. How then, would I change to sort new to old as this is old to new


  9. 08-16-2021, 03:19 PM


    #9

    Re: Compile Error: Argument not optional

    What action do you want to trigger the sort?

    This could go a lot faster if you attach your file so we can see what you’re describing.

    For new-to-old change xlAscending to xlDescending.


  10. 08-17-2021, 07:32 AM


    #10

    DropAGearN'Disappear is offline


    Registered User


    Re: Compile Error: Argument not optional

    Unfortunately the spreadsheet contains trade secreted information. That worked for the correct order (I assumed I needed to change orientation as well). The trigger needs to be when a date is entered or altered.


  11. 08-17-2021, 08:17 AM


    #11

    Re: Compile Error: Argument not optional

    Where are the dates located?


  12. 08-17-2021, 08:22 AM


    #12

    DropAGearN'Disappear is offline


    Registered User


    Re: Compile Error: Argument not optional

    Sheet 1

    in dynamic table

    header — E14
    First date — E15


Понравилась статья? Поделить с друзьями:
  • Compilation failed see the compiler error output for details
  • Compilation failed due to following error перевод
  • Compilation failed due to following error s паскаль
  • Compilation failed due to following error s pascal
  • Compilation failed 1 error s 0 warnings