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

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

Public Function ProcessString(input_string As String) As String
    ' The temp string used throughout the function
    Dim temp_string As String

    For i = 1 To Len(input_string)
        temp_string = Mid(input_string, i, 1)
        If temp_string Like "[A-Z, a-z, 0-9, :, -]" Then
            return_string = return_string & temp_string
        End If
    Next i
    return_string = Mid(return_string, 1, (Len(return_string) - 1))
    ProcessString = return_string & ", "
End Function

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

Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)

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

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

РЕДАКТИРОВАТЬ: я добавил базовую структуру кода, у меня есть, около 20 строк аналогичного кода. Делать то же самое для каждого поля мне нужно.

Private Sub CommandButton2_Click()
' In my original production code I have a chain of these
' Like this Dim last_name, first_name, street, apt, city, state, zip As String
Dim last_name As String

' I get the last name from a fixed position of my file. Because I am 
' processing it from another source which I copied and pasted into excel
last_name = Mid(Range("A4").Value, 20, 13)

' Insert the data into the corresponding fields in the database worksheet
Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
 George17 мая 2013 г., 16:39
Он вспыхнул на линии, когда я звоню.Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)
 Gaffi17 мая 2013 г., 16:37
На какой строке отображается ошибка?

Ответы на вопрос(5)

Worksheets(data_sheet).Range("C2").Value = ProcessString(CStr(last_name))

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

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

Public Sub GetPNQty(ByVal ID As String, PartNumber As String, Quantity As Long)

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

Sub KittingScan()  
Dim BoxPN As String
Dim BoxQty, BoxKitQty As Long

  Call GetPNQty(InputBox("Enter ID:"), BoxPN, BoxQty) 

End sub

и следующий тоже работает:

Sub KittingScan()
Dim BoxPN As String
Dim BoxQty As Long
Dim BoxKitQty As Long

  Call GetPNQty(InputBox("Enter ID:"), BoxPN, BoxQty)

End sub
 user229438223 янв. 2019 г., 00:32
Это должен быть ответ
 Kar.ma02 мар. 2018 г., 12:49
Я схожу с ума, я не могу поверить, что мне это нужно, спасибо.
 Eric08 февр. 2017 г., 05:29
Да, это была моя проблема. VBA - так запутанно. Должно быть, потому что этодоступный.
 cladelpino06 апр. 2018 г., 12:15
Однострочные объявления не работают, как мы думали !!!! :stackoverflow.com/a/34036529/4316542
Решение Вопроса

last_name правильно в звонилке.

С утверждениемWorksheets(data_sheet).Range("C2").Value = ProcessString(last_name)

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

Dim last_name as String

появляется в звонилке где-то.

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

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

1)Force ByVal - Измените вашу функцию, чтобы передать переменную ByVal:

Public Function ProcessString(ByVal input_string As String) As String, или же

2)Dim Varname -- положилDim last_name As String в вызывающей, прежде чем использовать его.

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

 George17 мая 2013 г., 17:03
Спасибо! ДобавлениеByVal исправил проблему, теперь код работает нормально!
 Bathsheba17 мая 2013 г., 17:07
Я всегда объявляю все свои функции VBA с ByVal, поскольку это улучшает стабильность. С Java у вас нет выбора, все передается по значению.

чтобы работать сOption Explicitи код работал нормально против ячейки, содержащей"abc.123", который вернулся"abc.12,", Не было ошибок компиляции.

Option Explicit ' This is new

Public Function ProcessString(input_string As String) As String
    ' The temp string used throughout the function
    Dim temp_string As String
    Dim i As Integer ' This is new
    Dim return_string As String ' This is new
    For i = 1 To Len(input_string)
        temp_string = Mid(input_string, i, 1)
        If temp_string Like "[A-Z, a-z, 0-9, :, -]" Then
            return_string = return_string & temp_string
        End If
    Next i
    return_string = Mid(return_string, 1, (Len(return_string) - 1))
    ProcessString = return_string & ", "
End Function

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

 George17 мая 2013 г., 16:46
После того, как я добавил пропущенный оператор Dim, он вызвал (выделил) строку, где у меня естьPrivate Sub CommandButton2_Click()а такжеlast_name выделено Очень странное поведение, мой Sub - это, в общем-то, основа, делающая список вещей.
 George17 мая 2013 г., 17:04
Спасибо за указание на пропущенное димное заявление!

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

Public Function ProcessString(input_string As String) As String
    ProcessString=Replace(input_string,"*","")
End Function
 George17 мая 2013 г., 16:35
Тот'Это действительно хорошее решение. Но не могли бы вы показать мне, как решить проблему? Потому что я тоже пытаюсь понять, что я сделал не так. Спасибо!

Ваш ответ на вопрос