Como iterar uma string e verificar o valor do byte de cada caractere?
Pergunta
Código que tenho:
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 não funciona.Alguém sabe como fazer isto?Simplesmente não tenho ideia do VB ou do VBA.
Solução
Acredito que o seu problema é que no VBA os índices de strings começam em 1 e não em 0.Experimente o seguinte:
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
Outras dicas
Com VBA, VB6 você pode simplesmente declarar uma matriz de bytes e atribuir um valor de string a ela e ela será convertida para você.Então você pode simplesmente iterá-lo como um array normal.
por exemplo.
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
Seu exemplo deve ser modificado para não ter dependências externas, agora depende de Nz e addLog.
De qualquer forma, o problema aqui parece ser que você está fazendo um loop de 0 para len()-1.No VBA, isso seria 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
Você depurou?;) Tem certeza de que cell_val não está vazio?Além disso, você não precisa da 'Etapa 1' no loop For, pois é o padrão.Além disso, o que você espera realizar com seu código?Ele registra se algum valor ASCII está acima de 127?Mas é isso - não há ramificação dependendo do resultado?
Experimente AscW()
Você depurou?;) Tem certeza de que o cell_val não está vazio?Além disso, você não precisa do 'Passo 1' no loop For já que é padrão.Também o que você faz Espera cumprir com o seu código?Ela Logs se algum valor ASCII estiver acima 127?Mas é isso - não há ramificação dependendo do resultado?
Não depurei, não tenho ideia de como usar o vba ou qualquer uma das ferramentas que o acompanham.Sim, tenho certeza de que cell_val não está vazio.O código era representativo, eu estava garantindo que a condição do branch funcionasse antes de escrever o próprio branch.
Acredito que o seu problema é que no VBA os índices de strings começam em 1 e não em 0.
Ah, o tipo exato de coisa que acompanha o vba e que eu certamente sentiria falta, obrigado.
As strings VB/VBA são baseadas em um em vez de zero, então você precisa usar:
For iter = 1 To Len(cell_val)
Eu também deixei de lado step 1
já que esse é o padrão.