1. ホーム
  2. vba

[解決済み】Excel VBAのByRef引数の型の不一致

2022-01-30 13:46:30

質問

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)

Last name は文字列変数で、通常は次のようになります。 Lastname***** で、その後ろにある星を全部消そうとしているのです。その際 Lastname を星なしで表示します。

受け取った Compile error: ByRef arugment type mismatch を実行しようとしたところ Windows XPにOffice 2003を使用しています。

EDIT: 私が持っているコードの基本的な構造を追加しました。必要な各フィールドに同じことを行っています。

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)

解決方法は?

が設定されていないのではないでしょうか? last_name を呼び出し元で適切に設定する必要があります。

というステートメントで Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)

の場合のみ機能します。 last_name が文字列である場合、すなわち

Dim last_name as String

が呼び出し元のどこかに表示されます。

この理由は、VBAが変数で渡す 参照で はデフォルトで、呼び出し側と呼び出し側でデータ型が正確に一致しなければならないことを意味します。

2つの修正

1) 強制 ByVal -- 変数 ByVal を渡すように関数を変更します。
Public Function ProcessString(ByVal input_string As String) As String または

2) Dim varname -- put Dim last_name As String を使用する前に、呼び出し元で

(1) が機能するのは ByVal 関数に渡すときに input_string のコピーが取られ、正しいデータ型に変換されます。また、関数が呼び出し元の変数を変更できないため、プログラムの安定性にもつながります。