excel

Программирование на Visual Basic for Applications
noxs
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.01.2004 (Пн) 14:23

excel

Сообщение noxs » 06.01.2004 (Вт) 0:30

Привет всему народу.

Суть:

В Visual Basic Editor пишу свою функцию, которая на вход должна принимать матрицу (в математическом смысле этого слова) или объект типа Range (в терминах Excel).

В функции должна быть проверка на вшивость, что пользователь не подсунул функции в качестве аргумента скажем просто набор ячеек, не образующих матрицу.

На пробу я решила реализовать эту проверку следующим образом: написала в Visual Basic Editor такую простенькую функцию:

Код: Выделить всё
Function test(R As Range)
Range("A1").Value = R.Areas.Count
End Function


далее задала несколько численных матриц (D7:E9, F10, G10:H11, I10, J15) в текущем Worksheet, вызвала функцию test (она появилась в списке функций, определенных пользователем), задала в качестве аргумента объединение этих матриц (при помощи выделения курсором с Ctrl) и ожидала в ячейке A1 увидеть количество этих матриц.

Однако, в ячейке A1 стоит формула
=test(D7:E9;F10;G10:H11;I10;J15), результат которой не определен.

Вопрос1.

Почему результат формулы не определен? Может я не правильно решаю поставленную задачу?

Спасибо большое за советы.

noxs
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.01.2004 (Пн) 14:23

Сообщение noxs » 06.01.2004 (Вт) 1:08

Мой следующий вопрос.

Итак, я создала свой add-ins с некоторой функцией MYFUNC (файл myfunc.xla) и создала файл example.xls, содержащий значения функции MYFUNC на конкретных данных.
Причем эти значения не были от руки набиты, а были посчитаны в excel, то есть через последовательность:
вставить->функция>функция определенная пользователем->MYFUNC

далее в функцию подставлялись вышеупомянутые конкретные значения.

После этого я загрузила в excel на втором компьютере (через Tools->add-ins Manager и так далее) myfunc.xla и открыла файл example.xls.

Мое изумление заключалось в том, что ячейка, в которой должно быть значение функции, содержала следующее:

Код: Выделить всё
='C:\Documents and Settings\noxs\Application
Data\Microsoft\AddIns\myfunc.xla'!MYFUNC(A2:B23)


то есть полный путь к myfunc.xla на первом компьютере.

Вопрос2:
как устранить такую зависимость?

Благодарна за внимание.

P.S.
несколько дней не смогу отвечать, так как завтра ухожу в роддом :D

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.01.2004 (Вт) 11:14

  1. Функциям, вызываемым с листа, запрещается менять содержимое листа. Функцию следует переписать:
    Код: Выделить всё
    Function test(byval R As Range) as long
      test = R.Areas.Count
    End Function
  2. Ничего удивительного. Раз вызывается функция из другой книги, то прописывается полный путь к ней. Если открыть такой *.xls, то мы увидим полный путь, но если после этого подключить надстройку, путь заменится на относительный. А хранится он в любом случае как абсолютный.
  3. А в роддом - это на работу или по делу? :D
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vak
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 07.01.2004 (Ср) 1:04

Сообщение vak » 07.01.2004 (Ср) 1:20

GSerg писал(а):Функциям, вызываемым с листа, запрещается менять содержимое листа.

это вроде как "настоящая" функция без side-effects? :)
для subroutines все однако разрешено, да?

GSerg писал(а):Функцию следует переписать:
Код: Выделить всё
Function test(byval R As Range) as long
  test = R.Areas.Count
End Function


ок, передам. (я -- муж noxs)

GSerg писал(а):Ничего удивительного. Раз вызывается функция из другой книги, то прописывается полный путь к ней.

это вполне логично, пока не добавить, что другая книга суть myplugin.xla, причем правильно проинсталлированный :)
что же выходит, что пользователь не может пользоваться книгой, которую я ему передал, если он (пользователь) установил тот же самый плагин, но всего лишь в другую директорию?..

или?


GSerg писал(а):Если открыть такой *.xls, то мы увидим полный путь, но если после этого подключить надстройку, путь заменится на относительный. А хранится он в любом случае как абсолютный.

какую настройку?..

GSerg писал(а):А в роддом - это на работу или по делу? :D

по-делу: ждем пополнения :)

завтра пойду докладывать про Ваши ответы.

спасибо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.01.2004 (Ср) 10:25

Семья программистов :)

sub могут делать всё, но это же могут делать и функции. Запрет действует только в случае вызова функции с листа, при вызове из кода функции всемогущи :)

Да, похоже, что не сможет... Есть мнение написать парсер функций для автозамены абсолютного пути на относительный. В этом случае эксель сам потом пропишет новый правильный абсолютный путь.

Не настройку, а надстройку, add-in. xla - это же надстройка :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vak
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 07.01.2004 (Ср) 1:04

Сообщение vak » 07.01.2004 (Ср) 15:21

GSerg писал(а):Семья программистов :)

да, вот пару часов назад родилась еще одна маленькая "программистка" :)

GSerg писал(а):sub могут делать всё, но это же могут делать и функции. Запрет действует только в случае вызова функции с листа, при вызове из кода функции всемогущи :)

значит ли это, что вызвав функцию f с листа, я могу еще вызвать функцию g, которая уже будет "всемогуща"? -- видимо нет? ожидаю, что на вложенные вызовы это ограничение распростроняется, или?)

GSerg писал(а):Да, похоже, что не сможет... Есть мнение написать парсер функций для автозамены абсолютного пути на относительный. В этом случае эксель сам потом пропишет новый правильный абсолютный путь.

oh...
как же это создатели так оплошали-то?.. :(
парсить/замещать -- это не сложно, но не нарушив структуру...
кто их там знает жесткая ли у них длина строк или по терминальным символам и т.п.

в общем плохо у них с дистрибуцией книжек :(

GSerg писал(а):Не настройку, а надстройку, add-in. xla - это же надстройка :)

ну вот, хоть читать как следует научусь :D

спасибо!


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList