文字列を反復処理してすべての文字のバイト値をチェックするにはどうすればよいですか?
質問
私が持っているコード:
cell_val = CStr(Nz(fld.value, ""))
Dim iter As Long
For iter = 0 To Len(cell_val) - 1 Step 1
If Asc(Mid(cell_val, iter, 1)) > 127 Then
addlog "Export contains ascii character > 127"
End If
Next iter
このコードは機能しません。これを行う方法を知っている人はいますか?VB や VBA についてはまったくわかりません。
解決
あなたの問題は、VBA 文字列インデックスが 0 ではなく 1 から始まることだと思います。次のことを試してください。
For iter = 1 To Len(cell_val)
If Asc(Mid(cell_val, iter, 1)) > 127 Then
addlog "Export contains ascii character > 127"
End If
Next
他のヒント
VBA、VB6 では、バイト配列を宣言し、それに文字列値を割り当てるだけで変換されます。その後、通常の配列と同様にそれを反復処理するだけです。
例えば
Dim b() as byte
Dim iter As Long
b = CStr(Nz(fld.value, ""))
For iter = 0 To UBound(b)
if b(iter) > 127 then
addlog "Export contains ascii character > 127"
end if
next
あなたの例は、外部依存関係がないように変更する必要があります。現在は、Nz と addLog に依存しています。
とにかく、ここでの問題は、0 から len()-1 までループしていることのようです。VBA では、これは 1 から n になります。
Dim cell_val As String
cell_val = "øabcdæøå~!#%&/()"
Dim iter As Long
For iter = 1 To Len(cell_val)
If Asc(Mid(cell_val, iter, 1)) > 127 Then
'addlog "Export contains ascii character > 127"
Debug.Print iter, "Export contains ascii character > 127"
End If
Next iter
デバッグしましたか?;) cell_val が空ではないでしょうか?また、For ループの「ステップ 1」はデフォルトであるため必要ありません。また、コードで何を達成することを期待していますか?ASCII 値が 127 を超えるかどうかをログに記録します。でもそれだけです - 結果に応じた分岐はありません?
AscW() を試してください
デバッグしましたか?;)Cell_valが空でないと確信していますか?また、デフォルトであるため、forループに「ステップ1」は必要ありません。また、あなたはあなたのコードで何が不足していると思いますか?ASCII値が127を超えている場合にログを記録しますか?しかし、それだけです - 結果に応じて分岐はありませんか?
デバッグはしなかったので、vba やそれに関連するツールの使い方がわかりません。はい、cell_val が空ではないことは確かです。コードは代表的なもので、分岐自体を記述する前に分岐条件が機能することを確認していました。
あなたの問題は、VBA 文字列インデックスが 0 ではなく 1 から始まることだと思います。
ああ、まさに私が見逃していた VBA に関連するものですね、ありがとう。
VB/VBA 文字列は 0 ではなく 1 から始まるため、次のものを使用する必要があります。
For iter = 1 To Len(cell_val)
私もやめました step 1
それがデフォルトだから。