If b(0) < 65 Or b(0) > 90 Then End
If b(0) <= 65 Or b(0) => 90 Then End
If b(l) < 48 Or b(l) > 57 Then End
b() = StrConv(y, vbFromUnicode)
If UBound(b()) > 0 Then
Debugger писал(а):Программа начинена хитрокодом. В плохом смысле хитрокодом.
- Код: Выделить всё
If b(0) < 65 Or b(0) > 90 Then End
Плохо
- Код: Выделить всё
If b(0) <= 65 Or b(0) => 90 Then End
Так лучше.
- Код: Выделить всё
If b(l) < 48 Or b(l) > 57 Then End
Опять же.
- Код: Выделить всё
b() = StrConv(y, vbFromUnicode)
If UBound(b()) > 0 Then
Тут можно было проще.
Option Explicit
Sub Main()
Dim x As String
Dim b() As Byte, z As Byte
Dim l As Byte, y As Integer
x = GetSetting(App.Title, "setup", "snum", "")
loop_:
x = UCase(Trim(InputBox("Введите номер купюры Евро (букву и одиннадцать цифр):", "Проверка Евро на поддлинность по номеру", x)))
If Len(x) <> 12 Then End
b() = StrConv(x, vbFromUnicode)
If b(0) < 65 Or b(0) > 90 Then End
y = b(0) - 64
z = 1
repl:
For l = z To UBound(b())
If b(l) < 48 Or b(l) > 57 Then End
y = y + b(l) - 48
Next l
b() = StrConv(y, vbFromUnicode)
If UBound(b()) > 0 Then
z = 0
y = 0
GoTo repl
End If
Erase b()
If y = 8 Then
If MsgBox("Купюра с таким номером имеет право на жизнь" & vbCrLf & vbCrLf & "Повторим?", vbSystemModal + vbYesNo + vbDefaultButton2) = vbYes Then GoTo loop_
Else
If MsgBox("Либо вы ввели не верно номер либо купюра с номером " & x & " ПОДДЕЛКА!" & vbCrLf & vbCrLf & "Повторим?", vbExclamation + vbSystemModal + vbYesNo + vbDefaultButton2) = vbYes Then GoTo loop_
End If
SaveSetting App.Title, "setup", "snum", x
End
End Sub
Debugger писал(а):If b(0) <= 65 Or b(0) => 90 Then End
Dim b() As Byte, summ As Byte, c As Byte
b = UCase(InputBox("Введите серийный номер")) '"X04017624905" например
If ((UBound(b) <> 23) Or (b(0) < 65) Or (b(0) > 90)) Then Exit Sub
summ = b(0) - 64 '65=Asc("A")
For c = 2 To 22 Step 2
If ((b(c) < 48) Or (b(c) > 58)) Then Exit Sub
summ = summ + b(c) - 48 '48=Asc("0")
Next 'Максимум в summ трехзначное число.
summ = (summ \ 100) + (summ Mod 100) \ 10 + (summ Mod 10) 'Выглядит сложно.
MsgBox IIf(summ = 8, "Серийный номер верный", "Серийный номер неверный")
?For c = 12 To 22 Step 2
Proxy писал(а):Берём строку 12 символов, помещаем её в массив байт, разве Ascii код каждого символа не будет размещён последовательно в каждый байт массива (не unicode же)? Мб я просто забыл уже эти заморочки, но почему 22 шаг 2?
Proxy писал(а):И да: зачем страдать с "- 64", "- 48" и т.д, если можно сразу после ввода преобразовать данные, чтобы последующие операции легче было разобрать. Просто интервал [48,58] смотрится нелепо
b() = StrConv(x, vbFromUnicode)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27