Сделаем функцию-заглушку, внутри которой точно нет проблемы:
PureBasic | ||
|
Она тоже не работает, ошибка 501. Слово «диапазон» это случайно не есть ключевое слово? Проверить я не смог, если вместо range написать диапазон, ругается, но это все-таки на кириллицу наверное.
Добавлено через 14 минут
Ошибка 501, оказывается — это просто LibreOffice не видел функцию Foo (в случае с функцией Place по-прежнему 501, хотя теперь он ее должен видеть), теперь ошибка в Basic IDE «переменная типа object не установлена»
Добавлено через 10 минут
Упс, «object не задан» — это я при вызове функции 1 параметр вместо 2 указал, так что изначально все правильно написал — функция Foo дает ошибку 501
Добавлено через 8 минут
Спасибо, Range все-таки работает, просто параметры нужно писать через точку в запятой
-
11.03.2004 16:17
#1
system architect
- Вес репутации
- 0
Как передать в функцию адрес ячейки? (VBA, Excel)
День добрый!
Есть такая функция:
Function my_function(addr As Variant) As Variant
my_function = addr
End FunctionОна должна запускаться из ячейки листа Excel, например:
=my_function(A1) ‘ результат ее работы — значение ячейки А1
Вопрос: как передать в функцию не значение, а адрес ячейки, т.е. переменная addr=А1?
-
Реклама на форуме:
-
16.03.2004 14:49
#2
system architect
- Вес репутации
- 0
Решение
А вот и решение (спасибо AndreyV)
Public Function my_function(rng As Range) As Variant
my_function = rng.Address
End Function
-
17.03.2004 12:23
#3
Super Moderator
system architect
- Вес репутации
- 27
На случай, если работа этой функции являлась самоцелью, дополню решение напоминанием о стандартной функции, которая делает то же самое.
=ЯЧЕЙКА(«Адрес»;<ссылка>) подробнее в спарвке
Передать в пользовательскую функцию, адрес где она находится |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Fankis Пользователь Сообщений: 3 |
Здравствуйте! Помогите разобраться. |
Вынести координаты в аргументы. |
|
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#3 08.08.2016 16:08:04
<#0> |
||
Игорь Гончаренко Пользователь Сообщений: 13746 |
#4 08.08.2016 16:28:42
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
МатросНаЗебре Пользователь Сообщений: 5516 |
#5 08.08.2016 16:29:43
Ещё проще. Соседнюю ячейку в аргументы.
|
||||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#6 08.08.2016 16:36:04
это не проще в ряде случаев. Особенно, когда есть специальный объект Caller. Ну а вообще, господа, JayBhagavan вполне резонное замечание сделал. Зачем делать медвежью услугу форуму? Тема создана с нарушением правил. Помогли, отлично, всем конфетка Но чтобы помочь не надо особо утруждаться — вопрос-то простой. Но ведь автор и в следующий раз нарушит правила и назовет тему абы как. И так далее. И будет у нас на форуме помойка из серии тем «как», «формула», «VBA» и т.п. Ну сами же здесь обитаем — давайте правила уважать и не добавлять модераторам работы. Несложно же направить новичка в правила, чтобы он понял, что название должно отражать суть. Не захочет другое название придумать — значит не особо-то и нужно было решение. Но как правило же у нас участники все разумные и понимают зачем это надо. А так он может и не задуматься — решение-то и без того дали, зачем лишний раз напрягаться? Изменено: The_Prist — 08.08.2016 16:38:06 Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Fankis Пользователь Сообщений: 3 |
Всем спасибо за помощь и критику. Вопрос решился так: Application.ThisCell.Address. Выручило элементарное знание английского, чутье и хелп =) |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#9 08.08.2016 18:19:03
Вдруг пригодится для общего образования: Кто вызвал функцию или процедуру? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Fankis Пользователь Сообщений: 3 |
#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.