Как перебрать строку и проверить значение байта каждого символа?

StackOverflow https://stackoverflow.com/questions/80427

Вопрос

Код у меня есть:

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 поскольку это значение по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top