Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: Александр от 11 ноября 2017, 17:23

Название: VBA: Формирование и преобразование массивов
Отправлено: Александр от 11 ноября 2017, 17:23
Здравствуйте! Помогите, пожалуйста, если не трудно. Хочу разобраться во всём этом.
Задание в файле. Буду очень благодарен!

Задание 1. Сформировать массив X. Целочисленное значение A задаётся произвольно. Кол-во элементов 15. Задавать глобальные переменные.
Формат вывода результата. В столбец с фиксированным знаком, 3 значащих разряда.
Система уравнений: x(i) =
2lg(e^A+i), если 3<i<=9
i+0,5*A,  при остальных i.


[вложение удалено администратором]
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 11 ноября 2017, 17:44
Нужно смотреть вашу методичку. Я не знаю, что такое фиксированный знак, 3 значащих разряда.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 11 ноября 2017, 20:28
Это значит 3 знака после запятой
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 11 ноября 2017, 22:07
Три значащих разряда - это три цифры, которые начинаются не нулём:
В этом числе:
0,0123
три значащих разряда содержат 123.
Тут нужна методичка, которую вам выдали в институте с решением аналогичных задач. Гадать здесь не надо.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 11 ноября 2017, 22:14
Если бы была эта методичка...Нам говорили, что нужно просто записать как #.###
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 11 ноября 2017, 22:17
Это по идее называется: округлить до трёх знаков после запятой.
А у вас совсем другое в задании.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 11 ноября 2017, 22:22
Мне кажется, что здесь нужно представление числа в виде экспоненты. В этом случае можно число 0,0123 записать таким образом: 1,23E^-2.
Но это только предположения, нужны учебные материалы из вашего учебного заведения.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 11 ноября 2017, 22:36
Преподаватель сказал просто округлить до трёх знаков после запятой.
Значит просто округляем. Изменим задание.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 11 ноября 2017, 23:02
Здесь только первый вопрос.
Макрос работает с эксель-файлом, с активным листом (активный лист - это лист, который отображается на мониторе).
Макрос вставляет результат на активный лист, в столбец A.

Макрос
' Создание в оперативной памяти компьютера поименованной области - переменной A.
    ' Переменную можно сравнить с обычным файлом, но файл находится на жёстком диске,
    ' а переменная в оперативной памяти.
' Переменные, созданные вне процедуры, называются глобальными. Они доступны из
    ' любого модуля в пределах одного проекта.
' Variant означает, что в переменной может быть любой тип данных.
    ' Это нужно для InputBox, который даёт данные в виде текста.
Public A As Variant

Sub macro()

    ' Создание в оперативной памяти компьютера поименованной области - массива "x".
        ' Массив можно сравнить с обычной таблицей, эта таблица находится в оперативной
        ' памяти компьютера.
    ' Double означает, что в массиве могут быть только числа (целые и дробные).
    Dim x() As Double
    ' Long - означает, что в перменной могут быть только целые числа.
    Dim i As Long
   
   
    '1. Юзер указывает число A.
    A = InputBox("Введите число ""A"":")
    ' Если A содержит пустую строку, значит юзер щёлкнул "Cancel".
    If A = "" Then Exit Sub
   
    '2. Переводим число в тип данных "Число" для математических действий.
    A = CLng(A)
   
    '3. Создание ячеек в массиве x. Создаётся пятнадцать ячеек.
    ' 1 To - используется, чтобы порядковый номер первого элемента был один, а не ноль.
        ' По умолчанию используется ноль, что неудобно для непрограммистов.
    ReDim x(1 To 15)
   
    '4. Расчёты и запись результатов расчётов в массив "x".
        ' For ... To ... Step ... Next - называется циклом. Цикл используется,
        ' чтобы делать одну и ту же команду несколько раз.
    ' UBound(x) - это порядковый номер последнего элемента в массиве.
    For i = 1 To UBound(x) Step 1
        ' If ... Then ... Else ... End If - используется для выбора действия.
        If (i > 3) And (i <= 9) Then
            ' В VBA под "Log" подразумевается натуральный логарифм, поэтому делаем его ненатуральным.
            x(i) = 2 * (Log(Exp(A + i)) / Log(10))
        Else
            x(i) = i + 0.5 * A
        End If
    Next i
   
    '5. Округление до трёх цифр после запятой.
    For i = 1 To UBound(x)
        x(i) = Format(x(i), "0.000")
    Next i

    '6. Вставка массива в эксель на активный лист, чтобы посмотреть результат работы макроса.
        ' Активный лист - это лист, который отображается на мониторе.
    For i = 1 To UBound(x)
        Cells(i, "A").Value = x(i)
    Next i

End Sub
[свернуть]
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 11 ноября 2017, 23:11
Спасибо! Попробую дальше сам разобраться.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 12 ноября 2017, 09:17
Если будут вопросы, то задавайте.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 13 ноября 2017, 17:28
Возник вопрос по второму заданию. Почему, когда формируем массив у, отбирая только чётные индексы, выводит значения не подряд, а через раз, перепрыгивая, оставляя пустые ячейки?
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 13 ноября 2017, 17:38
Как вы создаёте ячейки в массиве Y?
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 13 ноября 2017, 17:58
Ну с помощью аксессора Cells, а как тогда нужно?
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 13 ноября 2017, 18:04
Напишите код, как вы создаёте ячейки в  массиве Y.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 13 ноября 2017, 23:22
Попытался считать массив с первого столбца 15 ячеек и отобрать только чётные индексы и вставить в третий столбец, но что-то напутал, что теперь ошибка...

Макрос
Public Sub M()
Dim x(1 To 15) As Integer
Dim a As Integer
Dim i As Integer
Dim j As Integer
For i = 1 To 15
x(i) = Cells(i, "A").Value
Next i
j = 1
For i = 1 To 15
If i Mod 2 = 0 Then
a(j) = x(i)
j = j + 1
End If
Next i
For j = 1 To UBound(x)
Cells(j, "C").Value = a(j)
Next j
End Sub
[свернуть]
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 14 ноября 2017, 15:50
Не ответ на ваш вопрос, я увидел неточность. В столбце A находятся дробные числа.
Вы копируете числа из столбца A в массив "x". У массива "x" тип данных "Integer". Это означает, что в массиве могут быть только целые числа.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 14 ноября 2017, 15:53
В макросе используется массив "A". Но создаёте вы его как переменную. Правильно массив создавать так:
Dim A() As Integer
То есть нужно добавлять после имени массива круглые скобки.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 14 ноября 2017, 15:55
Прежде чем записать данные в ячейку массива, нужно создать ячейки.
Ячейки в массиве создаются так:
ReDim A(1 To 15)

Не путайте с копированием данных из экселя: если нужно скопировать данные из нескольких эксель-ячеек, то в этом случае не нужно создавать ячейки в массиве.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 14 ноября 2017, 15:58
Исправьте пока эти ошибки, потом дальше может быть посмотрю.
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Александр от 15 ноября 2017, 15:49
Вот, я исправил. Столбик со значениями появился, но после того, как все числа были отобраны, остальные ячейки (до 15) были заполнены нулями. Как исправить ситуацию?

Макрос
Public Sub M()
Dim x(1 To 15) As Single
Dim A() As Integer
Dim i As Integer
Dim j As Integer
ReDim A(1 To 15)
For i = 1 To 15
x(i) = Cells(i, "A").Value
Next i
j = 1
For i = 1 To 15
If i Mod 2 = 0 Then
A(j) = x(i)
j = j + 1
End If
Next i
For j = 1 To UBound(x)
Cells(j, "C").Value = A(j)
Next j
End Sub
[свернуть]
Название: Re: VBA: Формирование и преобразование массивов
Отправлено: Администратор от 15 ноября 2017, 16:04
Нужно рассчитать, сколько нужно ячеек в массиве "Y" и создавайте в массиве "Y" не 15 ячеек, а столько, сколько нужно.
А чтобы записывать в ячейки массива "Y", сделайте ещё одну переменную и увеличивайте её отдельно от переменной "i".