Remkomplekty.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 имеет встроенные функции для такого рода вещей:

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(Mid(listExtra.ListIndex(iter), 1, 2)) = CStr(day)
  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
Читать еще:  Vba цикл по ячейкам 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 avoid this coding style — it’s less readable.

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

ByRef Тип аргумента несоответствия Excel VBA — vba

Я использую Windows 7, Excel 2010, VBA. Я получаю сообщение об ошибке «ByRef Argument Type Mismatch». Я предполагаю, что это проблема с моим типом переменной. Я нашел много вопросов, таких как мои, но я не могу найти ничего, что помогло бы мне разобраться в моей проблеме.

Прототип вызываемой функции

  • 3
  • 4
  • 3 мар 2020 2020-03-03 01:04:22
  • User

4 ответа

Кажется, вам нужен массив строк, но, возможно, стоит упомянуть, что вы можете объявить строку с фиксированной шириной var.

  • 3 мар 2020 2020-03-03 01:04:23
  • Jeeped

Кажется, вам нужен массив строк, но, возможно, стоит упомянуть, что вы можете объявить строку с фиксированной шириной var.

  • 3 мар 2020 2020-03-03 01:04:23
  • Jeeped

Вы передаете массив в String . Измените подпись функции, чтобы принять Variant .

Параметр String может принимать только аргумент String 1 . Variant с другой стороны, может принимать что угодно — включая массив — но тогда вы захотите Assert что имеете дело с массивом, чтобы остановить выполнение (и предотвратить ошибку), если это не так.

Зачем использовать Variant для типизированного массива?

Использование типизированного массива будет работать, но типизированный массив не может быть принудительно применен к параметру Variant — это означает:

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

Изменение подписи на DoSomething(ByRef args As Variant) заставляет его работать. Все, что вам нужно сделать, это использовать значащее, описательное, множественное имя для параметров вашего варианта массива, так что, когда IntelliSense отображается при вызове этой процедуры, имя сообщает вам все, что вам нужно знать.

Но. «Вариант» — это зло!

В отличие от многих других языков, тип безопасности в VBA по существу является дымом и зеркалами. Variant — очень мощный инструмент и имеет свои применения — избегайте его, когда вы можете, не означает, что его можно разучить. Использование этого метода для передачи ссылок по массиву между процедурами не ухудшает читаемость кода, ремонтопригодность или стабильность. Variant включает утиную печать и позднюю привязку и является законным типом COM.

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

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

  • 3 мар 2020 2020-03-03 01:04:22
  • Mathieu Guindon

Вы передаете массив в String . Измените подпись функции, чтобы принять Variant .

Параметр String может принимать только аргумент String 1 . Variant с другой стороны, может принимать что угодно — включая массив — но тогда вы захотите Assert что имеете дело с массивом, чтобы остановить выполнение (и предотвратить ошибку), если это не так.

Зачем использовать Variant для типизированного массива?

Использование типизированного массива будет работать, но типизированный массив не может быть принудительно применен к параметру Variant — это означает:

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

Изменение подписи на DoSomething(ByRef args As Variant) заставляет его работать. Все, что вам нужно сделать, это использовать значащее, описательное, множественное имя для параметров вашего варианта массива, так что, когда IntelliSense отображается при вызове этой процедуры, имя сообщает вам все, что вам нужно знать.

Но. «Вариант» — это зло!

В отличие от многих других языков, тип безопасности в VBA по существу является дымом и зеркалами. Variant — очень мощный инструмент и имеет свои применения — избегайте его, когда вы можете, не означает, что его можно разучить. Использование этого метода для передачи ссылок по массиву между процедурами не ухудшает читаемость кода, ремонтопригодность или стабильность. Variant включает утиную печать и позднюю привязку и является законным типом COM.

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

Читать еще:  Excel vba value

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

Разбор ошибки Type Mismatch Error

Объяснение Type Mismatch Error

Type Mismatch Error VBA возникает при попытке назначить значение между двумя различными типами переменных.

Ошибка отображается как:
run-time error 13 – Type mismatch

Например, если вы пытаетесь поместить текст в целочисленную переменную Long или пытаетесь поместить число в переменную Date.

Давайте посмотрим на конкретный пример. Представьте, что у нас есть переменная с именем Total, которая является длинным целым числом Long.

Если мы попытаемся поместить текст в переменную, мы получим Type Mismatch Error VBA (т.е. VBA Error 13).

Давайте посмотрим на другой пример. На этот раз у нас есть переменная ReportDate типа Date.

Если мы попытаемся поместить в эту переменную не дату, мы получим Type Mismatch Error VBA.

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

Тем не менее, есть некоторые преобразования, которые VBA не может сделать:

Простой способ объяснить Type Mismatch Error VBA состоит в том, что элементы по обе стороны от равных оценивают другой тип.

При возникновении Type Mismatch Error это часто не так просто, как в этих примерах. В этих более сложных случаях мы можем использовать средства отладки, чтобы помочь нам устранить ошибку.

Использование отладчика

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

Вы можете использовать следующие шаги, чтобы помочь вам устранить любую Type Mismatch Error VBA.

  1. Запустите код, чтобы появилась ошибка.
  2. Нажмите Debug в диалоговом окне ошибки. Это выделит строку с ошибкой.
  3. Выберите View-> Watch из меню, если окно просмотра не видно.
  4. Выделите переменную слева от equals и перетащите ее в окно Watch.
  5. Выделите все справа от равных и перетащите его в окно Watch.
  6. Проверьте значения и типы каждого.
  7. Вы можете сузить ошибку, изучив отдельные части правой стороны.

Следующее видео показывает, как это сделать.

На скриншоте ниже вы можете увидеть типы в окне просмотра.

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

В следующих разделах показаны различные способы возникновения Type Mismatch Error VBA.

Присвоение строки числу

Как мы уже видели, попытка поместить текст в числовую переменную может привести к Type Mismatch Error VBA.

Ниже приведены некоторые примеры, которые могут вызвать ошибку:

Недействительная дата

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

В следующих примерах кода показаны все допустимые способы назначения даты, за которыми следуют случаи, которые могут привести к Type Mismatch Error VBA.

Ошибка ячейки

Тонкая причина Type Mismatch Error VBA — это когда вы читаете из ячейки с ошибкой, например:

Если вы попытаетесь прочитать из этой ячейки, вы получите Type Mismatch Error.

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

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

Вы можете использовать следующую функцию, чтобы сделать это:

Ниже приведен пример использования этого кода.

Неверные данные ячейки

Как мы видели, размещение неверного типа значения в переменной вызывает Type Mismatch Error VBA. Очень распространенная причина — это когда значение в ячейке имеет неправильный тип.

Пользователь может поместить текст, такой как «Нет», в числовое поле, не осознавая, что это приведет к Type Mismatch Error в коде.

Если мы прочитаем эти данные в числовую переменную, то получим
Type Mismatch Error VBA.

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

Вы можете использовать это так:

Имя модуля

Если вы используете имя модуля в своем коде, это может привести к
Type Mismatch Error VBA. Однако в этом случае причина может быть не очевидной.

Например, допустим, у вас есть модуль с именем «Module1». Выполнение следующего кода приведет к о
Type Mismatch Error VBA.

Различные типы объектов

До сих пор мы рассматривали в основном переменные. Мы обычно называем переменные основными типами данных.

Они используются для хранения одного значения в памяти.

В VBA у нас также есть объекты, которые являются более сложными. Примерами являются объекты Workbook, Worksheet, Range и Chart.

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

Коллекция Sheets

В VBA объект рабочей книги имеет две коллекции — Sheets и Worksheets. Есть очень тонкая разница.

  1. Worksheets — сборник рабочих листов в Workbook
  2. Sheets — сборник рабочих листов и диаграммных листов в Workbook
Читать еще:  Документ в формате excel

Лист диаграммы создается, когда вы перемещаете диаграмму на собственный лист, щелкая правой кнопкой мыши на диаграмме и выбирая «Переместить».

Если вы читаете коллекцию Sheets с помощью переменной Worksheet, она будет работать нормально, если у вас нет рабочей таблицы.

Если у вас есть лист диаграммы, вы получите
Type Mismatch Error VBA.

В следующем коде Type Mismatch Error появится в строке «Next sh», если рабочая книга содержит лист с диаграммой.

Массивы и диапазоны

Вы можете назначить диапазон массиву и наоборот. На самом деле это очень быстрый способ чтения данных.

Проблема возникает, если ваш диапазон имеет только одну ячейку. В этом случае VBA не преобразует arr в массив.

Если вы попытаетесь использовать его как массив, вы получите
Type Mismatch Error .

В этом сценарии вы можете использовать функцию IsArray, чтобы проверить, является ли arr массивом.

Заключение

На этом мы завершаем статью об Type Mismatch Error VBA. Если у вас есть ошибка несоответствия, которая не раскрыта, пожалуйста, дайте мне знать в комментариях.

ByRef Тип аргумента несоответствия Excel VBA — vba

Я использую Windows 7, Excel 2010, VBA. Я получаю сообщение об ошибке «ByRef Argument Type Mismatch». Я предполагаю, что это проблема с моим типом переменной. Я нашел много вопросов, таких как мои, но я не могу найти ничего, что помогло бы мне разобраться в моей проблеме.

Прототип вызываемой функции

  • 4
  • 4
  • 3 мар 2020 2020-03-03 01:04:22
  • User

4 ответа

Кажется, вам нужен массив строк, но, возможно, стоит упомянуть, что вы можете объявить строку с фиксированной шириной var.

  • 3 мар 2020 2020-03-03 01:04:23
  • Jeeped

Кажется, вам нужен массив строк, но, возможно, стоит упомянуть, что вы можете объявить строку с фиксированной шириной var.

  • 3 мар 2020 2020-03-03 01:04:23
  • Jeeped

Вы передаете массив в String . Измените подпись функции, чтобы принять Variant .

Параметр String может принимать только аргумент String 1 . Variant с другой стороны, может принимать что угодно — включая массив — но тогда вы захотите Assert что имеете дело с массивом, чтобы остановить выполнение (и предотвратить ошибку), если это не так.

Зачем использовать Variant для типизированного массива?

Использование типизированного массива будет работать, но типизированный массив не может быть принудительно применен к параметру Variant — это означает:

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

Изменение подписи на DoSomething(ByRef args As Variant) заставляет его работать. Все, что вам нужно сделать, это использовать значащее, описательное, множественное имя для параметров вашего варианта массива, так что, когда IntelliSense отображается при вызове этой процедуры, имя сообщает вам все, что вам нужно знать.

Но. «Вариант» — это зло!

В отличие от многих других языков, тип безопасности в VBA по существу является дымом и зеркалами. Variant — очень мощный инструмент и имеет свои применения — избегайте его, когда вы можете, не означает, что его можно разучить. Использование этого метода для передачи ссылок по массиву между процедурами не ухудшает читаемость кода, ремонтопригодность или стабильность. Variant включает утиную печать и позднюю привязку и является законным типом COM.

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

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

  • 3 мар 2020 2020-03-03 01:04:22
  • Mathieu Guindon

Вы передаете массив в String . Измените подпись функции, чтобы принять Variant .

Параметр String может принимать только аргумент String 1 . Variant с другой стороны, может принимать что угодно — включая массив — но тогда вы захотите Assert что имеете дело с массивом, чтобы остановить выполнение (и предотвратить ошибку), если это не так.

Зачем использовать Variant для типизированного массива?

Использование типизированного массива будет работать, но типизированный массив не может быть принудительно применен к параметру Variant — это означает:

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

Изменение подписи на DoSomething(ByRef args As Variant) заставляет его работать. Все, что вам нужно сделать, это использовать значащее, описательное, множественное имя для параметров вашего варианта массива, так что, когда IntelliSense отображается при вызове этой процедуры, имя сообщает вам все, что вам нужно знать.

Но. «Вариант» — это зло!

В отличие от многих других языков, тип безопасности в VBA по существу является дымом и зеркалами. Variant — очень мощный инструмент и имеет свои применения — избегайте его, когда вы можете, не означает, что его можно разучить. Использование этого метода для передачи ссылок по массиву между процедурами не ухудшает читаемость кода, ремонтопригодность или стабильность. Variant включает утиную печать и позднюю привязку и является законным типом COM.

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

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

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×