Как перебрать строку и проверить значение байта каждого символа? - PullRequest
5 голосов
/ 17 сентября 2008

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

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.

Ответы [ 7 ]

12 голосов
/ 17 сентября 2008

Я считаю, что ваша проблема в том, что в 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
3 голосов
/ 17 сентября 2008

С 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
2 голосов
/ 17 сентября 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
0 голосов
/ 17 сентября 2008

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

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

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

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

0 голосов
/ 17 сентября 2008

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

For iter = 1 To Len(cell_val)

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

0 голосов
/ 17 сентября 2008

Попробуйте AscW ()

0 голосов
/ 17 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...