¿Cómo iterar a través de una cadena y verificar el valor de byte de cada carácter?
Pregunta
Código que tengo:
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
Este código no funciona.Alguien sabe cómo hacer esto?Simplemente no tengo idea de VB o VBA.
Solución
Creo que su problema es que en VBA los índices de cadenas comienzan en 1 y no en 0.Pruebe lo siguiente:
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
Otros consejos
Con VBA, VB6 puede simplemente declarar una matriz de bytes y asignarle un valor de cadena y se convertirá por usted.Luego puedes simplemente iterarlo como una matriz normal.
p.ej.
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
Su ejemplo debe modificarse para que no tenga dependencias externas; ahora depende de Nz y addLog.
De todos modos, el problema aquí parece ser que estás haciendo un bucle de 0 a len()-1.En VBA esto sería 1 an.
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
¿Lo depuraste?;) ¿Estás seguro de que cell_val no está vacío?Además, no necesita el 'Paso 1' en el bucle For ya que es el valor predeterminado.Además, ¿qué esperas lograr con tu código?¿Registra si algún valor ascii está por encima de 127?Pero eso es todo: ¿no hay ramificación según el resultado?
Pruebe AscW()
¿Lo depuraste?;) ¿Estás seguro de que el Cell_Val no está vacío?Además, no necesita el 'Paso 1' en el bucle for ya que es predeterminado.Además, ¿qué espera que acomode con su código?¿Registra si hay valores ASCII por encima de 127?Pero eso es todo, ¿no hay ramificaciones dependiendo del resultado?
No lo depuré, no tengo idea de cómo usar vba ni ninguna de las herramientas que lo acompañan.Sí, estoy seguro de que cell_val no está vacío.El código era representativo, me aseguraba de que la condición de la rama funcionara antes de escribir la rama misma.
Creo que su problema es que en VBA los índices de cadenas comienzan en 1 y no en 0.
Ah, el tipo exacto de cosas que acompañan a vba y que seguramente me perdería, gracias.
Las cadenas VB/VBA se basan en uno en lugar de cero, por lo que es necesario utilizar:
For iter = 1 To Len(cell_val)
También he dejado fuera el step 1
ya que ese es el valor predeterminado.