Страница: 1 |
Страница: 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("ATEDIF(" & 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("
ATEDIF(""" & Date1 & """,""" & Date1 & """,""Y""
" не хочет (это РАЗНДАТ)?
В качестве Date передаются даты в формате "dd.mm.yyyy"
Номер ответа: 7
Автор ответа: Леха
Вопросов: 7
Ответов: 11
Профиль | | #7
Добавлено: 26.04.06 17:33
А DATEDIF - это что?
Насчет кавычек вокруг ты прав - это я забыл.
Но я не пойму почему формулу Evaluate("edate(""" & Date1 & """,10)" считает нормально (это ДАТАМЕС), а формулу Evaluate("
ATEDIF(""" & 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("ATEDIF(""" & ДатаПриема & """,""" & ДатаУвольнения & """,""Y""
"
Месяцы = Evaluate("ATEDIF(""" & ДатаПриема & """,""" & ДатаУвольнения & """,""YM""
"
Дни = Evaluate("ATEDIF(""" & ДатаПриема & """,""" & ДатаУвольнения & """,""MD""
"
Стаж = Года & "-" & Месяцы & "-" & Дни
Else
Стаж = Empty
End If
End Function
Все бы замечательно, если бы не DATEDIF.
Можно было бы замутить что-то подобное на функции аналоге VBA.DateDiff, но она разницу считает не так как экселевская DATEDIF.
Буду очень признателен, если кто подправит глюк в функции, если он есть или предложит рабочий вариант подсчета стажа лет, месяцев и дней