При отладке пользовательской функции ее пришлось запускать из макроса. При этом возникла проблема как передать в качестве аргумента функции адрес ячейки из которой функция должна получить значение. Адрес нужен для относительно определения другой ячейки. Код функции: [vba]
Код
Function HighLevACC(ACC) If ACC = "Empty" Then 'Проверка на незаполненный уровень активности - необходимость распределения' HighLevACC = ACC.Offset(0, -1) 'Определение распределяемого СС' End If Next
End If End Function
[/vba] Код макроса для запуска функции: [vba]
Код
Public Sub test() Dim i i = HighLevACC(Application.ActiveWorkbook.Sheets("Лист4").Range("Е10")) End Sub
[/vba] В результате получается ошибка: "Run-time error 9: Subscript out of range" Что неправильно, как выйти из ситуации? /вне режима отладки функция работает и выдает нужные значения/
При отладке пользовательской функции ее пришлось запускать из макроса. При этом возникла проблема как передать в качестве аргумента функции адрес ячейки из которой функция должна получить значение. Адрес нужен для относительно определения другой ячейки. Код функции: [vba]
Код
Function HighLevACC(ACC) If ACC = "Empty" Then 'Проверка на незаполненный уровень активности - необходимость распределения' HighLevACC = ACC.Offset(0, -1) 'Определение распределяемого СС' End If Next
End If End Function
[/vba] Код макроса для запуска функции: [vba]
Код
Public Sub test() Dim i i = HighLevACC(Application.ActiveWorkbook.Sheets("Лист4").Range("Е10")) End Sub
[/vba] В результате получается ошибка: "Run-time error 9: Subscript out of range" Что неправильно, как выйти из ситуации? /вне режима отладки функция работает и выдает нужные значения/Bamboo
Сообщение отредактировал Bamboo - Воскресенье, 27.03.2016, 08:42
Да все неправильно. Bamboo, Вы надеетесь, что написав любую ахинею, можно отладкой заставить ее работать? Ничего у Вас работать не будет, пока не научитесь писать что-то осмысленное. Об этом я Вам писал еще здесь: http://www.excelworld.ru/forum/10-22382-180528-16-1458938212 Вот это - работает: [vba]
Код
Function HighLevACC(ACC) If ACC = Empty Then 'Проверка на незаполненный уровень активности - необходимость распределения' Set HighLevACC = ACC.Offset(0, -1) 'Определение распределяемого СС' End If End Function
Public Sub test() Dim i Set i = HighLevACC(ActiveWorkbook.Sheets("Лист3").Range("e10")) End Sub
[/vba]
Да все неправильно. Bamboo, Вы надеетесь, что написав любую ахинею, можно отладкой заставить ее работать? Ничего у Вас работать не будет, пока не научитесь писать что-то осмысленное. Об этом я Вам писал еще здесь: http://www.excelworld.ru/forum/10-22382-180528-16-1458938212 Вот это - работает: [vba]
Код
Function HighLevACC(ACC) If ACC = Empty Then 'Проверка на незаполненный уровень активности - необходимость распределения' Set HighLevACC = ACC.Offset(0, -1) 'Определение распределяемого СС' End If End Function
Public Sub test() Dim i Set i = HighLevACC(ActiveWorkbook.Sheets("Лист3").Range("e10")) End Sub
Bamboo, а я просила Вас в предыдущей теме показать пример.
Вы спрашиваете, как передать адрес ячейки, а передаете саму ячейку. Так что нужно-то? Что должна возвращать функция, если ACC не Empty? Откуда взялись Next и второй End If?
Цитата
Subscript out of range
- если она появляется при вызове функции, скорее всего у Вас нет листа4
Сергей (KuklP) показал Вам, как проверить пустая ли ячейка или нет и как правильно присвоить результат udf переменной, но подозреваю, что у Вас там еще очень много ошибок осталось. Так что показывайте пример в файле с Вашими udf и макросом.
Bamboo, а я просила Вас в предыдущей теме показать пример.
Вы спрашиваете, как передать адрес ячейки, а передаете саму ячейку. Так что нужно-то? Что должна возвращать функция, если ACC не Empty? Откуда взялись Next и второй End If?
Цитата
Subscript out of range
- если она появляется при вызове функции, скорее всего у Вас нет листа4
Сергей (KuklP) показал Вам, как проверить пустая ли ячейка или нет и как правильно присвоить результат udf переменной, но подозреваю, что у Вас там еще очень много ошибок осталось. Так что показывайте пример в файле с Вашими udf и макросом.Manyasha
Да и предыдущий вариант (т.е. показанный в начале, или в ТОЙ ещё теме, или то, что я показал) прекрасно работает, достаточно только дать то, что проверяется - написать в указанной ячейке указанного листа "Empty". И без примера - откуда нам знать ещё что-то, что не сказано? Может там это "Empty" пишет некая формула, и именно так? Раз уж так проверяют... P.S. немного идиотски смотрятся слова "указанного", но жизнь заставляет...
Да и предыдущий вариант (т.е. показанный в начале, или в ТОЙ ещё теме, или то, что я показал) прекрасно работает, достаточно только дать то, что проверяется - написать в указанной ячейке указанного листа "Empty". И без примера - откуда нам знать ещё что-то, что не сказано? Может там это "Empty" пишет некая формула, и именно так? Раз уж так проверяют... P.S. немного идиотски смотрятся слова "указанного", но жизнь заставляет... Hugo
Manyasha, Сделал файл с примером. Функция работает, но отладчик не запускается, выдается ошибка. Если возникает вопрос, зачем мне нужна отладка, если функция работает. Отвечаю, функция должна быть значительно сложнее, для вопроса я ее обрезал, а отлаживать нужно.
Мне нужно с одной стороны получить функции значение ячейки (Empty или какое либо другое) С другой стороны мне нужен адрес ячейки, чтобы относительно этого адреса искать значения других ячеек.
Заранее все спасибо за помощь.
Manyasha, Сделал файл с примером. Функция работает, но отладчик не запускается, выдается ошибка. Если возникает вопрос, зачем мне нужна отладка, если функция работает. Отвечаю, функция должна быть значительно сложнее, для вопроса я ее обрезал, а отлаживать нужно.
Мне нужно с одной стороны получить функции значение ячейки (Empty или какое либо другое) С другой стороны мне нужен адрес ячейки, чтобы относительно этого адреса искать значения других ячеек.
Вы можете обращаться к листам по именам, можете по индексам. Примеры на сайте Мелкософта, разумеется, описывают 1) английскую, а не русскую версию 2) книгу, в которой никто не переименовал листов из тех имён, с которыми они создаются.
Вы можете обращаться к листам по именам, можете по индексам. Примеры на сайте Мелкософта, разумеется, описывают 1) английскую, а не русскую версию 2) книгу, в которой никто не переименовал листов из тех имён, с которыми они создаются.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Андрей, тогда неизвестно откуда код возмёт это Лист1.Name - я проверил, берётся из книги где проект. Спасибо Manyasha :) Вернее известно, и известно какое имя будет, и тогда можно прямо так его в коде и написать Не всегда ведь эти имена совпадут...
Андрей, тогда неизвестно откуда код возмёт это Лист1.Name - я проверил, берётся из книги где проект. Спасибо Manyasha :) Вернее известно, и известно какое имя будет, и тогда можно прямо так его в коде и написать Не всегда ведь эти имена совпадут...Hugo