Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Получайник Гость
|
Добавлено: Ср Авг 25 2004 19:40 Заголовок сообщения: VBA Excel - не найду ошибку в простейшей программе! |
|
|
Пытался написать пользовательскую функцию для MS Excel. Взял почти учебный пример из сети (заменил лишь названия листа). Функция вместо 'ok' выдает ошибку #ЗНАЧ!.
1| Function check()
2| If ActiveSheet.Cells(1, 1).Value = 1 Then
3| check = "position checked"
4| Else
5| ActiveSheet.Cells(1, 1).Value = 5
6| check = "misplaced"
7| End If
8| End Function
Причем, если пятую строчку сделать комментарием, то все работает. Что в ней может быть не так, ума не приложу. Буду очень благодарен, если мне кто-нибудь поможет. Спасибо. |
|
Вернуться к началу |
|
 |
Гость
|
Добавлено: Ср Авг 25 2004 23:10 Заголовок сообщения: |
|
|
Слушай может скажешь где брал учебный прмиер.
И вообще какие ссылки знаешь по доке VBA? |
|
Вернуться к началу |
|
 |
Получайник Гость
|
Добавлено: Чт Авг 26 2004 20:53 Заголовок сообщения: |
|
|
Пример брал на каком-то сайте. Точно не помню адрес - там больше ничего не было. Ссылками я тоже не богат. Все, что есть:
1. http://www.dicks-blog.com/ - сайт только по Excel'ю, как я понял.
2. http://www.firststeps.ru/vba/excel/ - VBA для начинающих, тоже ориентирован на Excel, хотя очень толковый, мне понравился.
3. http://www.vertex42.com - тоже по Excel'ю.
Извиняй, что все ссылки узконапраленные - я их искал для решения конкретной проблемы. А до того я бейсиком не интересовался, так что ничего не накопилось.
Удачи. |
|
Вернуться к началу |
|
 |
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Чт Авг 26 2004 20:55 Заголовок сообщения: |
|
|
Странно. Вроде работает (Excel 2000). А где должно выдаваться "ok"? |
|
Вернуться к началу |
|
 |
Гость
|
Добавлено: Пт Авг 27 2004 09:05 Заголовок сообщения: Re: VBA Excel - не найду ошибку в простейшей программе! |
|
|
Получайник писал(а): | Пытался написать пользовательскую функцию для MS Excel. Взял почти учебный пример из сети (заменил лишь названия листа). Функция вместо 'ok' выдает ошибку #ЗНАЧ!.
2| If ActiveSheet.Cells(1, 1).Value = 1 Then
Причем, если пятую строчку сделать комментарием, то все работает. Что в ней может быть не так, ума не приложу. Буду очень благодарен, если мне кто-нибудь поможет. Спасибо. |
Единственное, что тут может вызвать ошибку- ActiveSheet, укажи явно название листа. |
|
Вернуться к началу |
|
 |
Получайник Гость
|
Добавлено: Пт Авг 27 2004 19:13 Заголовок сообщения: |
|
|
Мне тут сказали, что якобы пользовательские функции не могут менять содержание таблицы. Поверить не могу. Печально, если это не ошибка.
wildwind
'ok' должно выдаваться в ячейке, где прописывается функция, а вот '5' должна появляться в "посторонней" ячейке.
Гость
Насчет ActiveSheet, пробовал прописывать название листа - то же самое. |
|
Вернуться к началу |
|
 |
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Пт Авг 27 2004 20:38 Заголовок сообщения: |
|
|
Подозреваю, что дело в том, что из функции нельзя менять данные на листе. Это раз. Потом, так как в ячейке стоит "=check()", то Excel не видит зависимости функции от данных в A1 и не вызывает функцию при вводе новых данных. Поэтому функция должна проверять значение не ячейки, а переданного ей аргумента. Если сделать так:
Код: | Function check(value)
If value = 1 Then
check = "position checked"
Else
check = "misplaced"
End If
End Function |
И в ячейке написать "=check(A1)", то все работает прекрасно. |
|
Вернуться к началу |
|
 |
Борис Гость
|
Добавлено: Сб Авг 28 2004 14:09 Заголовок сообщения: В программе всё нормально в предположении... |
|
|
Кто виноват?
В программе всё нормально в предположении, что в соответствующей ячейке (ActiveSheet.Cells(1,1)) действительно стоит число, а не строка. Бывает, что в ячейку вставят "1 " (единицу с пробелом), что похоже на просто 1, соответственно сравнение с числом не проходит.
Что делать?
Используя дебаггер, найти, в какой строке возникает ошибка. Вероятней всего, она в строке if... То есть ошибочна не строка, а предположение, что в ячейке строго число один. Для исправления можно вместо сравнения с единицей использовать универсальную функцию преобразования любого типа в число (найти в хелпе).
PS Получил положительный заряд, когда смеялся над тем, что "функции нельзя менять данные на листе". Если бы это было так, тогда зачем вообще VBA?
[/b] |
|
Вернуться к началу |
|
 |
Борис Гость
|
Добавлено: Сб Авг 28 2004 14:25 Заголовок сообщения: продолжение |
|
|
В данном же конкретном случае ошибка может возникать, если на листе ставится формула =check(), так как она изменяет *саму* *проверяемую* *ячейку*, то есть происходит зацикливание (если же просто прогнать функцию в тестовом проходе, то есть однократно, то она отработает нормально). Для исправления можно вместо 5| ActiveSheet.Cells(1, 1).Value = 5 написать, например, 5| ActiveSheet.Cells(1, 2).Value = 5 |
|
Вернуться к началу |
|
 |
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Пн Авг 30 2004 17:06 Заголовок сообщения: |
|
|
Борис
Ты бы хоть потрудился проверить, прежде чем смеяться. А еще лучше нашел бы точную причину ошибки, а не просто "из общих соображений". Человеку нужна конкретная помощь. А рассуждать мы все умеем.
Что может быть некорректного в том, что функция проверяет ячейку, а потом изменяет ее? Какие нафиг зацикливания, если явной зависимости нет. |
|
Вернуться к началу |
|
 |
Борис Гость
|
Добавлено: Пн Сен 06 2004 10:15 Заголовок сообщения: |
|
|
wildwind писал(а): | Борис
Ты бы хоть потрудился проверить, прежде чем смеяться. А еще лучше нашел бы точную причину ошибки, а не просто "из общих соображений". Человеку нужна конкретная помощь. А рассуждать мы все умеем. |
Есть такое наблюдение -- нет ничего практичней хорошей теории. Это означает, что любые конкретные решения должны соответствовать общим соображеням. Если что-то не получается, то нужно понять принципиальную ошибку, а не какое слово вместо какого должно стоять, потому что, зная принципиальную ошибку, любой человек (кроме, разумеется, даунов) сумеет подобрать конкретное нужное слово. Если же просто заменить одно слово другим, оно, возможно, будет работать в данном случае, но гарантии правильности работы это не даёт.
wildwind писал(а): | Что может быть некорректного в том, что функция проверяет ячейку, а потом изменяет ее? Какие нафиг зацикливания, если явной зависимости нет. |
Зацикливание может произойти в том случае, если настройки эксела вызывают функцию неоднократно, то есть и до, и после изменения значения ячейки. |
|
Вернуться к началу |
|
 |
|