Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как при обращении к функции присвоить аргументу адрес ячейки - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как при обращении к функции присвоить аргументу адрес ячейки (Макросы/Sub)
Как при обращении к функции присвоить аргументу адрес ячейки
Bamboo Дата: Воскресенье, 27.03.2016, 08:40 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
При отладке пользовательской функции ее пришлось запускать из макроса. При этом возникла проблема как передать в качестве аргумента функции адрес ячейки из которой функция должна получить значение. Адрес нужен для относительно определения другой ячейки.
Код функции:
[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 - Воскресенье, 27.03.2016, 08:42
 
Ответить
СообщениеПри отладке пользовательской функции ее пришлось запускать из макроса. При этом возникла проблема как передать в качестве аргумента функции адрес ячейки из которой функция должна получить значение. Адрес нужен для относительно определения другой ячейки.
Код функции:
[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
Дата добавления - 27.03.2016 в 08:40
KuklP Дата: Воскресенье, 27.03.2016, 09:41 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Да все неправильно. 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]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеДа все неправильно. 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]

Автор - KuklP
Дата добавления - 27.03.2016 в 09:41
Manyasha Дата: Воскресенье, 27.03.2016, 10:26 | Сообщение № 3
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Bamboo, а я просила Вас в предыдущей теме показать пример.

Вы спрашиваете, как передать адрес ячейки, а передаете саму ячейку. Так что нужно-то?
Что должна возвращать функция, если ACC не Empty?
Откуда взялись Next и второй End If?
Цитата
Subscript out of range
- если она появляется при вызове функции, скорее всего у Вас нет листа4

Сергей (KuklP) показал Вам, как проверить пустая ли ячейка или нет и как правильно присвоить результат udf переменной, но подозреваю, что у Вас там еще очень много ошибок осталось.
Так что показывайте пример в файле с Вашими udf и макросом.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеBamboo, а я просила Вас в предыдущей теме показать пример.

Вы спрашиваете, как передать адрес ячейки, а передаете саму ячейку. Так что нужно-то?
Что должна возвращать функция, если ACC не Empty?
Откуда взялись Next и второй End If?
Цитата
Subscript out of range
- если она появляется при вызове функции, скорее всего у Вас нет листа4

Сергей (KuklP) показал Вам, как проверить пустая ли ячейка или нет и как правильно присвоить результат udf переменной, но подозреваю, что у Вас там еще очень много ошибок осталось.
Так что показывайте пример в файле с Вашими udf и макросом.

Автор - Manyasha
Дата добавления - 27.03.2016 в 10:26
Hugo Дата: Воскресенье, 27.03.2016, 12:11 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Да и предыдущий вариант (т.е. показанный в начале, или в ТОЙ ещё теме, или то, что я показал) прекрасно работает, достаточно только дать то, что проверяется - написать в указанной ячейке указанного листа "Empty".
И без примера - откуда нам знать ещё что-то, что не сказано? Может там это "Empty" пишет некая формула, и именно так? Раз уж так проверяют...
P.S. немного идиотски смотрятся слова "указанного", но жизнь заставляет... :)


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Воскресенье, 27.03.2016, 12:15
 
Ответить
СообщениеДа и предыдущий вариант (т.е. показанный в начале, или в ТОЙ ещё теме, или то, что я показал) прекрасно работает, достаточно только дать то, что проверяется - написать в указанной ячейке указанного листа "Empty".
И без примера - откуда нам знать ещё что-то, что не сказано? Может там это "Empty" пишет некая формула, и именно так? Раз уж так проверяют...
P.S. немного идиотски смотрятся слова "указанного", но жизнь заставляет... :)

Автор - Hugo
Дата добавления - 27.03.2016 в 12:11
Bamboo Дата: Воскресенье, 27.03.2016, 15:37 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, Сделал файл с примером. Функция работает, но отладчик не запускается, выдается ошибка.
Если возникает вопрос, зачем мне нужна отладка, если функция работает. Отвечаю, функция должна быть значительно сложнее, для вопроса я ее обрезал, а отлаживать нужно.

Мне нужно с одной стороны получить функции значение ячейки (Empty или какое либо другое)
С другой стороны мне нужен адрес ячейки, чтобы относительно этого адреса искать значения других ячеек.

Заранее все спасибо за помощь.
К сообщению приложен файл: Model_test.xlsm (36.7 Kb)
 
Ответить
СообщениеManyasha, Сделал файл с примером. Функция работает, но отладчик не запускается, выдается ошибка.
Если возникает вопрос, зачем мне нужна отладка, если функция работает. Отвечаю, функция должна быть значительно сложнее, для вопроса я ее обрезал, а отлаживать нужно.

Мне нужно с одной стороны получить функции значение ячейки (Empty или какое либо другое)
С другой стороны мне нужен адрес ячейки, чтобы относительно этого адреса искать значения других ячеек.

Заранее все спасибо за помощь.

Автор - Bamboo
Дата добавления - 27.03.2016 в 15:37
StoTisteg Дата: Воскресенье, 27.03.2016, 15:57 | Сообщение № 6
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Вы передаёте в функцию данные с листа с несуществующим именем листа и удивляетесь тому, что она ничего не находит...
[vba]
Код
Public Sub test()
    Dim i
    Set i = HighLevACC(ActiveWorkbook.Sheets("DB").Range("e10"))
End Sub
[/vba]


Интуитивно понятный код - это когда интуитивно понятно, что это код.

Сообщение отредактировал StoTisteg - Воскресенье, 27.03.2016, 15:58
 
Ответить
СообщениеВы передаёте в функцию данные с листа с несуществующим именем листа и удивляетесь тому, что она ничего не находит...
[vba]
Код
Public Sub test()
    Dim i
    Set i = HighLevACC(ActiveWorkbook.Sheets("DB").Range("e10"))
End Sub
[/vba]

Автор - StoTisteg
Дата добавления - 27.03.2016 в 15:57
Bamboo Дата: Воскресенье, 27.03.2016, 16:28 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
StoTisteg, Спасибо большое! Раньше также пробовал, но не получалось, т.к. в другом месте был косяк, видимо.

А как же вот это . Здесь приведен пример на ссылки по названию листов, а по их номерам. Или нужно было писать Sheet4?


Сообщение отредактировал Bamboo - Воскресенье, 27.03.2016, 16:28
 
Ответить
СообщениеStoTisteg, Спасибо большое! Раньше также пробовал, но не получалось, т.к. в другом месте был косяк, видимо.

А как же вот это . Здесь приведен пример на ссылки по названию листов, а по их номерам. Или нужно было писать Sheet4?

Автор - Bamboo
Дата добавления - 27.03.2016 в 16:28
StoTisteg Дата: Воскресенье, 27.03.2016, 16:33 | Сообщение № 8
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Вы можете обращаться к листам по именам, можете по индексам. Примеры на сайте Мелкософта, разумеется, описывают 1) английскую, а не русскую версию 2) книгу, в которой никто не переименовал листов из тех имён, с которыми они создаются.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеВы можете обращаться к листам по именам, можете по индексам. Примеры на сайте Мелкософта, разумеется, описывают 1) английскую, а не русскую версию 2) книгу, в которой никто не переименовал листов из тех имён, с которыми они создаются.

Автор - StoTisteg
Дата добавления - 27.03.2016 в 16:33
Bamboo Дата: Воскресенье, 27.03.2016, 16:41 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
StoTisteg, Спасибо! Понял :)
 
Ответить
СообщениеStoTisteg, Спасибо! Понял :)

Автор - Bamboo
Дата добавления - 27.03.2016 в 16:41
Hugo Дата: Воскресенье, 27.03.2016, 23:43 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
В п.2. мелкомягкие могли без пояснений ещё один пример привести:
[vba]
Код
Application.Goto Sheet2.Cells(6, 5)
[/vba]
но странно, что не работает вариант
[vba]
Код
Application.Goto ActiveWorkbook.Sheet2.Cells(6, 5)
[/vba]
Вот и гадай теперь что это означает... :)


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеВ п.2. мелкомягкие могли без пояснений ещё один пример привести:
[vba]
Код
Application.Goto Sheet2.Cells(6, 5)
[/vba]
но странно, что не работает вариант
[vba]
Код
Application.Goto ActiveWorkbook.Sheet2.Cells(6, 5)
[/vba]
Вот и гадай теперь что это означает... :)

Автор - Hugo
Дата добавления - 27.03.2016 в 23:43
KuklP Дата: Понедельник, 28.03.2016, 00:31 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
А так работает:
[vba]
Код
Application.Goto ActiveWorkbook.Sheets("Лист2").Cells(6, 5)
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеА так работает:
[vba]
Код
Application.Goto ActiveWorkbook.Sheets("Лист2").Cells(6, 5)
[/vba]

Автор - KuklP
Дата добавления - 28.03.2016 в 00:31
Hugo Дата: Понедельник, 28.03.2016, 01:11 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Сергей, такой образец у них на сайте есть. Без пояснений что куда зачем.
Вопрос - почему не работает комбинация активной книги с кодовым именем?


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеСергей, такой образец у них на сайте есть. Без пояснений что куда зачем.
Вопрос - почему не работает комбинация активной книги с кодовым именем?

Автор - Hugo
Дата добавления - 28.03.2016 в 01:11
Manyasha Дата: Понедельник, 28.03.2016, 11:18 | Сообщение № 13
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
не работает комбинация активной книги с кодовым именем

Кодовое имя листа принадлежит VBAProject, а не книге.
Так что ни один из следующих вариантов не сработает:
[vba]
Код
ActiveWorkbook.Лист1.Activate 'или другие методы листа
ThisWorkbook.Лист1.Activate
Set wb = Workbooks("test.xls"): wb.Лист1.Activate
[/vba]

Лист1 по умолчанию ищется в текущем проекте VBA. Т.е. запись Лист1.Activate можно переписать так:
[vba]
Код
VBAProject.Лист1.Activate' где VBAProject - имя VBA проекта
'или
ThisWorkbook.VBProject.VBComponents("Лист1").Activate
[/vba]

Соответственно, чтобы получить доступ к листу другой книги по кодовому имени можно так написать:
[vba]
Код
Set wb = Workbooks("test.xls")
wb.VBProject.VBComponents("Лист1").Activate
[/vba]


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщение
не работает комбинация активной книги с кодовым именем

Кодовое имя листа принадлежит VBAProject, а не книге.
Так что ни один из следующих вариантов не сработает:
[vba]
Код
ActiveWorkbook.Лист1.Activate 'или другие методы листа
ThisWorkbook.Лист1.Activate
Set wb = Workbooks("test.xls"): wb.Лист1.Activate
[/vba]

Лист1 по умолчанию ищется в текущем проекте VBA. Т.е. запись Лист1.Activate можно переписать так:
[vba]
Код
VBAProject.Лист1.Activate' где VBAProject - имя VBA проекта
'или
ThisWorkbook.VBProject.VBComponents("Лист1").Activate
[/vba]

Соответственно, чтобы получить доступ к листу другой книги по кодовому имени можно так написать:
[vba]
Код
Set wb = Workbooks("test.xls")
wb.VBProject.VBComponents("Лист1").Activate
[/vba]

Автор - Manyasha
Дата добавления - 28.03.2016 в 11:18
RAN Дата: Понедельник, 28.03.2016, 20:04 | Сообщение № 14
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
можно так написать:

А можно проще
[vba]
Код
Workbooks("test.xls").Sheets(Лист1.Name).Activate
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
можно так написать:

А можно проще
[vba]
Код
Workbooks("test.xls").Sheets(Лист1.Name).Activate
[/vba]

Автор - RAN
Дата добавления - 28.03.2016 в 20:04
Hugo Дата: Понедельник, 28.03.2016, 21:49 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Андрей, тогда неизвестно откуда код возмёт это Лист1.Name - я проверил, берётся из книги где проект. Спасибо Manyasha :)
Вернее известно, и известно какое имя будет, и тогда можно прямо так его в коде и написать :) Не всегда ведь эти имена совпадут...


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Понедельник, 28.03.2016, 21:54
 
Ответить
СообщениеАндрей, тогда неизвестно откуда код возмёт это Лист1.Name - я проверил, берётся из книги где проект. Спасибо Manyasha :)
Вернее известно, и известно какое имя будет, и тогда можно прямо так его в коде и написать :) Не всегда ведь эти имена совпадут...

Автор - Hugo
Дата добавления - 28.03.2016 в 21:49
RAN Дата: Понедельник, 28.03.2016, 23:14 | Сообщение № 16
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Виноват погорячился. :'(
Сейчас поискал, оказывается так делал
[vba]
Код
For Each sh In wb.Worksheets
                If sh.CodeName = "shDay" Then Exit For
            Next
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеВиноват погорячился. :'(
Сейчас поискал, оказывается так делал
[vba]
Код
For Each sh In wb.Worksheets
                If sh.CodeName = "shDay" Then Exit For
            Next
[/vba]

Автор - RAN
Дата добавления - 28.03.2016 в 23:14
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как при обращении к функции присвоить аргументу адрес ячейки (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!