Vba excel передать ячейку в функцию

Сделаем функцию-заглушку, внутри которой точно нет проблемы:

PureBasic
1
2
3
Function Foo(range As Range, number As Integer)
Foo=number
End Function

Она тоже не работает, ошибка 501. Слово «диапазон» это случайно не есть ключевое слово? Проверить я не смог, если вместо range написать диапазон, ругается, но это все-таки на кириллицу наверное.

Добавлено через 14 минут
Ошибка 501, оказывается — это просто LibreOffice не видел функцию Foo (в случае с функцией Place по-прежнему 501, хотя теперь он ее должен видеть), теперь ошибка в Basic IDE «переменная типа object не установлена»

Добавлено через 10 минут
Упс, «object не задан» — это я при вызове функции 1 параметр вместо 2 указал, так что изначально все правильно написал — функция Foo дает ошибку 501

Добавлено через 8 минут
Спасибо, Range все-таки работает, просто параметры нужно писать через точку в запятой

  1. 11.03.2004 16:17


    #1

    Anonymous вне форума

    system architect


    Anonymous is on a distinguished road


    Вес репутации
    0

    По умолчанию Как передать в функцию адрес ячейки? (VBA, Excel)

    День добрый!

    Есть такая функция:

    Function my_function(addr As Variant) As Variant
    my_function = addr
    End Function

    Она должна запускаться из ячейки листа Excel, например:

    =my_function(A1) ‘ результат ее работы — значение ячейки А1

    Вопрос: как передать в функцию не значение, а адрес ячейки, т.е. переменная addr=А1?



  2. Реклама на форуме:

    По умолчанию

  3. 16.03.2004 14:49


    #2

    Anonymous вне форума

    system architect


    Anonymous is on a distinguished road


    Вес репутации
    0

    По умолчанию Решение

    А вот и решение (спасибо AndreyV)

    Public Function my_function(rng As Range) As Variant
    my_function = rng.Address
    End Function


  4. 17.03.2004 12:23


    #3

    Naeel Maqsudov вне форума


    Super Moderator

    system architect


    Naeel Maqsudov is a jewel in the rough

    Naeel Maqsudov is a jewel in the rough

    Naeel Maqsudov is a jewel in the rough

    Аватар для Naeel Maqsudov


    Вес репутации
    27

    Отправить сообщение для Naeel Maqsudov с помощью ICQ

    Отправить сообщение для Naeel Maqsudov с помощью Skype™

    По умолчанию

    На случай, если работа этой функции являлась самоцелью, дополню решение напоминанием о стандартной функции, которая делает то же самое.

    =ЯЧЕЙКА(«Адрес»;<ссылка>) подробнее в спарвке


Передать в пользовательскую функцию, адрес где она находится

Bamboo

Дата: Понедельник, 28.03.2016, 16:28 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 99


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Для отладки пользовательской функции нужно как-то передать в нее адрес, где функция находится, т.к. функция обращается к другим ячейкам относительно своего адреса. Как это сделать для отладки, ведь при отладке функция не введена ни в одну ячейку.

 

Ответить

_Boroda_

Дата: Понедельник, 28.03.2016, 16:30 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

ведь при отладке функция не введена ни в одну ячейку

Так введите в нужную ячейку и отлаживайте оттуда.
В первой строке кода функции брейк поставьте через F9


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

KuklP

Дата: Понедельник, 28.03.2016, 16:32 |
Сообщение № 3

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Введите, кто не дает. И отлаживайте.
thiscell.address


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Bamboo

Дата: Понедельник, 28.03.2016, 16:37 |
Сообщение № 4

Группа: Пользователи

Ранг: Участник

Сообщений: 99


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

KuklP, А что вы имеете ввиду ввести? Записать в ячейку и поставить на нее курсор?
Функция у меня введена в каждую ячейку одного столбца. Или удалить все кроме одной и оставить в одной ячейке?

 

Ответить

_Boroda_

Дата: Понедельник, 28.03.2016, 16:42 |
Сообщение № 5

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

удалить все кроме одной и оставить в одной ячейке?

Совершенно верно. Зачем Вам при отладке куча функций?


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Bamboo

Дата: Понедельник, 28.03.2016, 16:46 |
Сообщение № 6

Группа: Пользователи

Ранг: Участник

Сообщений: 99


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

_Boroda_,

Цитата

Зачем Вам при отладке куча функций?

Они ссылаются на вычисления друг друга. Но можно и просто значений наставлять и пусть ссылается…

 

Ответить

Michael_S

Дата: Понедельник, 28.03.2016, 16:49 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 2012


Репутация:

373

±

Замечаний:
0% ±


Excel2016

Они ссылаются на вычисления друг друга.

а циклические ссылки не возникают при этом?

 

Ответить

zopa

Дата: Вторник, 29.03.2016, 14:15 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
100% ±


Excel 2010

KuklP все правильно говорит:
В теле функции где идет перебор диапазона .address выдаст адрес текущей ячейки типа:

[vba]

Код

for each cel in range
переменная = cel.address
next cel

[/vba]

[moder]Код оформите согласно Правилам форума

Сообщение отредактировал zopaВторник, 29.03.2016, 15:18

 

Ответить

Udik

Дата: Вторник, 29.03.2016, 14:59 |
Сообщение № 9

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64

Без примера отвечать приходится наугад, например, введите дополнительный аргумент — текстовый адрес ячейки.

[vba]

Код

Public Function test1(addr As String) As String
Debug.Print addr
test1 = addr
End Function

[/vba]

а в ячейке будет такое:

Код

=test1(АДРЕС(СТРОКА();СТОЛБЕЦ()))


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

 

Ответить

KuklP

Дата: Вторник, 29.03.2016, 15:38 |
Сообщение № 10

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

KuklP все правильно говорит:
В теле функции где идет перебор диапазона .address выдаст адрес текущей ячейки типа:
for each cel in range
переменная = cel.address
next cel

Это где я такое говорил? Наглая клевета! address выдаст адрес той ячейки(диапазона), которую(ый) ей укажут.
[vba]

Код

Public Function RngAdr$(rng As Range)
    Dim c As Range
    For Each c In rng.Cells
        Debug.Print c.Address
    Next
    RngAdr = Application.ThisCell.Address
End Function

[/vba]
Введите в любую ячейку формулу «=RngAdr(A1:B2)» и посмотрите, что она выдаст и что в immediate напишет.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Bamboo

Дата: Вторник, 29.03.2016, 17:21 |
Сообщение № 11

Группа: Пользователи

Ранг: Участник

Сообщений: 99


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

_Boroda_, Не получилось в режиме отладки выдает ошибку «Run-time error:1004 Method ThisCel of object Application failed»
Вод код проверочной функции:
[vba]

Код

Function TS()
  TS = Application.ThisCell.Address
End Function

[/vba]
Вот код макроса для запуска:
[vba]

Код

Public Sub Test2()
Dim J
    J = TS()
End Sub

[/vba]

При этом функция введенная на листе дает правильный результат.

Как отладить функцию?

 

Ответить

Udik

Дата: Вторник, 29.03.2016, 17:38 |
Сообщение № 12

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64

Если отладку из ячейки делать, то ставьте бряк (F9) на строке с оператором. В ячейке с формулой пробел после всего выражения и жмём энтер
А если из другого макроса запускать, то адрес нужно передать и ThisCell закомментить.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

Сообщение отредактировал UdikВторник, 29.03.2016, 17:40

 

Ответить

Bamboo

Дата: Вторник, 29.03.2016, 18:03 |
Сообщение № 13

Группа: Пользователи

Ранг: Участник

Сообщений: 99


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Udik, Попробовал первый способ — получилось. Спасибо!

Как передать адрес для второго способа?

 

Ответить

Udik

Дата: Вторник, 29.03.2016, 18:28 |
Сообщение № 14

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64


Ну либо через глобальную переменную, либо через аргумент функции (т.е. на время отладки добавляем аргумент, а потом убираем. Через глобальную переменную попроще :) )


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

 

Ответить

Bamboo

Дата: Вторник, 29.03.2016, 18:46 |
Сообщение № 15

Группа: Пользователи

Ранг: Участник

Сообщений: 99


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Udik, Спасибо! Подскажите еще как извлечь значение из ячейки относительно адреса ThisCell?

Сообщение отредактировал BambooВторник, 29.03.2016, 18:53

 

Ответить

Udik

Дата: Вторник, 29.03.2016, 19:20 |
Сообщение № 16

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64

относительно адреса ThisCell

Если правильно вопрос понял
[vba]

Код

i = Application.ThisCell.Offset(1, 1).Value

[/vba]

собственно смещение это аргументы Offset, на сколько строк и на сколько столбцов.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

 

Ответить

 

Fankis

Пользователь

Сообщений: 3
Регистрация: 08.08.2016

Здравствуйте! Помогите разобраться.
Пишу функцию в VBA. Как сослаться на ячейку, в которой сама эта функция и будет размещена? ActiveCell дает не тот результат.
Допустим я хочу в столбец B вставить функцию, которая бы заглядывала в соседнюю ячейку столбца A, и если там выполняется определенное условие, то выдавала бы ответ. Т.е. мне надо определить номер строки, в которой стоит формула.

 

Вынести координаты в аргументы.
И на рабочем листе =ПОЛЬЗОВАТЕЛЬСКАЯ(СТРОКА(),СТОЛБЕЦ())

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#3

08.08.2016 16:08:04

Цитата
2.1. Название темы должно отражать смысл проблемы. Темы с названиями «Помогите», «Help», «Срочно», «Нужен макрос» — плохая идея. Модераторы имеют право переименовать, удалить или закрыть такие темы без предупреждения.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Игорь Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#4

08.08.2016 16:28:42

Код
If TypeName(Application.Caller) = "Range" Then MsgBox "called from = " & Application.Caller.Address

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

МатросНаЗебре

Пользователь

Сообщений: 5516
Регистрация: 05.02.2014

#5

08.08.2016 16:29:43

Цитата
Fankis написал:
функцию, которая бы заглядывала в соседнюю ячейку столбца

Ещё проще. Соседнюю ячейку в аргументы.

Код
Function myFunc(СоседняяЯчейка As Range)
    myFunc = СоседняяЯчейка.Row
End Function
 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

08.08.2016 16:36:04

Цитата
МатросНаЗебре написал:
Ещё проще

это не проще в ряде случаев. Особенно, когда есть специальный объект Caller.

Ну а вообще, господа, JayBhagavan вполне резонное замечание сделал. Зачем делать медвежью услугу форуму? Тема создана с нарушением правил. Помогли, отлично, всем конфетка :) Но чтобы помочь не надо особо утруждаться — вопрос-то простой. Но ведь автор и в следующий раз нарушит правила и назовет тему абы как. И так далее. И будет у нас на форуме помойка из серии тем «как», «формула», «VBA» и т.п. Ну сами же здесь обитаем — давайте правила уважать и не добавлять модераторам работы. Несложно же направить новичка в правила, чтобы он понял, что название должно отражать суть. Не захочет другое название придумать — значит не особо-то и нужно было решение. Но как правило же у нас участники все разумные и понимают зачем это надо. А так он может и не задуматься — решение-то и без того дали, зачем лишний раз напрягаться?
Fankis, предложите прямо в теме название, отражающее суть. Модераторы придут — изменят сами название темы(у Вас прав на это нет, Вы можете только предложить вменяемое название). Спасибо.

Изменено: The_Prist08.08.2016 16:38:06

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 
 

Fankis

Пользователь

Сообщений: 3
Регистрация: 08.08.2016

Всем спасибо за помощь и критику. Вопрос решился так: Application.ThisCell.Address. Выручило элементарное знание английского, чутье и хелп =)
Собственно теперь, когда нашел ответ в справке, понял как четко звучал вопрос: «Как получить ссылку на ячейку, из которой вызывается пользовательская функция?»
В целом все элементарно)

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#9

08.08.2016 18:19:03

Цитата
Fankis написал: Выручило элементарное знание английского, чутье и хелп

Вдруг пригодится для общего образования:

Кто вызвал функцию или процедуру?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Fankis

Пользователь

Сообщений: 3
Регистрация: 08.08.2016

#10

08.08.2016 18:28:49

The_Prist, спасибо, доходчиво изложено. Application.Caller.Address как я понял тоже должен подойти.

Присвоение диапазона ячеек объектной переменной в VBA Excel. Адресация ячеек в переменной диапазона и работа с ними. Определение размера диапазона. Примеры.

Присвоение диапазона ячеек переменной

Чтобы переменной присвоить диапазон ячеек, она должна быть объявлена как Variant, Object или Range:

Dim myRange1 As Variant

Dim myRange2 As Object

Dim myRange3 As Range

Чтобы было понятнее, для чего переменная создана, объявляйте ее как Range.

Присваивается переменной диапазон ячеек с помощью оператора Set:

Set myRange1 = Range(«B5:E16»)

Set myRange2 = Range(Cells(3, 4), Cells(26, 18))

Set myRange3 = Selection

В выражении Range(Cells(3, 4), Cells(26, 18)) вместо чисел можно использовать переменные.

Для присвоения диапазона ячеек переменной можно использовать встроенное диалоговое окно Application.InputBox, которое позволяет выбрать диапазон на рабочем листе для дальнейшей работы с ним.

Адресация ячеек в диапазоне

К ячейкам присвоенного диапазона можно обращаться по их индексам, а также по индексам строк и столбцов, на пересечении которых они находятся.

Индексация ячеек в присвоенном диапазоне осуществляется слева направо и сверху вниз, например, для диапазона размерностью 5х5:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Индексация строк и столбцов начинается с левой верхней ячейки. В диапазоне этого примера содержится 5 строк и 5 столбцов. На пересечении 2 строки и 4 столбца находится ячейка с индексом 9. Обратиться к ней можно так:

‘обращение по индексам строки и столбца

myRange.Cells(2, 4)

‘обращение по индексу ячейки

myRange.Cells(9)

Обращаться в переменной диапазона можно не только к отдельным ячейкам, но и к части диапазона (поддиапазону), присвоенного переменной, например,

обращение к первой строке присвоенного диапазона размерностью 5х5:

myRange.Range(«A1:E1»)

‘или

myRange.Range(Cells(1, 1), Cells(1, 5))

и обращение к первому столбцу присвоенного диапазона размерностью 5х5:

myRange.Range(«A1:A5»)

‘или

myRange.Range(Cells(1, 1), Cells(5, 1))

Работа с диапазоном в переменной

Работать с диапазоном в переменной можно точно также, как и с диапазоном на рабочем листе. Все свойства и методы объекта Range действительны и для диапазона, присвоенного переменной. При обращении к ячейке без указания свойства по умолчанию возвращается ее значение. Строки

MsgBox myRange.Cells(6)

MsgBox myRange.Cells(6).Value

равнозначны. В обоих случаях информационное сообщение MsgBox выведет значение ячейки с индексом 6.

Важно: если вы планируете работать только со значениями, используйте переменные массивов, код в них работает значительно быстрее.

Преимущество работы с диапазоном ячеек в объектной переменной заключается в том, что все изменения, внесенные в переменной, применяются к диапазону (который присвоен переменной) на рабочем листе.

Пример 1 — работа со значениями

Скопируйте процедуру в программный модуль и запустите ее выполнение.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

Sub Test1()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Range(«C6:E8»)

‘Заполняем первую строку

‘Присваиваем значение первой ячейке

myRange.Cells(1, 1) = 5

‘Присваиваем значение второй ячейке

myRange.Cells(1, 2) = 10

‘Присваиваем третьей ячейке

‘значение выражения

myRange.Cells(1, 3) = myRange.Cells(1, 1) _

* myRange.Cells(1, 2)

‘Заполняем вторую строку

myRange.Cells(2, 1) = 20

myRange.Cells(2, 2) = 25

myRange.Cells(2, 3) = myRange.Cells(2, 1) _

+ myRange.Cells(2, 2)

‘Заполняем третью строку

myRange.Cells(3, 1) = «VBA»

myRange.Cells(3, 2) = «Excel»

myRange.Cells(3, 3) = myRange.Cells(3, 1) _

& » « & myRange.Cells(3, 2)

End Sub

Обратите внимание, что ячейки диапазона на рабочем листе заполнились так же, как и ячейки в переменной диапазона, что доказывает их непосредственную связь между собой.

Пример 2 — работа с форматами

Продолжаем работу с тем же диапазоном рабочего листа «C6:E8»:

Sub Test2()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Range(«C6:E8»)

‘Первую строку выделяем жирным шрифтом

myRange.Range(«A1:C1»).Font.Bold = True

‘Вторую строку выделяем фоном

myRange.Range(«A2:C2»).Interior.Color = vbGreen

‘Третьей строке добавляем границы

myRange.Range(«A3:C3»).Borders.LineStyle = True

End Sub

Опять же, обратите внимание, что все изменения форматов в присвоенном диапазоне отобразились на рабочем листе, несмотря на то, что мы непосредственно с ячейками рабочего листа не работали.

Пример 3 — копирование и вставка диапазона из переменной

Значения ячеек диапазона, присвоенного переменной, передаются в другой диапазон рабочего листа с помощью оператора присваивания.

Скопировать и вставить диапазон полностью со значениями и форматами можно при помощи метода Copy, указав место вставки (ячейку) на рабочем листе.

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Sub Test3()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Range(«C6:E8»)

‘Присваиваем ячейкам рабочего листа

‘значения ячеек переменной диапазона

Range(«A1:C3») = myRange.Value

MsgBox «Пауза»

‘Копирование диапазона переменной

‘и вставка его на рабочий лист

‘с указанием начальной ячейки

myRange.Copy Range(«E1»)

MsgBox «Пауза»

‘Копируем и вставляем часть

‘диапазона из переменной

myRange.Range(«A2:C2»).Copy Range(«E11»)

End Sub

Информационное окно MsgBox добавлено, чтобы вы могли увидеть работу процедуры поэтапно, если решите проверить ее в своей книге Excel.

Размер диапазона в переменной

При получении диапазона с помощью метода Application.InputBox и присвоении его переменной диапазона, бывает полезно узнать его размерность. Это можно сделать следующим образом:

Sub Test4()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Application.InputBox(«Выберите диапазон ячеек:», , , , , , , 8)

‘Узнаем количество строк и столбцов

MsgBox «Количество строк = « & myRange.Rows.Count _

& vbNewLine & «Количество столбцов = « & myRange.Columns.Count

End Sub

Запустите процедуру, выберите на рабочем листе Excel любой диапазон и нажмите кнопку «OK». Информационное сообщение выведет количество строк и столбцов в диапазоне, присвоенном переменной myRange.

Like this post? Please share to your friends:
  • Vba excel передать массив в процедуру
  • Vba excel перевод числа в текст
  • Vba excel перевод строки возврат каретки
  • Vba excel перевод строки в ячейке excel
  • Vba excel перевод строки в строке