Страница: 1 |
Страница: 1 |
Вопрос: PRODUCT в VBA
Добавлено: 31.03.07 02:02
Автор вопроса: Павел
проблема такая: необходимо осуществть в vba экселевскую формулу PRODUCT (произведение), пытаюсь это реализовать так:
Sub two()
Dim x, e As Integer
Dim i, j As Variant
Dim p As Variant
e = 1
For j = 1 To 10
p = Cells(e, j)
For i = 1 To 10
p(i) = p(i) * Cells(e, j).Value
Next i
Next j
MsgBox "" & p
End Sub
к сожалению не работает, видимо проблема в параметре p(i)
может быть это лучше сделать через ARRAY ? но вот как засовывать каждый раз новое значение в ARRAY при последующим i я не знаю. подскажите, пожалуйста, что-нибудь.
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #1
Добавлено: 31.03.07 02:38
это не массив, а используется как массив
p = Cells(e, j)
For i = 1 To 10
p(i) = p(i) * Cells(e, j).Value
Next i
абра кадабра???
For j = 1 To 10
p = Cells(e, j)
здесь мы как бы проходим по 10ти столбцам в первой строчке...
полагаю - затем надо пройтись также и по строкам
dim n as single
n = 1
For j = 1 To 10
For i = 1 To 10
p = Cells(i, j).Value
n = p*n
Next i
Next j
MsgBox n
Номер ответа: 2
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #2
Добавлено: 31.03.07 02:42
если конечно их все (10*10) 100 значений перемножить нужно было , то так:
n = 1
For j = 1 To 10
For i = 1 To 10
p = Cells(i, j).Value
n = p*n
Next i
Next j
MsgBox n
А красивый у меня первый пост получился,)), гы-гы, цветной
Номер ответа: 3
Автор ответа:
Павел
Вопросов: 2
Ответов: 1
Профиль | | #3
Добавлено: 31.03.07 12:10
большое спасибо! мне и в правду надо перемножать очень большие числа.
а что вы можете сказать об ARRAY, я ходил к своему преподу, он сказал, что тут лучше делать через него, нежели через циклы, но он не утверждает, а так думает.
Номер ответа: 4
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #4
Добавлено: 31.03.07 14:42
____ Что-то захотелось поучаствовать.
____ Я так понял, что надо сделать копию стандартной функции листа Excell. У неё есть возможности, которые здесь не рассматриваются. —
____ 1. Количество параметров не определено.
____ 2. В качестве любого параметра может быть не число, а ссылка на ячейку.
____ 3. В качестве любого параметра может быть и не число и не ссылка на ячейку, а ссылка на диапазон ячеек.
____ Предлагаю следующий вариант функции, которую следует поместить в отдельный модуль (чтобы она появилась в выборе функций листа) и которая полностью идентична стандартной:
Dim i As Long, j As Long, e
If IsMissing(p) Then ' Параметры есть? — Нет.
mult = Null ' Результат не определён.
Else ' Параметры есть? — Да.
mult = 1 ' Начальное значение произведения.
For Each e In p ' Цикл перебора параметров.
If IsObject(e) Then ' Параметр — ссылка на объект? — Да.
For i = 1 To e.Columns.Count ' Цикл перебора диапазона ячеек.
For j = 1 To e.Rows.Count
If IsNumeric(e.Cells(i, j).Value) Then ' В ячейке число? — Да.
mult = mult * e.Cells(i, j).Value
Else ' В ячейке число? — Нет.
mult = Null ' Результат не определён.
Exit Function ' Завершение функции.
End If
Next: Next
ElseIf IsNumeric(e) Then ' Параметр — число? — Да.
mult = mult * e
Else ' Параметр не число и не объект? — Да.
mult = Null ' Результат не определён.
End If
Next ' Конец цикла перебора параметров.
End If
End Function
Номер ответа: 5
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #5
Добавлено: 31.03.07 14:45
____ Исправляю ошибку:
Dim i As Long, j As Long, e
If IsMissing(p) Then ' Параметры есть? — Нет.
mult = Null ' Результат не определён.
Else ' Параметры есть? — Да.
mult = 1 ' Начальное значение произведения.
For Each e In p ' Цикл перебора параметров.
If IsObject(e) Then ' Параметр — ссылка на объект? — Да.
For i = 1 To e.Columns.Count ' Цикл перебора диапазона ячеек.
For j = 1 To e.Rows.Count
If IsNumeric(e.Cells(i, j).Value) Then ' В ячейке число? — Да.
mult = mult * e.Cells(i, j).Value
Else ' В ячейке число? — Нет.
mult = Null ' Результат не определён.
Exit Function ' Завершение функции.
End If
Next: Next
ElseIf IsNumeric(e) Then ' Параметр — число? — Да.
mult = mult * e
Else ' Параметр не число и не объект? — Да.
mult = Null ' Результат не определён.
Exit Function ' Завершение функции.
End If
Next ' Конец цикла перебора параметров.
End If
End Function