Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Использование встроенных фунуций Добавлено: 14.04.06 17:00  

Автор вопроса:  Леха
Кто знает каким образом можно получить результат вычисления встроенной формулы Ecxel непосредственно в коде VBA?
Например, в ячейке есть такая формула:
=СЦЕПИТЬ(РАЗНДАТ($O22;ЕСЛИ($BD22="";СЕГОДНЯ();$BD22);"Y");"-";РАЗНДАТ($O22;ЕСЛИ($BD22="";СЕГОДНЯ();$BD22);"YM");"-";РАЗНДАТ($O22;ЕСЛИ($BD22="";СЕГОДНЯ();$BD22);"MD"))
Как можно переменной, например "st_Part" присвоить результат вычисления этой формулы не используя рабочего листа?

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 15.04.06 05:33
Открыть файл funcs.xls и узнать, как называются функции по-английски.

Ответить

Номер ответа: 2
Автор ответа:
 Леха



Вопросов: 7
Ответов: 11
 Профиль | | #2 Добавлено: 18.04.06 10:46
Идея замечательная, но к сожалению не подходит. Может это только относительно одной функции - РАЗНДАТ или DATEDIF. Поясню: этой функции, почему-то, передаются параметры по-разному (на листе и в VBA) и она возвращает разные значения. Пример:
если искать количесто лет между датами 31.12.2005 и 1.01.2006, то ф.РАЗНДАТ возвращает 0, а ф.DATEDIF - 1!!!

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 18.04.06 12:12
Это аналог, а не копия. Некоторым функциям есть только аналоги. Сами функции листа перечислены в application.worksheetfunction.

Если требуется вычислить именно формулу с несуществующим аналогом функции, то application.evaluate(), причём формулу перевести в английский локаленезависимый стандарт.

Ответить

Номер ответа: 4
Автор ответа:
 Леха



Вопросов: 7
Ответов: 11
 Профиль | | #4 Добавлено: 26.04.06 15:23
Спасибо за совет! Но опять не работает :-)
Почему-то Evaluate не хочет считать ни одну формулу, где в качестве одного из параметров используется выражение с кавычками
Year = Application.Evaluate(";DATEDIF(" & Date1 & "," & Date2 & ",""Y"";)";) - не работает
Остальные формулы щелкает на ура. В чем может быть дело?

Ответить

Номер ответа: 5
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #5 Добавлено: 26.04.06 15:34
Я ж говорю - приведи в стандарт...

Дата в формате "mm/dd/yyyy", с кавычками вокруг.

Ответить

Номер ответа: 6
Автор ответа:
 Леха



Вопросов: 7
Ответов: 11
 Профиль | | #6 Добавлено: 26.04.06 17:33
А DATEDIF - это что?
Насчет кавычек вокруг ты прав - это я забыл.
Но я не пойму почему формулу Evaluate("edate(""" & Date1 & """,10)";) считает нормально (это ДАТАМЕС), а формулу Evaluate(";DATEDIF(""" & Date1 & """,""" & Date1 & """,""Y"";)" не хочет (это РАЗНДАТ)?
В качестве Date передаются даты в формате "dd.mm.yyyy"

Ответить

Номер ответа: 7
Автор ответа:
 Леха



Вопросов: 7
Ответов: 11
 Профиль | | #7 Добавлено: 26.04.06 17:33
А DATEDIF - это что?
Насчет кавычек вокруг ты прав - это я забыл.
Но я не пойму почему формулу Evaluate("edate(""" & Date1 & """,10)";) считает нормально (это ДАТАМЕС), а формулу Evaluate(";DATEDIF(""" & Date1 & """,""" & Date2 & """,""Y"";)" не хочет (это РАЗНДАТ)?
В качестве Date передаются даты в формате "dd.mm.yyyy"

Ответить

Номер ответа: 8
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #8 Добавлено: 26.04.06 17:58
А всё же, передавай mm/dd/yyyy...

Ответить

Номер ответа: 9
Автор ответа:
 Леха



Вопросов: 7
Ответов: 11
 Профиль | | #9 Добавлено: 26.04.06 17:59
В продолжение вопроса.... Точнее наверное с этого надо было начать. :-)
Описание задачи, которую я пытаюсь решить: есть дата приема сотрудника на работу, может быть дата его увольнения. Необходимо подсчитать стаж его работы в годах, мес, днях.
Вместо громоздкой формулы =ЕСЛИ($O6="";"";СЦЕПИТЬ(РАЗНДАТ($O6;ЕСЛИ($AZ6="";СЕГОДНЯ();$AZ6);"Y";);"-";РАЗНДАТ($O6;ЕСЛИ($AZ6="";СЕГОДНЯ();$AZ6);"YM";);"-";РАЗНДАТ($O6;ЕСЛИ($AZ6="";СЕГОДНЯ();$AZ6);"MD";))), которая возвращает гг-мм-дд стажа хочу написать свою функцию =стаж(ДатаПриема; ДатаУвольнения), которая возвращала бы тоже самое.
Код VBA:

Function Стаж(ДатаПриема, _
              ДатаУвольнения)

Dim Года As Long
Dim Месяцы As Long
Dim Дни As Long
   If ДатаУвольнения = Empty Then
      ДатаУвольнения = Date
   End If
   If Not ДатаУвольнения = Empty Then
      Года = Evaluate(";DATEDIF(""" & ДатаПриема & """,""" & ДатаУвольнения & """,""Y"";)";)
      Месяцы = Evaluate(";DATEDIF(""" & ДатаПриема & """,""" & ДатаУвольнения & """,""YM"";)";)
      Дни = Evaluate(";DATEDIF(""" & ДатаПриема & """,""" & ДатаУвольнения & """,""MD"";)";)
      
      Стаж = Года & "-" & Месяцы & "-" & Дни
   Else
      Стаж = Empty
   End If
End Function

Все бы замечательно, если бы не DATEDIF.
Можно было бы замутить что-то подобное на функции аналоге VBA.DateDiff, но она разницу считает не так как экселевская DATEDIF.
Буду очень признателен, если кто подправит глюк в функции, если он есть ;-) или предложит рабочий вариант подсчета стажа лет, месяцев и дней

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам