Вычисление формулы

Программирование на Visual Basic for Applications
MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Вычисление формулы

Сообщение MYF » 02.08.2008 (Сб) 0:18

Не знаю, как сформулировать...
На листе в столбце список формул в текстовом формате. Примерно вот такого вида:
10 * [поле1] - 25 / [поле2] * ( [поле3] + [поле1] )
Мой скрипт считывает их по очереди в текстовую переменную, подставляет вместо параметров [поле*] реальные значения из запроса ADODB.
Теперь надо вычислить значение формулы и присвоить его переменной double. А потом запихнуть в ячейку.
Можно было бы просто подставить формулу в ячейку:
Cells(1, 1).Formula = "=332*10"
Но в процессе выполнения скрипта одна и та же формула может обрабатываться несколько раз, а значение ячейки накапливается.

Получается, надо либо самому каким-то образом вычислять формулу.
Либо искать другой способ.
Подозреваю, в VBA должна быть готовая функция вычисления формул. Только что-то ни как не найду. А самому писать... очень заморочно.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 02.08.2008 (Сб) 16:58

Cells(1, 1) = Evaluate("332*10")
Привет,
KL

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 02.08.2008 (Сб) 21:10

KL, огромное спасибо.
Давно уже бьюсь. Мог бы и сам догадаться.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 03.08.2008 (Вс) 12:30

Кстати, имей в виду, что Evaluate может возвращать массив, т.ч. Можно делать такое:
[A1:A10]=Evaluate("B1:B10*C1:C10+D1:D10")
и вещи в таком духе...
Привет,
KL

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Re: Вычисление формулы

Сообщение MYF » 14.08.2008 (Чт) 14:40

KL, такие навороты мне не нужны. У меня просто таблица заполняется данными из ADODB запроса. Некоторые данные получаются из других обычной арифметикой. А всё остальное считается прямо в таблице как обычно.
Ещё раз огромное спасибо.

Вот ещё неожиданно проблема всплыла.
У меня в таблице данные заносятся в 12 колонок под 12 часов. Но с переходом на летнее/зимнее время часов может оказаться и 11 и 13. Пришлось нагородить вот такой скрипт.
Код: Выделить всё
Sub test2()
Dim i As Integer, n As Integer
sTime = "C5:N5"
dtStart = #8/2/2008 6:00:00 AM#
dtEnd = #8/2/2008 6:00:00 PM#
i = DateDiff("h", dtStart, dtEnd)
n = Range(sTime).Columns.Count
Do
  If n = i Then Exit Do
  If n > i Then ' удаляем лишние столбцы
   Worksheets(wsOut).Columns(n / 2 + Range(sTime).Column).Delete
   n = n - 1
   End If
  If n < i Then ' добавляем столбцы
   Application.CutCopyMode = False
   Worksheets(wsOut).Columns(n / 2 + Range(sTime).Column).Select
   Selection.Copy
   Selection.Insert Shift:=xlToRight
   Application.CutCopyMode = False
   n = n + 1
   End If
  Loop
End Sub
Типа, если на пальцах, задумка такая: когда ширина диапазона столбцов не сходится с количеством часов в смене (с 06:00 до 18:00 или с 18:00 до 06:00), то средний столбец этого диапазона либо удаляем, либо размножаем.
Получилось как-то коряво:
1. Не нравится мне n=n+1. Лучше было бы перетащить n = Range... внутрь Do и расширять сам диапазон: "C5:N5" --> "C5:O5" --> и т.д. А как это сделать? - не знаю.
2. Кусок с копированием столбца я получил записью макроса. Вроде бы всё работает... в нормальной таблице.
Но у моей в "шапке" ячейки "C1:O1" объединёны. Там заголовок. И Worksheets(wsOut).Columns(n / 2 + Range(sTime).Column).Select выделяет не только столбец "I:I", а весь диапазон "C:O". Если снять объединение, то получается как надо. А вручную мышкой и с объединенными правильно работает.
3. А i = DateDiff("h", dtStart, dtEnd) считает с учётом переходов зима-лето или нет?

Ещё вопрос относительно Optional
Код: Выделить всё
Dim dtStart As Date

Public Function StartTime(Optional D As Date)
If (задан D) Then
  dtStart = DateAdd("h", 6, D)
  Debug.Print "задан StartTime="; dtStart
  End If
StartTime = dtStart
End Function
Как проверить, задали необязательный параметр или нет?
Методом тыка установил, что пустой параметр типа Date соответствует #12:00:00 AM#. Ну а если кому-то вздумается задать именно это значение?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Mail.ru [бот] и гости: 63

    TopList