質問

今日の早く尋ねた答えを通して、以下の機能が与えられました。

私がしようとしているのは、VBAを使用してExcelの文字列から文字を削除することです。ただし、機能が実行されるときはいつでも、保存された値を消去し、#!VALUEエラーを返します。何が起こっているのかを把握するようです。代替案を説明する誰もが注意してください:

Function ReplaceAccentedCharacters(S As String) As String
    Dim I As Long

With WorksheetFunction
For I = 1 To Len(S)
    Select Case Asc(Mid(S, I, 1))
        ' Extraneous coding removed. Leaving the examples which 
        ' do work and the one that is causing the problem.
        Case 32
            S = .Replace(S, I, 1, "-")
        Case 94
            S = .Replace(S, I, 1, "/")

        ' This is the coding that is generating the error.
        Case 34
            S = .Replace(S, I, 1, "")
        End Select

    Next I

End With

ReplaceAccentedCharacters = S

End Function
.

文字列に"(または16進数22)が含まれている場合は、引用符を削除することになっています。ただし、代わりに、Excelはそれを無視し、それでも"マークを返します。

私は先に進み、.Replace()句を別の値と置き換えました。

        Case 34
            S = .Replace(S, I, 1, "/")
        End Select
.

上記のコードを使用すると、スクリプトは「A / P」を「A /」に置き換えます。

スタックオーバーフローで次の例をここに見つけました。 https://stackoverflow.com/a/7386565/692220

と答えに与えられた答えでは、私が与えたものと同じ正確なコード例があり、何もしません。 Excelはまだ引用符を無視しています。私は巻き毛の中かっこで定義を拡大していてもまだ何も得られなかったことさえありました。

役に立ちましたか?

解決

この機能は、ある文字を別の文字に置き換えるように設計されています。文字を何も置き換えるようには設計されていませんでした。文字を何も置き換えようとすると、単語を繰り返すためのカウンタが単語の長さよりも大きい文字位置について(最後の反復)を見ることができることです。それは何も返し、あなたがASCを決定しようとしたら(<< EM> Nothing >)エラーが発生します。コードが実行されている間に文字列の長さが変更されたときに、置換ルーチン内の他のエラーも発生します。

文字を何も置き換えるためにルーチンを変更するには、次のことをお勧めします。

ケースステートメント:

Case 34
        S = .Replace(S, I, 1, Chr(1))
.

と割り当て文に:

ReplaceAccentedCharacters = Replace(S, Chr(1), "")
.

VBA REPLACEはワークシート機能交換

と異なることに注意してください。

他のヒント

これを試してみてください:

Function blah(S As String) As String
    Dim arr, i

    'array of [replace, with], [replace, with], etc
    arr = Array(Chr(32), "-", Chr(94), "/", Chr(34), "")

    For i = LBound(arr) To UBound(arr) Step 2
        S = Replace(S, arr(i), arr(i + 1))
    Next i

    blah = S
End Function
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top