Функция работает в виде формулы но не работает в модуле
Не могли бы вы помочь найти ошибку: я реализовал метод Крамера для вычисления корней системы линейных уравнений (в виде функции). Если использовать эту функции в строке формул, то все отлично, но когда я пытаюсь использовать ее в модуле, то выполнение функции прекращается - причем без сообщений об ошибках...
Может быть, дело в том, что в функцию подается не диапазон, а массив 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
Источник: Stack Overflow на русском