Top-office11.ru

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

Vba excel byref argument type mismatch

Как byref несоответствие типа аргумента в VBA в Excel

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

и я использую эту функцию вот так

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

я получил Compile error: ByRef arugment type mismatch когда я попытался запустить это. Я использую Windows XP с Office 2003.

EDIT: я добавил базовую структуру кода, который у меня есть, у меня есть около 20 строк аналогичного кода. Делать то же самое для каждого поля, которое мне нужно.

5 ответов

Я подозреваю, что вы не настроили last_name правильно в вызывающем абоненте.

С заявлением Worksheets(data_sheet).Range(«C2»).Value = ProcessString(last_name)

это будет работать только если last_name — это строка, т. е.

появляется в вызывающем абоненте где-то.

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

два исправления:

1) Бывал Силу — измените свою функцию, чтобы передать переменную ByVal:
Public Function ProcessString(ByVal input_string As String) As String или

2) Dim varname — put Dim last_name As String на абонента, прежде чем использовать его.

(1) работает, потому что для ByVal , копия input_string берется при передаче функции, которая принудит ее к правильному типу данных. Это также приводит к лучшей стабильности программы, так как функция не может изменять переменную в вызывающем объекте.

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

например, существует процедура, которая делает некоторые манипуляции с данными: на основе ID возвращает номер детали и количество информации. ID как постоянное значение, другие два аргумента являются переменными.

следующий основной код дает мне «несоответствие аргументов ByRef»:

и далее один тоже работает:

Я изменил несколько вещей, чтобы работать с Option Explicit , и код отлично работал против ячейки, содержащей «abc.123» , который возвращен «abc.12,» . Ошибок компиляции не было.

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

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

Читать еще:  Автоматизация excel с помощью vba

Byref argument type mismatch

Hi, this is puzzling me for a while now.

When I create a function and use arguments it often gives me the error message like Byref argument type mismatch.

Please look at the following code that produces the error.

  1. Private Sub CommandButton1_Click()
  2. Dim InputSheet, OutputSheet As Worksheet
  3. Dim InputSheetName, OutputSheetName As String
  4. InputSheetName = «SheetInput»
  5. OutputSheetName = «SheetOutput»
  6. Set InputSheet = Worksheets(InputSheetName)
  7. Set OutputSheet = Worksheets(OutputSheetName)
  8. Call CopyCells(InputSheet, OutputSheet)
  9. InputSheet = Nothing
  10. OutputSheetName = Nothing
  11. End Sub
  12. Sub CopyCells(InputSheet As Worksheet, OutputSheet As Worksheet)
  13. For a = 1 To 10
  14. For b = 2 To 4
  15. OutputSheet.Cells( a , b) = InputSheet.Cells(a, b)
  16. Next
  17. Next
  18. End Sub

It gives the error on the InputSheet argument of CopyCells sub. Both items are declared as the same type. Any ideas

I’ve had this happening on strings and other types as well. Changing it to variant (in the called sub) usually solves it, but it’s not a very nice and clean solution.

Re: Byref argument type mismatch

in the private sub you do not declarethem the same.

Dim InputSheetName as string, OutputSheetName As String

In formulae, depending on your locale, you might have to replace [B] ; with , or vice versa.[/B]

Re: Byref argument type mismatch

Thanx, that does it. I allways thought that the statement

dim a,b as integer would declare them both as integer.

Re: Byref argument type mismatch

hi can any one help me how can i ask a question ? a new thread??

Re: Byref argument type mismatch

  1. Dim InputSheet, OutputSheet As Worksheet
  2. Dim InputSheetName, OutputSheetName As String

Only the LAST argument is assigned others are variant

hi can any one help me how can i ask a question ? a new thread??

Triumph without peril brings no glory: Just try

Re: Byref argument type mismatch

I get this «ByRef Argument Type Mismatch» error on function getNonUniqueRecord calling, by argument «day»:

  1. Private Function getNonUniqueRecord(day As String) As Integer
  2. If listExtra.ListCount = 0 Then
  3. getNonUniqueRecord = -1
  4. Else
  5. Dim iter As Integer
  6. iter = -1
  7. Do
  8. iter = iter + 1
  9. Loop Until iter = listExtra.ListCount + 1 Or Trim(M >
  10. If iter = listExtra.ListCount + 1 Then iter = -1
  11. getNonUniqueRecord = iter
  12. End If
  13. End Function
  14. Private Sub addExtraToList(day, month, tim, ob1, ob2, reason As String)
  15. Dim res As String
  16. Dim duplicateIndex As Integer
  17. ‘find index in list by day
  18. duplicateIndex = getNonUniqueRecord(day) ‘returns index = -1 if not found or if list is empty
  19. res = day + » » + Mid(month, 1, 3) + » tim: » + tim
  20. If ob1 <> «» And ob1 <> «0» Then res = res + » OB1: » + ob1
  21. If ob2 <> «» And ob2 <> «0» Then res = res + » OB2: » + ob2
  22. res = res + » » + reason
  23. ‘if duplicate not found
  24. If duplicateIndex = -1 Then
  25. listExtra.AddItem res
  26. ‘else modify existing
  27. Else
  28. ‘delete it and insert new on the same place
  29. listExtra.RemoveItem (duplicateIndex)
  30. listExtra.AddItem res, duplicateIndex
  31. End If
  32. End Sub
Читать еще:  Минус в таблице excel

If I declare arguments (in Sub and Function) as Variant, then VBA throws «Run-time error ’13’: Type mismatch»
(it doesn’t mark error place in this case, but when I comment second condition in «Loop Until» with «day» parameter usage, this error disappears.)

The only one choice is to write this function «getNonUniqueRecord» as plain code in sub «addExtraToList», but I try to avo />

I hope you guys can help me. Thanks in advance!

Re: Byref argument type mismatch

Ello one more time!

Using of ByVal in front of parameter helped. Of course, I wrote completely wrong iteration of listBox, but the main problem was solved exactly after ByVal.

  1. Private Function getNonUniqueRecord(ByVal day As String) As Integer getNonUniqueRecord = -1 Dim str As String Dim iter As Long For iter = 0 To Me.listExtra.ListCount — 1 str = Me.listExtra.Column(0, iter) If Trim(M >

Re: Byref argument type mismatch

Please read the rules. Start your own thread if you have questions.

Re: Byref argument type mismatch

Thanx, that does it. I allways thought that the statement

dim a,b as integer would declare them both as integer.

This statement clears it up completely. I thought the same thing!
Dim a, b as integer

ByRef Argument Type Mismatch — problem with Range.

LinkBack
Thread Tools
Rate This Thread
Display
  • Linear Mode
  • Switch to Hybrid Mode
  • Switch to Threaded Mode

ByRef Argument Type Mismatch — problem with Range.

I have three functions .
The main function which gets called from Workbook is «getRefi»| (as given below).
it s second line — SecuredLastRange = getLastValueInList(SecuredFirstRange) — throws the error, Can you please tell me what is worng in my VBA code ?

Public Function getRefi(rownum As Integer) As String
SecuredFirstRange = Sheets(«Data»).Range(«K5»)
SecuredLastRange = getLastValueInList(SecuredFirstRange) — This line throws , ByRef Argument Type mismatch
End Function

Public Function getLastValueInList(TimeBucketData As Range) As Range
Do While hasNextRow(TimeBucketData)
TimeBucketData = TimeBucketData.Offset(1, 0)
Loop
getLastValueInList = TimeBucketData
End Function

Public Function hasNextRow(rownum As Range) As Boolean
If rownum.Offset(1, 0) <> «» Then
hasNextRow = False
Else
hasNextRow = True
End If
End Function

Re: ByRef Argument Type Mismatch — problem with Range.

please add code tags to your post

Читать еще:  Арктангенс в excel

you have not declared the variable as a range or assigned a range to it

if at first you don’t succeed try doing it the way your wife told you to

Re: ByRef Argument Type Mismatch — problem with Range.

Thanks a lot , it s been resolved.
If you can resolve one confusion over this issue.
Do we need to declare all the variables using «Dim» in EXCEL VBA and set their valye using «Set»? As many times i do not declare them but still it works and with «Set» i used to set the values.

Last edited by syparth; 04-15-2013 at 08:26 AM . Reason: i forgot to add something

Re: ByRef Argument Type Mismatch — problem with Range.

generally you don’t need to but it is recommended by most

if you wish to pass data byref to your routines and that type is not Variant then you will need to declare it (if the data needs to be changed by the called routine)

Re: ByRef Argument Type Mismatch — problem with Range.

Re: ByRef Argument Type Mismatch — problem with Range.

you have to use Set when you are dealing with object variables (like ranges, worksheets, workbooks) but not with data types (integers, strings, dates)

Re: ByRef Argument Type Mismatch — problem with Range.

Ok, Thanks,
I edited to add «Set» question.
Thank you very much.

Re: ByRef Argument Type Mismatch — problem with Range.

For Object types (eg Range, Worksheet) you need to use the Set keyword. There’s a Let keyword for literal types (eg String, Integer) but it’s optional and is usually omitted in VBA code.

If you have an Option Explicit statement at the top of your code module then you must declare your variables. This is a good practice because declaring your variables will help you avoid hard to spot errors in your code such as typos and it will improve your understanding of what the code is really doing. Using Option Explicit can be a bit frustrating when you first start writing VBA because the VBA IDE might complain and give you some compile errors: I encourage you to persevere with it and we are always here to help you if you’re not sure what the problem is. You’ll be a better coder for it.

Hope that helps,

Re: ByRef Argument Type Mismatch — problem with Range.

Thank you so much for kind support.
I thank this forum.

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