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

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

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.


person bfabry    schedule 17.09.2008    source источник


Ответы (6)


Я считаю, что ваша проблема в том, что в строковых индексах 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
person jan.vdbergh    schedule 17.09.2008

С VBA, VB6 вы можете просто объявить массив байтов и присвоить ему строковое значение, и оно будет преобразовано для вас. Затем вы можете просто перебирать его, как обычный массив.

e.g.

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
person Sam    schedule 17.09.2008

Ваш пример должен быть изменен, чтобы он не имел внешних зависимостей, теперь он зависит от 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
person vzczc    schedule 17.09.2008

Вы его отладили? ;) Вы уверены, что cell_val не пуст? Также вам не нужен «Шаг 1» в цикле For, поскольку он используется по умолчанию. И что вы ожидаете от своего кода? Он регистрирует, если какие-либо значения ascii превышают 127? Но и все - нет ветвления в зависимости от результата?

person Per Hornshøj-Schierbeck    schedule 17.09.2008
comment
Я подозреваю, что он привел простой пример, посвященный проблеме. И хотя шаг 1 используется по умолчанию, нет ничего плохого в том, чтобы оставить его там, чтобы сделать код более понятным для читателя. - person ahockley; 17.09.2008

Вы его отладили? ;) Вы уверены, что cell_val не пуст? Также вам не нужен «Шаг 1» в цикле For, поскольку он используется по умолчанию. И что вы ожидаете от своего кода? Он регистрирует, если какие-либо значения ascii превышают 127? Но и все - нет ветвления в зависимости от результата?

Я не отлаживал его, я понятия не имею, как использовать vba или какие-либо инструменты, которые с ним работают. Да, я уверен, что cell_val не пуст. Код был репрезентативным, я проверял, работает ли условие ветки, прежде чем писать саму ветку.

Я считаю, что ваша проблема в том, что в строковых индексах VBA начинается с 1, а не с 0.

Ах, именно то, что связано с vba, что я должен был пропустить, спасибо.

person bfabry    schedule 17.09.2008

Строки VB/VBA основаны на единице, а не на нуле, поэтому вам нужно использовать:

For iter = 1 To Len(cell_val)

Я также отказался от step 1, так как это значение по умолчанию.

person paxdiablo    schedule 17.09.2008