Byref argument type mismatch vba что это
Перейти к содержимому

Byref argument type mismatch vba что это

Несоответствие типа аргумента ByRef

Аргумент, передаваемый ByRef (по ссылке), значение по умолчанию, должен иметь точный тип данных, ожидаемый в процедуре. Эта ошибка имеет следующие причину и решение:

Был передан аргумент с типом, не приведенный к ожидавшемуся типу.

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

Например, чтобы передать аргумент типа Variant MyVar процедуре, ожидающей аргумент типа Integer, соответствующий вызов можно записать следующим образом:

Размещение непосредственно самого аргумента в скобках принудительным образом оценивает его как выражение. Во время этого оценивания дробная часть числа округляется (не посредством усечения), чтобы обеспечить соответствие ожидаемому типу аргумента. Результат оценивания помещается во временное расположение, а ссылка на это временное размещение получается процедурой. Таким образом исходный аргумент MyVar сохраняет свое значение.

Если не требуется задавать тип для переменной, данная переменная получает тип по умолчанию, Variant. Это очевидно не во всех случаях. Например, в приведенном ниже коде объявляются две переменные: первая, MyVar , имеет тип Variant; вторая, AnotherVar , имеет тип Integer.

Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Как 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 in Excel VBA

I’m working with VBA. I wrote a user define function that takes a string , process it and return a cleaned string . I am not sure what is wrong with it. I am not able to call it and ask it to process my string and return it. I am thinking there are a mistake in the way I am defining or returning it.

And I use this function like this

Last name is a string variable, usually looks like this Lastname***** , and I am trying to remove all the stars behind it. Have it return Lastname without the stars.

I received Compile error: ByRef arugment type mismatch when I tried to run this. I am using Windows XP with Office 2003.

EDIT: I added the basic struction of the code I have, I have about 20 lines of the similar code. Doing the same thing for each field I need.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *