|
azma Пользователь Сообщений: 342 |
#1 29.06.2020 12:56:07 Добрый день, уважаемый форумчани!
как можно от этого избавиться? Прикрепленные файлы
|
||
|
sokol92 Пользователь Сообщений: 4879 |
Один из возможных вариантов — в Вашей надстройке переопределена функция Replace. Если это так, то подобного рода вещи (называть свои функции так же, как стандартные) не желательны. Замена в приведенном выше примере Replace на VBA.Replace может помочь. |
|
azma Пользователь Сообщений: 342 |
sokol92, Спасибо большое! |
|
Jerry.Sweer Пользователь Сообщений: 62 |
#4 21.10.2020 18:20:07 Друзья помогите с той же проблемой. Благодарен заранее.
____________________________________________________________
Изменено: Jerry.Sweer — 21.10.2020 22:40:40 |
||||
|
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 15779 Профессиональная разработка приложений для MS Office |
#5 21.10.2020 18:37:08 Коды ОЧЕНЬ желательно оформлять соответствующим тегом(кнопка <…> в панели редактора сообщений). Без оформления тегами очень неудобно коды читать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
|
Jerry.Sweer Пользователь Сообщений: 62 |
#6 21.10.2020 22:48:52 Спасибо большое. |
You will encounter the ‘ByRef argument type mismatch’ error in Excel VBA if you call a procedure or function and feed it with an argument of a different data type than the one expected by the procedure or function.
For instance, you will encounter the ‘ByRef argument type mismatch’ error if you call a procedure or function that expects an argument of string data type and pass an argument of integer data type to it.
What Does ByRef Mean in VBA?
‘ByRef’ is short for ‘By Reference.’
When you use ‘ByRef’ in a procedure, you pass the address of an argument instead of the value.
Passing the variable’s address means the procedure can access the actual variable and change its value.
By default, arguments are passed by reference unless specified otherwise.
‘ByRef’ is the opposite of ‘ByVal’ (By Value).
Passing a variable by value is when you pass a copy of the variable’s value to a procedure instead of passing the address.
Passing a variable’s value allows the procedure to access a copy of the variable without being able to change its actual value.
In this tutorial, I will show you four ways to fix Excel VBA’s ‘ByRef argument type mismatch’ error.
Method #1: Match the Data Types of Arguments Passed With those Expected
Ensure that the data types of the variables you pass as arguments match those expected by the procedure or function you have called.
Suppose you have the following code, which triggers the ‘ByRef argument type mismatch’ error.
Sub mainProcedure()
Dim myValue As Integer
myValue = 350
Call myProcedure(myValue)
End Sub
Sub myProcedure(ByRef inputValue As String)
Debug.Print inputValue
End Sub
The error happens because the ‘mainProcedure’ subroutine passes an argument ‘myValue,’ which is of Integer data type, to the ‘myProcedure’ subroutine that expects an argument of String data type.
To fix the error, you can either change the data type of the ‘myValue’ variable to a String that matches the data type expected by ‘myProcedure,’ or change the data type of the argument expected by ‘myProcedure’ to an Integer that matches the data type of the ‘myValue’ argument passed by ‘mainProcedure.’
Also read: VBA Runtime Error 91 – How to Fix?
Method #2: Use Explicit Conversion When Passing Arguments
When passing arguments, you can use explicit conversion to avoid the ‘ByRef argument type mismatch’ error.
Explicit conversion refers to using conversion functions such as ‘CStr,’ ‘Cint,’ ‘CDbl,’ etc.
Here’s an example:
Sub mainProcedure2()
Dim myValue As Integer
myValue = 350
Call myProcedure2(CStr(myValue))
End Sub
Sub myProcedure2(ByRef inputValue As String)
Debug.Print inputValue
End Sub
In this example, the ‘mainProcedure2’ subroutine declares an integer variable ‘myValue’ and then calls the ‘myProcedure2’ subroutine, passing ‘myValue’ after explicitly converting it to a string using the’CStr’ function.
By using ‘CStr(myValue),’ you ensure that even though ‘myValue’ is an integer, it gets converted to a string before being passed to ‘myProcedure2.’
This way, you avoid the ‘ByRef argument type mismatch’ error that might occur if you directly pass an integer to a procedure expecting a string.
Also read: VBA Type Mismatch Error (Error 13)
Method #3: Enter ‘Option Explicit’ at the Top of Your Modules
The ‘Option Explicit’ statement is a directive in VBA that forces you to explicitly declare all variables before using them in the code.
Including Option Explicit at the beginning of a VBA module requires you to explicitly declare every variable using the ‘Dim,’ ‘ReDim,’ ‘Static,’ ‘Private,’ ‘Public,’ or ‘Const’ keywords before using it.
The ‘Option Explicit’ directive forces you to declare all variables, helping catch undeclared variables that might lead to type mismatches.
Suppose you have the following code in a module without the ‘Option Explicit’ statement at the top:
Sub mainProcedure3()
Dim myValue, iValue As Integer
myValue = 350
iValue = 450
Call myProcedure3(myValue)
End Sub
Sub myProcedure3(ByRef inputValue As Integer)
Debug.Print inputValue
End Sub
You will encounter the ‘ByRef argument type mismatch’ error when you run the code.
The error occurs because the ‘mainProcedure3’ subroutine passes a variant ‘myValue’ variable (no specific data type) to the ‘myProcedure3’ subroutine expecting an argument of Integer data type.
Unlike some programming languages, VBA doesn’t let you declare a group of variables as a particular data type by separating the variables with commas.
For example, the following statement in the above code, although valid, does not declare all the variables as integers:
Dim myValue, iValue As Integer
In VBA, only ‘iValue’ is declared an integer; the ‘myValue’ variable is declared a variant.
To declare ‘myValue’ and ‘iValue’ as integers, use the following statement:
Dim myValue As Integer, iValue As Integer
To prevent the mistake of trying to declare a group of variables as a specific data type by separating them with commas, you can add the statement ‘Option Explicit’ at the top of the module.
This declaration will make VBA require you to explicitly declare each variable you plan to use in your code.
If you want VBA to add the statement for you in each module automatically, you can do the following:
- In VB Editor, open the ‘Tools’ menu and select ‘Options.’
- Select the ‘Require Variable Declaration’ checkbox on the’ Options’ dialog box and click OK.
Note: VBA will automatically add ‘Option Explicit’ in new modules. For older modules, you must add the statement manually.
Method #4: Use the Variant Data Type
You can use the Variant data type if an argument’s data type is uncertain. However, because this data type can slow your code, only use it when necessary.
The code example below uses the variant data type to handle a ‘Cancel’ click:
Sub mainProcedure4()
Dim userAge As Variant
userAge = InputBox("Enter your age:")
Call myProcedure4(userAge)
End Sub
Sub myProcedure4(ByRef inputValue As Variant)
Debug.Print inputValue
End Sub
Explanation of the Variant Data Type
The ‘Variant’ data type is versatile and can hold any data type, including numbers, strings, dates, and objects.
When you declare a variable as a ‘Variant,’ it can dynamically change its data type at runtime based on the value assigned to it.
The ‘Variant’ type is handy when you need a variable to handle different data types dynamically.
Although the ‘Variant’ type has flexibility, it has some trade-offs. Unlike variables with specific data types, variables of the ‘Variant’ type consume more memory.
Additionally, runtime dynamic type checking can slow down the code.
In this article, I explained the ‘ByRef argument type mismatch’ error and showed four ways to fix it.
I hope you found the tutorial helpful.
Other Excel articles you may also like:
- What is VBA in Excel?
- Excel VBA Runtime Error 1004
|
1021 / 125 / 2 Регистрация: 26.08.2011 Сообщений: 1,219 Записей в блоге: 2 |
|
|
04.04.2012, 23:44. Показов 43752. Ответов 4 Работал достаточно долго с программой. Проверял элементы по отдельности. Делаю сборку программы — и вдруг на все переменные стали появляться такие сообщения. В чем может быть причина?
1 |
|
IT_Exp Эксперт 34794 / 4073 / 2104 Регистрация: 17.06.2006 Сообщений: 32,602 Блог |
04.04.2012, 23:44 |
|
Ответы с готовыми решениями: Byref argument type mismatch Function Factorial(n As Integer, f As Integer) ByRef argument type mismatch Function… Ошибка: ByRef argument type mismatch 4 |
|
2786 / 718 / 106 Регистрация: 04.02.2011 Сообщений: 1,443 |
|
|
05.04.2012, 00:07 |
|
|
Не пишите программ без Option Explicit, пока не приучились к тому, что всякая переменная должна иметь свой тип. Каждому типу данных — свои операции, некоторые значения одних типов можно конвертировать в другой тип данных, например функции преобразования CInt, CDbl, CLng, CStr, CDate. Старайтесь следить, чтобы там где требуется определенный тип данных, данные были достоверно преобразованы в этот тип. Возможно у вас Sub или Function требует один тип, а вы подсовываете ей что-то неудобоваримое.
1 |
|
15155 / 6428 / 1731 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
|
05.04.2012, 00:14 |
|
|
Сообщение от AndreA SN вдруг на все переменные стали появляться такие сообщения Не на все, а только на передаваемые в подпрограммы или функции. необходимо использовать Option Explicit , о чем mc-black написал Вам в соседней теме. Поверьте, на написание операторов Dim Вы потратите меньше времени, чем на устранение «странных» ошибок. новых модулях.
1 |
|
AndreA SN 1021 / 125 / 2 Регистрация: 26.08.2011 Сообщений: 1,219 Записей в блоге: 2 |
||||||||
|
05.04.2012, 00:37 [ТС] |
||||||||
|
дело в том, что я уже работаю с Option Explicit
считает пременную i типом Variant !!!
— ошибки пропали.
1 |
|
15155 / 6428 / 1731 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
|
05.04.2012, 00:42 |
|
|
Сообщение от AndreA SN объявление переменных вида Именно так. В окне Locals в режиме останова это хорошо видно.
1 |
|
BasicMan Эксперт 29316 / 5623 / 2384 Регистрация: 17.02.2009 Сообщений: 30,364 Блог |
05.04.2012, 00:42 |
|
5 |
Автор postrelll, 25 марта 2016, 18:00
Уважаемые форумчане, буду благодарен за подсказку в решении проблемки, причину которой я не понимаю.
Есть основная процедура в которой определен тип одной переменной, которая передаем имя открытой книги
————
Sub analyse()
‘так определена переменная
Dim book_with_source As String
…
‘так эта переменная в основной программе получает своё значение
book_with_source = ActiveWorkbook.name
End Sub
————
Далее есть процедура в которую я передаю эту переменную
————
Private Sub IndividualReportFormer(book_with_source As String, _
Optional book_with_report As String, _
Optional sheet_of_source As Integer, _
Optionalsource_letter As String, _
Optional prefix_type As String)
————
Далее вот так из основной программы я обращаюсь к вышеприведенной процедуре
————
IndividualReportFormer book_with_sourse
————
Однако при выполнении я получаю:
Compile error: ByRef argument type mismatch
и выделяется вот эта переменная — book_with_sourse.
И я не понимаю, почему несовпадение типов? Ведь в обоих случаях четко определено, что переменная строковая.
Администратор
- Administrator
- Сообщения: 2 629
- Записан
Сделайте вот так в VBA:
Tools — Options… — поставьте галочку «Require Variable Declaration».
Теперь у вас в новых модулях сверху будет появляться «Option Explicit». Этот параметр будет проверять, создали (в справках вместо термина «создали» используется термин «объявили») ли вы переменную.
Сейчас в уже имеющемся модуле в самом верху вставьте этот текст:
Option Explicit
и запустите макрос. VBA выдаст сообщение, что у вас не создана переменная.
То есть вы передаёте в процедуру переменную, которую не создали. Здесь:
IndividualReportFormer book_with_sourse
происходит два действия:
1) создаётся переменная «book_with_sourse» и 2) эта переменная отправляется в процедуру. При этом у переменной «book_with_sourse» будет тип данных «Variant» (этот тип данных присваивается автоматически, если явно не задавать тип данных). Из-за этого вы и видите ошибку «несоответствие типов», т.к. у переменной тип данных «Variant», а у аргумента процедуры — «String».
Спасибо! Помогло, не обратил внимания, что опечатка была в sourSe вместо sourCe.
- Форум по VBA и MS Office
-
►
VBA, Excel -
►
VBA, макросы в Excel -
►
Excel: Странная проблема при обработке процедуры — ByRef argument type mismatch
VBA ByRef Argument Type Mismatch: What It Is and How to Fix It
Have you ever been working on a VBA project and gotten the error message “ByRef argument type mismatch”? This error can be a real pain, especially if you’re not sure what it means or how to fix it. In this article, we’ll take a look at what a ByRef argument type mismatch is, why it happens, and how to fix it.
What is a ByRef Argument Type Mismatch?
A ByRef argument type mismatch occurs when you pass a variable of the wrong type to a ByRef parameter. For example, if you have a function that takes a ByRef parameter of type `Integer`, and you pass it a variable of type `String`, you’ll get a ByRef argument type mismatch error.
Why Does It Happen?
There are a few reasons why you might get a ByRef argument type mismatch error. Here are a few of the most common:
- You’re using the wrong type of variable. As mentioned above, you need to make sure that the variable you’re passing to a ByRef parameter is of the correct type. If it’s not, you’ll get an error.
- You’re using a variable that’s not initialized. If you try to pass a variable that hasn’t been initialized to a ByRef parameter, you’ll get an error.
- You’re using a variable that’s out of scope. If you try to pass a variable that’s out of scope to a ByRef parameter, you’ll get an error.
How to Fix It
If you get a ByRef argument type mismatch error, there are a few things you can do to fix it. Here are a few suggestions:
- Check the type of your variable. Make sure that the variable you’re passing to a ByRef parameter is of the correct type.
- Initialize your variable. If you’re using a variable that hasn’t been initialized, initialize it before you pass it to a ByRef parameter.
- Check the scope of your variable. Make sure that the variable you’re passing to a ByRef parameter is in scope.
If you’re still having trouble fixing the ByRef argument type mismatch error, you can try posting a question on a VBA forum or community. There are plenty of people who are willing to help you troubleshoot the issue.
| Header 1 | Header 2 | Header 3 |
|—|—|—|
| Problem | Solution | Example |
| VBA ByRef Argument Type Mismatch | The VBA ByRef argument type mismatch error occurs when you pass a variable of the wrong type to a function or procedure. |
Sub Example()
Dim x As Integer
Dim y As String
‘ This will cause a ByRef argument type mismatch error because x is an Integer and y is a String.
Call MyFunction(x, y)
End Sub
Function MyFunction(ByRef x As Integer, ByRef y As String)
‘ The ByRef argument type mismatch error will be resolved if we change x to a String.
MyFunction = x & y
End Function
|
In Microsoft Visual Basic for Applications (VBA), a ByRef argument is an argument that is passed by reference. This means that when the function or method is called, the value of the argument is passed to the function or method, and the function or method can change the value of the argument.
If you pass a ByRef argument that is not of the correct type, a ByRef argument type mismatch error will occur. This error can cause your code to crash or to produce incorrect results.
In this article, we will discuss what a ByRef argument type mismatch is, how to avoid it, and how to fix it if it occurs.
What is a ByRef Argument Type Mismatch?
As mentioned above, a ByRef argument type mismatch occurs when a function or method is passed a ByRef argument that is not of the correct type. This can happen when the argument is passed as a different data type than the function or method expects, or when the argument is passed as a variable that is not of the correct type.
For example, the following code will cause a ByRef argument type mismatch:
Sub MySub(ByRef MyVar As String)
MyVar = “Hello World”
End Sub
Dim MyVar As Integer
MySub(MyVar)
In this code, the `MySub` function expects a ByRef argument of type `String`, but the `MyVar` variable is of type `Integer`. This causes a ByRef argument type mismatch error.
How to Avoid a ByRef Argument Type Mismatch
There are a few things you can do to avoid a ByRef argument type mismatch:
- Make sure that the argument is passed as the correct data type.
- Make sure that the argument is passed as a variable that is of the correct type.
- Use the `IsType` function to check the type of an argument before passing it to a function or method.
**To make sure that the argument is passed as the correct data type, you can use the `As` keyword. For example, the following code will not cause a ByRef argument type mismatch:
Sub MySub(ByRef MyVar As String)
MyVar = “Hello World”
End Sub
Dim MyVar As String
MySub(MyVar)
In this code, the `MySub` function expects a ByRef argument of type `String`, and the `MyVar` variable is of type `String`. This means that the argument will be passed to the function as the correct data type.
**To make sure that the argument is passed as a variable that is of the correct type, you can use the `VarType` function. The `VarType` function returns the data type of a variable. For example, the following code will not cause a ByRef argument type mismatch:
Sub MySub(ByRef MyVar As Variant)
If VarType(MyVar) = vbString Then
MyVar = “Hello World”
End If
End Sub
Dim MyVar As Variant
MyVar = 10
MySub(MyVar)
In this code, the `MySub` function expects a ByRef argument of type `Variant`. The `VarType` function is used to check the type of the `MyVar` variable. Since the `MyVar` variable is of type `Variant`, the argument will be passed to the function as the correct data type.
**You can also use the `IsType` function to check the type of an argument before passing it to a function or method. The `IsType` function returns `True` if the argument is of the specified type, and `False` otherwise. For example, the following code will not cause a ByRef argument type mismatch:
Sub MySub(ByRef MyVar As String)
If IsType(MyVar, vbString) Then
MyVar = “Hello World”
End If
End Sub
Dim MyVar As Variant
MyVar = 10
MySub(MyVar)
In this code, the `MySub` function expects a ByRef argument of type `String`. The `IsType` function is used to check the type of the `MyVar` variable. Since the `MyVar` variable is not of type `String`, the argument will not be passed to the function.
Fixing a ByRef Argument Type Mismatch
If you get a ByRef argument type mismatch error, there are a few things you can do to fix it:
- Make sure that the argument is passed as the correct data type.
- Make sure that the
A ByRef argument type mismatch occurs when a ByRef argument is passed to a function or method that expects a different data type. For example, if a function expects a String argument, but you pass a Number argument, you will get a ByRef argument type mismatch error.
What Causes a ByRef Argument Type Mismatch?
There are a few things that can cause a ByRef argument type mismatch:
- Passing the wrong data type to a function or method. This is the most common cause of a ByRef argument type mismatch. For example, if a function expects a String argument, but you pass a Number argument, you will get a ByRef argument type mismatch error.
- Using the wrong data type for a variable. If you declare a variable as one data type, but then use it to store data of a different data type, you will get a ByRef argument type mismatch error. For example, if you declare a variable as a String, but then try to assign a Number value to it, you will get a ByRef argument type mismatch error.
- Using the wrong data type for an object. If you create an object of one data type, but then try to use it as an object of a different data type, you will get a ByRef argument type mismatch error. For example, if you create a Workbook object, but then try to use it as a Range object, you will get a ByRef argument type mismatch error.
How to Fix a ByRef Argument Type Mismatch
If you do encounter a ByRef argument type mismatch, you can fix it by doing the following:
- Change the data type of the argument to match the function or method’s expectations. This is the easiest way to fix a ByRef argument type mismatch. For example, if a function expects a String argument, but you passed a Number argument, you can simply change the Number argument to a String argument.
- Change the variable that is being passed to the function or method to a variable of the correct type. If you cannot change the data type of the argument, you can try changing the variable that is being passed to the function or method to a variable of the correct type. For example, if you are passing a Number variable to a function that expects a String argument, you can try changing the Number variable to a String variable.
- Use the `CType` function to convert the argument to the correct data type. The `CType` function can be used to convert an argument to a different data type. For example, if you are passing a Number variable to a function that expects a String argument, you can use the `CType` function to convert the Number variable to a String variable.
ByRef argument type mismatches can be a frustrating problem, but they can usually be fixed by changing the data type of the argument, changing the variable that is being passed to the function or method, or using the `CType` function to convert the argument to the correct data type.
Additional Resources
- [Microsoft Docs: ByRef Argument Type Mismatch](https://docs.microsoft.com/en-us/office/vba/language/reference/errors/byref-argument-type-mismatch)
- [Stack Overflow: ByRef Argument Type Mismatch](https://stackoverflow.com/questions/1450651/byref-argument-type-mismatch)
- [VBA Programmers Blog: ByRef Argument Type Mismatch](https://vbaprogrammersblog.com/byref-argument-type-mismatch/)
Q: What is a ByRef argument?
A ByRef argument is a variable that is passed by reference to a function or procedure. This means that the function or procedure can modify the value of the variable in the calling statement.
Q: What is an argument type mismatch error?
An argument type mismatch error occurs when a function or procedure is called with an argument that is not of the correct type. For example, if a function expects a numeric argument, but a string argument is passed, an argument type mismatch error will occur.
Q: How do I fix a ByRef argument type mismatch error?
To fix a ByRef argument type mismatch error, you need to make sure that the argument passed to the function or procedure is of the correct type. For example, if a function expects a numeric argument, you need to pass a numeric value to the function.
Q: What are some common causes of ByRef argument type mismatch errors?
There are a few common causes of ByRef argument type mismatch errors.
- Using the wrong data type. The most common cause of a ByRef argument type mismatch error is using the wrong data type for an argument. For example, if a function expects a numeric argument, but a string argument is passed, an error will occur.
- Passing a variable that is not initialized. If you pass a variable that is not initialized to a function or procedure, an error will occur. This is because the function or procedure will not be able to determine the type of the variable.
- Passing a constant to a ByRef argument. ByRef arguments cannot be passed constants. If you try to pass a constant to a ByRef argument, an error will occur.
Q: How can I avoid ByRef argument type mismatch errors?
There are a few things you can do to avoid ByRef argument type mismatch errors.
- Be careful about the data types of your arguments. Make sure that you are using the correct data type for each argument.
- Initialize your variables before passing them to functions or procedures. This will ensure that the function or procedure can determine the type of the variable.
- Do not pass constants to ByRef arguments. ByRef arguments cannot be passed constants.
Q: What are some additional resources on ByRef argument type mismatch errors?
- [Microsoft Developer Network: ByRef arguments](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/byref)
- [Stack Overflow: ByRef argument type mismatch](https://stackoverflow.com/questions/3177439/byref-argument-type-mismatch)
- [TechNet: ByRef arguments](https://technet.microsoft.com/en-us/library/ms180798.aspx)
the vba byref argument type mismatch error can be a frustrating problem to troubleshoot. However, by understanding the causes of the error and following the steps in this guide, you can quickly and easily resolve the issue.
Here are the key takeaways from this article:
- The vba byref argument type mismatch error occurs when a ByRef parameter is passed to a function or procedure that expects a ByVal parameter.
- The most common cause of this error is when the data types of the arguments do not match.
- To resolve this error, you can either change the data type of the argument or use the Coercion function to convert the argument to the correct data type.
- You can also use the IsType function to check the data type of an argument before passing it to a function or procedure.
By following these steps, you can quickly and easily resolve the vba byref argument type mismatch error and get your code back to running smoothly.
