Как перебрать строку и проверить значение байта каждого символа?
Вопрос
Код у меня есть:
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 начинаются с 1, а не с 0.Попробуйте следующее:
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 не пуст?Также вам не нужен «Шаг 1» в цикле For, поскольку он используется по умолчанию.И чего вы ожидаете достичь с помощью своего кода?Он регистрирует, превышают ли какие-либо значения ascii 127?И всё - нет ветвления в зависимости от результата?
Попробуйте АскВ()
Вы его отладили?;) Вы уверены, что Cell_Val не пуст?Кроме того, вам не нужен «Шаг 1» в цикле FO, так как это по умолчанию.Кроме того, что вы ожидаете от своего кода?Он регистрирует, если какие -либо значения ASCII выше 127?Но это все - нет ветвления в зависимости от результата?
Я не отлаживал его и понятия не имею, как использовать vba или какие-либо инструменты, которые с ним связаны.Да, я уверен, что cell_val не пуст.Код был репрезентативным, я проверял, работает ли условие ветвления, прежде чем писать саму ветку.
Я считаю, что ваша проблема в том, что индексы строк VBA начинаются с 1, а не с 0.
Ах, это именно та вещь, которая связана с vba, и которую мне наверняка не хватало, спасибо.
Строки VB/VBA основаны на единице, а не на нуле, поэтому вам необходимо использовать:
For iter = 1 To Len(cell_val)
Я также отказался от step 1
поскольку это значение по умолчанию.