Страницы: 1
RSS
Не работает созданная функция расчета двумерного массива
 
Коллеги, написал функцию на VBA, для расчета значений двумерного массива.
Принцип работы (хочется чтобы) таков:
1. Читались вносимые значения и записывались в отд одном массив;
2. На основании элементов этого массива рассчитывались значения двумерного массива. При этом формула для первого столбца двумерного столбца и ост столбцо различается.
3. Вывод результатов на отд вкладку.

Увы, но функция не работает без какой-либо детализации ошибки.

Пожалуйста, подскажите, куда можно посмотреть для поиска ошибки.
 
Да там куча мала ошибок :)

1. Частая ошибка. input0 может быть и диапазоном, и значением. Не экономьте на символах:
inp1 = input0
Код
inp1 = input0.Value

2. ReDim inp1(C ) - в данном случае не нужно. Массив сам понимает, куда ему расти.
3.  Первый элемент массива, который принимает значения диапазона -1 (первый)
Код
Ck(I, J) = Exp(inp1(K) / inp1(K - 1))

Вы пытаетесь на первом шаге цикла (K = 1) получить нулевой элемент

4. Цикл по всем элементам масива
Код
For K = 1 To C

но пытаетесь обратиться к четвертому (см. п.2)

5. Здесь не нужно указывать тип значений массивов, редактор разберется
6. А вот типы переменных в VBA нужно указывать для каждой переменной. У Вас три первых (K, C, I) - Variant. (Попутно: обычно  переменные счетчиков именуются строчными буквами)

7. Зачем активировать лист, непонятно.
Код
        Sheets("Output_Ck").Select 'выбор вкладки
        Range("A:A").Select
        ----------------------------
        Sheets("Output_Ck").Select 'выбор вкладки
        Range("B:B").Select

Функция записана в ячейку и результат вернет туда же, результат ее работы не выводится в другой выделенный диапазон. Для вывода результата в дргие диапазоны должна быть не функция. а процедура Sub

8. Функция C_k1 записана в одной ячейке и результат выводит в эту ячейку. Вы же в функцию записываете массив Ck ( 3*3). Возможно, в новых версиях Excel так можно, но ниже 2013 нельзя.
А в Sub заполненный массив можно выгрузить на лист в диапазон с заданными размерами:
Код
Sheets("Output_Ck").Cells(2,2).Resize(C,C).Value = Ck
' надежнее
Sheets("Output_Ck").Cells(2,2).Resize(UBound(Ck),UBound(Ck,2)).Value = Ck


Цитата
McClane написал: куда можно посмотреть для поиска ошибки.
Ставим точку останова (клик на полоске слева от кода напротив нужной строки - строка выделится красным). Запускаем расчет функции (заходим в ячейку с функцией, Enter). Функция отработает до красной строки и остановится. Дальше - F8 (пошаговый режим)
В окне Locals (View-Locals Window)  можно контролировать состояние переменных и массивов

Цитата
ост столбцо ... на отд вкладку
И много Вы времени сэкономили на нескольких буквах? Уважайте читающих.
 
vikttur, огромное спасибо за помощь!

Только сейчас смог вернуться к этому вопросу.

После внесения исправлений возникла ошибка.
Решил вводить значения для расчета путем использования InputBox.
На шаге подсчета числа строк по внесенным значениям получил ошибку "Invalid qualifier".

Пожалуйста, подскажите, в чем причина этой ошибки.

Заранее спасибо
 
Не нужно все вопроосы валить в одну тему. Вопрос по InputBox?  Оставьте небольшой макрос, в котором воспроизводится ошибка, создайте тему...
 
видите-ли, уважаемый mr. McClane,
если я решу сесть за штурвал вертолета и подняться в воздух, то, скорее всего разобью вертолет и убьюсь сам
Цитата
McClane написал:
в чем причина этой ошибки
как бы спросите вы. причина в том, что я не имею ни малейшего понятия как управлять вертолетом
давайте от моей бестолковости в области управления вертолетами вернемся к вашей задачке
любой лист Excel это практически двумерный массив, что мешает вам заполнить руками одни элементы этого массива и на их основании посчитать остальные?
этим вы избавитесь от надуманной проблемы работы с InputBox и сосредоточитесь строго на решении своей задачи
возникнут сложности - пишите, попробуем решить их вместе
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Огромное спасибо.
Приношу извинения за задержку с ответом.
Страницы: 1
Наверх