2008-09-17 20 views

Respuesta

12

Creo que su problema es que en VBA índices de cadenas comienzan en 1 y no a 0. intente 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 
0

Quizás quiso depurarlo? ;) ¿Estás seguro de que cell_val no está vacío? Además, no necesita el 'Paso 1' en el bucle For porque es el predeterminado. Además, ¿qué esperas cumplir con tu código? Se registra si los valores ascii están por encima de 127? Pero eso es todo, ¿no hay ramificación según el resultado?

+0

Sospecho que proporcionó un ejemplo simple centrado en el problema. Y mientras que el "Paso 1" es el predeterminado, no hay daño dejándolo allí para que el código sea más claro para el lector. – ahockley

0

AscW Try()

cadenas
0

VB/VBA se basan de una vez de cero, por lo que es necesario utilizar:

For iter = 1 To Len(cell_val) 

También he dejado fuera de la step 1 ya que es el valor predeterminado.

2

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 pasando de 0 a len() - 1. En VBA esto sería de 1 a 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 
0

Quizás quiso depurarlo? ;) ¿Estás seguro de que cell_val no está vacío? Además, no necesita necesita el 'Paso 1' en el bucle For ya que es el predeterminado. Además, ¿qué espera cumplir con su código? Es registros si los valores ascii están por encima de 127? Pero eso es todo, ¿no hay una ramificación dependiendo del resultado?

No lo depuré, no tengo idea de cómo usar vba o cualquiera 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 rama funcionara antes de escribir la rama.

Creo que su problema es que en VBA índices de cadenas comienzan en 1 y no a 0.

Ah, el tipo exacto de lo que va junto con VBA que estaba obligado a perderse, gracias tú.

3

Con VBA, VB6 puede declarar una matriz de bytes y asignarle un valor de cadena y se convertirá para usted. Luego puede iterar a través de él como una matriz regular.

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 
Cuestiones relacionadas