Модераторы: mihanik

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция наподобие Т() 
:(
    Опции темы
RockClimber
Дата 12.7.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: 7
Всего: 15



Завтра на работе попробую сделать пример, покажу... Не совсем это, но очень похоже...


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
motorway
Дата 12.7.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Ну если там будет и автозаполнение, и изм. адресов ячеек - будет хорошо! То есть можно считать, что ввод нескольких формул у нас есть.
Но если их (автозап+изм.адресов) и не получится сделать, наверно, написать самому эти функции реально вполне?  smile 

Это сообщение отредактировал(а) motorway - 12.7.2009, 14:28
PM MAIL   Вверх
Naghual
Дата 12.7.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 7
Всего: 49



ТЮ на меня за несообразительность!  Наконец я понял ЧТО тебе нужно.   smile 

В Экселе, при написании функций есть возможность создавать Функции с неограниченным количеством Аргументов.
Эти аргументы будут отрабатываться по всем правилам работы с функциями в том числе и Автозаполнение.

Во декларация:
Код

Public Function Ф(ParamArray Formulas() As Variant) As Variant
    
End Function


Инструкция ParamArray указывает, что Аргументы - это массив.
В теле функции, все переданные аргументы можно получить из массива Formulas().


Дерзай.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
motorway
  Дата 12.7.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



О, это вроде бы лучший из вариантов, который я пока видел!  smile Жму руку. Но есть и небольшие минусы, впрочем, хотя бы так пока (идеал недостижим?  smile ):
иногда мне нужно, чтобы формула начиналась со знаков > или <. Приходится их брать в кавычки, а далее &. Ну и квадратные скобки надо брать в кавычки. Это немного усложнит жизнь пользователям. 
Пока, наверно, возьму в качестве рабочего варианта.

PM MAIL   Вверх
Naghual
Дата 12.7.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 7
Всего: 49



Да. Это единственный недостаток.
Но, как ты сам сказал, идеал недостижим стандартными средствами Экселя.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
motorway
Дата 12.7.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Другим выходом могло быть использование СЦЕПИТЬ с кавычками, чтобы можно было писать все, что хочешь, но тогда нужно самому реализовать автозаполнение и реакцию на событие изм. адресов ячеек. Это просто займет время и силы. Все-таки писать функции, которые уже есть... Лучше, наверно, пойти на компромисс с доп. символами, иногда требующимися.
PM MAIL   Вверх
motorway
Дата 13.7.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Naghual, а не подскажешь, как получить в виде строки все, что находится у Ф в скобках?
Т.е., если в ячейке =Ф(">="&1; -B4>=C6+D3*F4/H8-5; G13<=6; x="[30,200]"; a>5&"->"& x=3+SIN(3))
Чтобы она возвращала ">="&1; -B4>=C6+D3*F4/H8-5; G13<=6; x="[30,200]"; a>5&"->"& x=3+SIN(3)
PM MAIL   Вверх
Naghual
Дата 13.7.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 7
Всего: 49



Пройтись по массиву аргументов циклом и сложить все в одну переменную.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
motorway
Дата 13.7.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Да, я пробовал так:

Код

Public Function Ф(ParamArray Formulas() As Variant) As Variant
Ф = ""
For Each f In Formulas
Ф = Ф + f

Next f
End Function
,
но пишет #ЗНАЧ! - знач., исп. в формуле, имеет неправ. тип данных - пробовал разные варианты, напр. для Ф(1)

Как, кстати, проверить, не пуст ли какой-нибудь массив? Например, если массив ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas) пуст, выдается "Не найдено ни одной ячейки, удовл. заданным условиям". Поэтому нужно сначала проверить, чтобы ошибки не было.

Это сообщение отредактировал(а) motorway - 13.7.2009, 21:55
PM MAIL   Вверх
motorway
Дата 13.7.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Я попробовал получать для помещения в примечание переменную Cell.Formula, но почему-то разделители для аргументов функции Ф из точки с запятой превращаются в запятую. Из-за этого будет непонятно, где должно быть правильное окончание одной формулы и начало другой. Можно как-то получить именно то, что в аргументе формулы было? 

Это сообщение отредактировал(а) motorway - 13.7.2009, 22:56
PM MAIL   Вверх
Naghual
Дата 13.7.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 7
Всего: 49



Цитата(Naghual @  13.7.2009,  20:38 Найти цитируемый пост)
Пройтись по массиву аргументов циклом и сложить все в одну переменную. 

Был неправ. Приношу свои извинения.

Нужно так:

Код

    strCellFormula = Application.Caller.Formula


А затем парсиш strCellFormula.  ;)


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
motorway
Дата 13.7.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Что-то у меня ерунда какая-то. Возвращает вместо точки с запятой запятую для разделителей. Может, еще как-то можно?!
PM MAIL   Вверх
Naghual
Дата 13.7.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 7
Всего: 49



Ход конем: 
Код

Public Function AA(ParamArray Formulas() As Variant) As Variant
    Dim strCellFormula As String
    Dim strFormulas() As String
    
    strCellFormula = Application.Caller.FormulaLocal
    strCellFormula = Mid$(strCellFormula, 5, Len(strCellFormula) - 5)
    
    strFormulas = Split(strCellFormula, ";")
    
End Function



--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
motorway
Дата 14.7.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 578
Регистрация: 2.3.2008

Репутация: нет
Всего: 0



Не очень понял, зачем тут используется тогда Formulas и что возвращает функция. В принципе, из положения можно выйти, если заменять на точку с запятой запятые, находящиеся не в скобках () и [] - так как обычно все запятые находятся внутри скобок у какой-то функции. Только это надо понять как.
PM MAIL   Вверх
Naghual
Дата 14.7.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 7
Всего: 49



Цитата(motorway @  14.7.2009,  00:11 Найти цитируемый пост)
Не очень понял, зачем тут используется тогда Formulas

Ну тогда попробуй без нее.


Цитата(motorway @  14.7.2009,  00:11 Найти цитируемый пост)
В принципе, из положения можно выйти, если заменять на точку с запятой запятые, находящиеся не в скобках () и [] - так как обычно все запятые находятся внутри скобок у какой-то функции. Только это надо понять как. 


Приведенный мною код лишен необходимости в этом.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.