Страницы: 1
RSS
Ввод значений массива для расчета, Не работает цикл создания одномерного массива
 
Коллеги, во вложении небольшой макрос, который должен:
1. брать введенные данные из вкладки ("input")
2. создавать на их основании их массив (массив называется "ine").

Проверка макроса средствами VBA не показывает ошибок, но массив создается с нулевыми значениями...

Подскажите, пожалуйста, где можно найти ошибку.
 
Доброе время суток
Цитата
McClane написал:
но массив создается с нулевыми значениями...
Что вполне естественно. Рассмотрим
Код
ine(a) = Cells(1, b).Value 'присвоение значений элементов массива

здесь b - изменяемый индекс. Смотрим в справку Application.Cells property (Excel) - возвращает диапазон ячеек активного листа. Диапазон Range имеет метод по умолчанию Item Range.Item property (Excel) с двумя аргументами. Так вот, второй аргумент, который вы меняете - соответствует номеру столбца :)  Читайте справку, это не больно и совсем не страшно, а очень полезно, хотя и может быть утомительно и не так весело.
 
Код
Sub C_k()
r = Cells(Rows.Count, 1).End(xlUp).Row 
ine = Range(Sheets("input").Cells(1, 1), Sheets("input").Cells(r, 1)).Value
End Sub
Быстрее молнии, быстрее ветра, быстрее калькулятора
 
Цитата
где можно найти ошибку.
Код
Sub C_k()
    Dim ine() As Currency 'массив для значений
    Dim r, a As Integer 'r - размерность массива, a - индекс номера элемента
    Sheets("input").Select
    r = Cells(Rows.Count, 1).End(xlUp).Row - 1 ' вычисление размерности массива
    ReDim ine(r, 1) 'задание размерности массива
    For a = 1 To r 'счетчик для массива
'        For b = 2 To r + 1 'счетчик для перебора внесенных элементов
            ine(a, 1) = Cells(a + 1, 1).Value 'присвоение значений элементов массива
'        Next b
    Next a
End Sub
 
Kuzmich,
Цитата
Dim r, a As Integer ' r - размерность массива, a - индекс номера элемента
у вас r тут тип Variant, а вот а - имеет тип Integer. Такова особенность VBA - надо у каждой переменной указывать тип, иначе будет Variant
 
New, написал
Цитата
у вас r тут тип Variant, а вот а - имеет тип Integer.
Поясните, что не так?
 
Kuzmich, для работы макроса - всё отлично и волноваться не о чем.

Просто так для информации по вашей строке Dim r, a As Integer

У VBA есть особенность, если вы объявляете переменные (по желанию, так как мы с вами знаем, что объявлять переменные вовсе не обязательно в VBA), то надо у каждой переменной указывать свой тип данных, кроме переменных типа Variant.

Вот мы с вами решили объявить переменные с типом Long, если написать объявление так
Dim a, b, c As Long

то только последняя переменная "с" будет иметь тип Long, а первые две переменные "а и b" будут иметь тип Variant.
В других языках программирования, например, C,C++, C# - все 3 переменные имели бы тип Long.
Но это VBA - тут надо указывать тип для конктретно каждой переменной.

Таким образом, если мы хотим объявить 3 переменные с типом Long, то правильно писать так
Dim a as long, b as long, c as long

Вы написали объявление переменных так
Dim r, a As Integer
то есть тут переменная "r" будет не Integer (как вы хотели), а Variant.
А только переменная "а" будет Integer.

Вот эти 2 строки равны
Dim a
Dim a As Variant

и там и там вы задали тип Variant переменной "а"
Изменено: New - 26.07.2020 23:09:30
 
Еще ошибки.
Цитата
r = .Cells(.Rows.Count, 1).End(xlUp).Row - 1
Зачем -1? Так Вы исключаете последнюю ячейку с данными.

Во вложенном цикле (по b) в один элемент массива последовательно записываются все значения, затирая предыдущие. Если ссылку на ячейку укажете правильно:
Цитата
Андрей VG написал: второй аргумент, который вы меняете - соответствует номеру столбца
то во все элементы массива запишется последнее значение диапазона. Вложенный цикл не нужен, не нужна переменная b (в ссылке на ячейку применяйте a.

Если массив не обязательно одномерный - Borrusale покаал, как загрузить данные одним махом.

Цитата
New написал: Kuzmich,  вас r тут...
Нет, это у автора темы. А  Kuzmich ленивый :),  не привел в порядок
 
Всем огромное спасибо!!!

Проблема решена.
Страницы: 1
Наверх