2013-05-17 15 views
12

私はVBAで作業しています。私はstringを取り、それを処理してきれいにされたstringを返すユーザ定義関数を書いた。私は何が間違っているのか分かりません。私はそれを呼び出すことができず、私の弦を処理してそれを返すように頼むことができません。私はそれを定義したり返す方法に間違いがあると思っています。ExcelでのByRef引数の型の不一致VBA

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が届きました。私はOffice 2003でWindows XPを使用しています。

編集:私が持っているコードの基本的な手順を追加しました。私は同様のコードの約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) 
+3

rフラグ? – Gaffi

+0

私はそれを呼んだとき、それはライン上に羽ばたく。 'Worksheets(data_sheet).Range(" C2 ")。Value = ProcessString(last_name)' – George

答えて

29

last_nameを発信者に正しく設定していないと思われます。声明Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)

last_nameが文字列である場合にのみ動作しますと

、すなわち

Dim last_name as String 

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

この理由は、VBAは、データ型は、発呼者と被呼者との間で正確に一致しなければならないことを意味する、デフォルトで参照によって変数に渡すことです。

二つの修正:

1)Public Function ProcessString(ByVal input_string As String) As String

2にあなたの関数を変更して)あなたはそれを使用する前に、発信者にDim last_name As Stringを置きます。

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

+0

ありがとう! 'ByVal'を追加することで問題は解決しました。コードは正常に動作します! – George

+1

安定性が向上するので、私はいつもByValですべてのVBA関数を宣言します。 Javaでは、選択肢はありません。すべてが価値によって渡されます。 – Bathsheba

2

文字列を一度に1文字ずつループすることは実用的な方法ですが、必要はありません。 VBAが組み込まれているこの種のもののための機能:

Public Function ProcessString(input_string As String) As String 
    ProcessString=Replace(input_string,"*","") 
End Function 
+0

これは本当に良い解決策です。しかし、問題を解決する方法を教えていただけますか?私は何が間違っているのか把握しようとしているからです。ありがとうございました! – George

3

を私はOption Explicitで動作するようにいくつかのことを変更し、コードが"abc.12,"を返さ"abc.123"を含むセルに対する罰金走りました。コンパイルエラーはありませんでした。

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がStringであると述べましたが、そうでないかもしれません。行ごとにコードをステップ実行し、実際にこれが正しいことを確認します。

+0

私はMissed Dim文を追加した後、私は 'Private Sub CommandButton2_Click()'を持っている行をプロンプト(強調表示)し、 'last_name'も強調表示します。非常に奇妙な行動、私のSubは基本的に物事のリストを行うbuttomです。 – George

+0

見逃したDim文を指摘してくれてありがとう! – George

5

なぜか分かりませんが、他のプロシージャや関数に変数(変数として)を渡す場合は、変数を別々に宣言することが非常に重要です。

たとえば、ID番号と部品番号情報に基づいてデータを操作する手順があります。 IDは定数として、他の2つの引数は変数です。

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 

をし、次の1にも取り組んでいる。

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

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

End sub 
+1

はい、これは私の問題でした。 VBA - 混乱する。それは「アクセス可能」である必要があります。 – Eric

+0

私は自分の心を失っていた、私はこれを必要と信じられない、ありがとう。 –

0

何かがその文字列を試してみると間違っていますこのように:

Worksheets(data_sheet).Range("C2").Value = ProcessString(CStr(last_name)) 
関連する問題