Функция работает в виде формулы но не работает в модуле

Рейтинг: 0Ответов: 1Опубликовано: 01.05.2015

Не могли бы вы помочь найти ошибку: я реализовал метод Крамера для вычисления корней системы линейных уравнений (в виде функции). Если использовать эту функции в строке формул, то все отлично, но когда я пытаюсь использовать ее в модуле, то выполнение функции прекращается - причем без сообщений об ошибках...

Может быть, дело в том, что в функцию подается не диапазон, а массив Double()?

Не могли бы вы помочь разобраться в этом?

Крамер:

Function Kramer(A As Variant, B As Variant) As Variant
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim ARowCount As Integer
Dim BRowCount As Integer

Dim detA As Double
Dim ColNo As Integer

Dim DeltaMatrix() As Double
Dim res As Variant

If Application.Count(A) <> Application.CountA(A) Then
MsgBox "Не все элементы матрицы X являются распознаваемыми как числа. Возможно, какой-то из элементов введен неправильно"
Exit Function
End If

If Application.Count(B) <> Application.CountA(B) Then
MsgBox "Не все элементы вектора-столбца Y являются распознаваемыми как числа. Возможно, какой-то из элементов введен неправильно"
Exit Function
End If

If A.Rows.Count <> B.Rows.Count Then
MsgBox "количество строк в векторе-столбце Y и матрице X не совпадает.     Видимо, был выделен неправильный диапазон чисел"
Exit Function
End If

If A.Columns.Count <> A.Rows.Count Then
MsgBox "Матрица X не является квадратной. Вычисление определителя невозможно"
Exit Function
End If


ColNo = A.Columns.Count
detA = Application.MDeterm(A)

ReDim res(1 To ColNo)

If detA = 0 Then
MsgBox "Определитель матрицы равен нулю. Метод Крамера невыполним."
Exit Function
End If

For i = 1 To ColNo
For j = 1 To ColNo
Debug.Print ("Hello world")
Next j
Next i

For i = 1 To ColNo
    ReDim DeltaMatrix(1 To ColNo, 1 To ColNo)

    For k = 1 To ColNo
    For j = 1 To ColNo
        DeltaMatrix(k, j) = A(k, j)
    Next j
    Next k


    For j = 1 To ColNo
        DeltaMatrix(j, i) = B(j)
    Next j

    res(i) = Application.MDeterm(DeltaMatrix) / detA
Next i

     Kramer = Application.Transpose(res)
End Function

Канонический интерполяционный полином:

Function CanonCalc(X As Variant, Y As Variant, xcalc As Double) As Variant
Dim i As Integer
Dim j As Integer
Dim ColNo As Integer
Dim res As Double
Dim Delta As Double
Dim KramerResult As Variant
Dim AMatr As Variant

If Application.Count(X) <> Application.CountA(X) Or Application.Count(Y) <>         Application.CountA(Y) Then
MsgBox "Ошибка: Массив X или массив Y содержит некорректно введенное число"
Exit Function
End If

If X.Columns.Count > 1 Or Y.Columns.Count > 1 Then
MsgBox "Ошибка: Массив X или массив Y содержит более одного столбца"
Exit Function
End If

If X.Rows.Count <> Y.Rows.Count Then
MsgBox "Ошибка: Массив X или массив Y содержит некорректно введенное число"
Exit Function
End If

ColNo = X.Rows.Count

ReDim KramerResult(1 To ColNo)
ReDim AMatr(1 To ColNo, 1 To ColNo)

For i = 1 To ColNo
    For j = 1 To ColNo
        AMatr(i, j) = X(i) ^ (ColNo - j)
    Next j
    Next i

KramerResult = Kramer(AMatr, Y)
For i = 1 To ColNo
res = res + KramerResult(i) * xcalc ^ (ColNo - 1 - i)
Next i

CanonCalc = res
End Function

Ответы

Ответов пока нет.