2016-08-02 2 views
0

Я пытаюсь написать функцию, которая принимает в качестве входных данных квадратной матрицы, которая должна иметь в своих клеткахVBA - ошибка переполнения при входе Для Loop

  • на и выше диагонали (снизу слева направо сверху) положительные числа, а

  • ниже диагональных пустых ячеек,

любит это 3 х 3-матрица (первая ячейка содержит # 10, вторая ячейка # 5, и т.д.):

10 5 1 

9 6 

4 

Прежде чем я что-либо сделаю с этой матрицей, мне нужно проверить, что ячейки на диагонали и над ней содержат положительные числа, а остальные ячейки пусты. Я написал код ниже.

Проблема в том, что она дает мне ошибку переполнения во втором цикле For, и для жизни меня я не понимаю, почему. С матрицей 3 x 3 (т. Е. N = 3, p = 3) первая строка второго цикла For будет: Для i = 3 - 2 Шаг -1. В чем проблема?

Option Base 1 

Private Sub triangle1() 

    Dim y As Variant 
    y = Application.InputBox(_ 
    Prompt:=" Choose a square matrix in a worksheet : ", Type:=8) 

    Dim i As Byte, j As Byte, n As Byte, p As Byte, s As Byte 
    n = UBound(y, 1) 
    p = UBound(y, 2) 

    Debug.Print LBound(y, 1), n, p 
    s = 1 
    If n <> p Then 
     Debug.Print "False" 
     Exit Sub 
    Else 
     ' First For loop 
     For i = 1 To n 
      For j = 1 To p 
       If y(i, j) <= 0 Or Not IsNumeric(y(i, j)) Then 
        Debug.Print "False" 
        Exit Sub 
       End If 
      Next 
      p = p - 1 
     Next 

     ' Second For loop 
     For i = n To 2 Step -1 
      s = s + 1 
      For j = s To p 
       If Not IsEmpty(y(i, j)) Then 
        Debug.Print "False" 
        Exit Sub 
       End If 
      Next 
     Next 
     Debug.Print "True" 
    End If 
End Sub 
+0

Это потому, что -1 не может быть его байтом, попробуйте cbyte (-1) в ближайшей панели. –

ответ

2

Проблема заключается с byte типов. Если вы замените их на Integer или Long, он должен работать.

Причина в том, что byte не может обрабатывать отрицательные числа (только целые числа 0-255), поэтому он не знает, что делать с Step -1, поскольку шаг такой же, как итератор.

+1

Yep - 'Step' использует тот же тип данных, что и переменная итератора (как и все остальные значения). Они также переполняются даже без запуска, если foo - Byte: 'For foo = 1 To 300',' For foo = 300 To 400' – Comintern