Я предлагаю вам использовать функцию вместо макроса для этого.
Функция будет действовать как функция Excel. Например, если я выполняю функцию с именем TRIPLE, которая вычисляет 3 * x, где x - номер ячейки, я могу использовать TRIPLE (A1) в Excel для вычисления тройки в ячейке A1.
В вашем примере, с вашим пояснением, я попытался понять каждый шаг, чтобы сделать этот код для вас, однако сложность не помогла мне сделать это.
Но я кое-что начал. Идея этой функции заключается в том, чтобы вы указали все, что вам нужно (ячейки, начинающиеся с Hovedstol), даты, налоги и индекс результата. Если вам это нужно, вы можете добавить что угодно, используя мои инструкции. Результатом для функции является вычисление Формеля.
Пример: для вашего первого результата вы должны написать в Excel:
=LoanAmortization(B2,B3,B4,B5,B6,F2:F20,G2:G20,1)
Для вашего второго результата:
=LoanAmortization(B2,B3,B4,B5,B6,F2:F20,G2:G20,1)
Налоги организованы в G2: G20.
Итак, код должен иметь эти параметры в начале в vba, чтобы действовать как функция:
Function LoanAmortization(A As Double, B As Double, C As Double, D As Double, E As Double, ByRef DatesRange As Excel.Range, ByRef TaxesRange As Excel.Range, MIndex As Integer) As Double
End Function
Теперь вам нужно будет работать с массивами, чтобы делать все, что вы хотите, вам не нужно форматировать ячейки, вы сможете создавать свой лист сколько угодно много раз, и код все равно будет работать.
Чтобы создать массив, вам нужно сначала указать количество элементов, в этом примере вы можете создать матрицу из 3 столбцов от 1 до 3 (начиная с номера 0, если не указано) и 2 строк, начиная с номера 1 (то же самое, если вы не укажете, номер 0 будет первым):
Dim ArrayExample(1 to 2, 1 to 3) As Double
Вы также можете Redim вашего массива, но вы потеряете ваши данные, даже если вы используете preserve, вы не можете изменить тип переменной. Если размер имеет значение из переменной, вам необходимо использовать ReDim:
ReDim ArrayExample(1 to 4, 0 to 3)
Чтобы преобразовать Excel.range в массив, просто используйте это после вашего объявления:
ArrayExample = ArrayRange.Value
Чтобы использовать матрицу, просто найдите нужную строку и столбец, примеры:
ArrayExample(3, 2) = 1
i = ArrayExample(1) 'Just one column (have to be specified in declaration)
ArrayExample(0, 0) = "test"
Чтобы использовать любую функцию Excel, например функцию CountA, просто используйте это:
Application.WorksheetFunction.CountA
Вот что я сделал:
Function LoanAmortization(A As Double, B As Double, C As Double, D As Double, E As Double, ByRef DatesRange As Excel.Range, ByRef TaxesRange As Excel.Range, MIndex As Integer) As Double
Dim qtd As Integer
Dim Dates(), Taxes(), DatesDifference() As Double 'If bug, use Variant variable type
qtd = Application.WorksheetFunction.CountA(DatesRange)
ReDim DatesRange(1 to qtd), Taxes(1 to qtd), DatesDifference(1 to qtd - 1)
For 1 to qtd - 1
DatesDifference(i) = DatesRange(i + 1) - DatesRange(i)
Next
End Function
С этим вы сможете продолжить код, извините, чтобы больше не помогать. Если у вас есть какие-либо сомнения относительно того, как сделать что-то более конкретное, я постараюсь вам помочь.