Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/313: Рейтинг темы: голосов - 313, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15

Как указать адрес ячейки через переменную

15.06.2012, 01:18. Показов 65507. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно в ("C5:C116") вместо С116 вставить переменну i, которая обозначает ячейку. Подскажите пожалуйста как это реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.06.2012, 01:18
Ответы с готовыми решениями:

Адрес ячейки через переменную
Добрый день! Несколько раз перечитал аналогичные темы, но рецепты не помогали, либо мозгов не хватало. Уважаемые жители форума! ...

Как сохранить в переменную адрес активной ячейки, а затем эту ячейку выделить?
Физический смысл такой: Когда пользователь клацает по листочкам, активируется макрос, закрепляющий шапки, и в следствии этого выделяется...

Можно ли указать адрес ячейки, путем выделения её на листе?
Привет! Задача такая: Программа должна переносить данные с одной ячейки в другую. Т.е. выбираем ячейку, из которой хотим перенести...

31
 Аватар для Alex77755
11523 / 3810 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
15.06.2012, 01:37
Visual Basic
1
"C5:" & i
Подразумевается, что в i есть и буква
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 02:05  [ТС]
я сам запутался =(
нужно что бы макрос работал только для тех ячеек, где есть значение. Я хотел следующим кодом определить последнюю ячейку, вывести адрес ячейки в переменную i. В коде указать i как границу для макроса.


Visual Basic
1
2
3
4
Dim lLastRow As Long
  Dim lLastCol As Long
     lLastRow = Cells(Rows.Count, 3).End(xlUp).Row
      lLastCol = Cells(3, Columns.Count).End(xlToLeft).Column
Подскажите пожалуйста, как это реализовать?

Добавлено через 10 минут
Visual Basic
1
Selection.AutoFill Destination:=Range("C5:" & lLastRow, lLastCol), Type:=xlFillDefault
вот тут выдает ошибку Method 'Range' of object' _Global' Failed
0
призрак
 Аватар для ikki
3265 / 893 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
15.06.2012, 04:51
Visual Basic
1
Range("C5", Cells(lLastRow, lLastCol))
1
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
15.06.2012, 08:35
Цитата Сообщение от nnndaniil Посмотреть сообщение
нужно что бы макрос работал только для тех ячеек, где есть значение. Я хотел следующим кодом определить последнюю ячейку, вывести адрес ячейки в переменную i. В коде указать i как границу для макроса.
Если строки с данными идут без разрывов внутри, то я обычно пользую:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function Разрыв(Лист, КонтрСтолбец, Optional СоСтроки As Integer)
'функция просматривает ячейки КонтрСтолбца и возвращает номер
'строки в которой найдена пустая ячейка (своеобразный EOF).
'Можно "искать" разрыв, начиная СоСтроки, иначе с первой
  Dim Строка  As Integer
  With Worksheets(Лист)
    If СоСтроки = 0 Then
        Строка = 1
    Else
        Строка = СоСтроки
    End If
 
    Do While .Cells(Строка, КонтрСтолбец).Value <> ""
        Разрыв = Строка
        Строка = Строка + 1
    Loop
  End With
End Function
Понятно что таким же образом, модифицировав макрос, можно найти крайний столбец.
Их пересечение даст крайнюю ячейку
1
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
15.06.2012, 10:07
Range(Cells(i0, j0), Cells(i1,j1))
Где
i0 - номер строки левой верхней ячейки диапазона,
j0 - Номер столбца левой верхней ячейки диапазона,
i1 - номер строки правой нижней ячейки диапазона,
j1 - номер столбца правой нижней ячейки диапазона.
1
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
15.06.2012, 10:26
Цитата Сообщение от skol13 Посмотреть сообщение
...функция просматривает ячейки КонтрСтолбца и возвращает номер строки в которой найдена пустая ячейка (своеобразный EOF)...
А разве не проще для этой цели использовать метод SpecialCells?
Пример:
Visual Basic
1
Worksheets(1).Columns(1).Cells.SpecialCells(xlCellTypeBlanks).Item(1).Row
1
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
15.06.2012, 10:47
Цитата Сообщение от Dmitrii Посмотреть сообщение
А разве не проще для этой цели использовать метод SpecialCells?
А если у вас данные идут не с первой строки?
Например несколько строк пропущенных, потом что-то типа шапки таблицы, в которой тоже не все ячейки заполнены?
Какую строку вернет ваш метод?
Правильно - первую строку в которой есть пустая ячейка в столбце поиска.
Но она будет далеко не последняя из строк с данными.

Добавлено через 12 минут
вообще конечно способов может быть туча и разных.
Который и как применить - все зависит от конкретных условий.
ТС дана куча ответов на его вопрос - что нибудь да пригодится
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
15.06.2012, 10:55
Цитата Сообщение от nnndaniil Посмотреть сообщение
я сам запутался =(
нужно что бы макрос работал только для тех ячеек, где есть значение.
я всегда делал так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
With ОбластьТипаRange
Dim obLast as Range, obCurr as Range
set obLast = .Find("*", searchdirection:=xlPrevious)
if Not obLast is nothing then
set obCurr = obLast
do
set obCurr = .Find("*", after:=obCurr)
Call ОбработкаНайденнойЯчейки(obCurr)
loop obCurr.Address = obLast.Address
endif
end with
Там возникают проблемы, только если по ходу обработки удаляешь или вставляешь ячейки. Не помню этих тонкостей, но если кому надо будет...

Не по теме:

как тут в коде VB вставлять отступы? тэг[INDENT] не работает =/

1
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
15.06.2012, 10:58
skol13, моя реплика относится не к задаче автора темы, а к Вашей функции.
Цитата Сообщение от skol13 Посмотреть сообщение
А если у вас данные идут не с первой строки?..
Да ведь ничего же не мешает задать вместо целого столбца нужный диапазон. В функции-то Вы его задаёте, используя переменную СоСтроки.
Visual Basic
1
Worksheets(1).Range(Cells(СоСтроки, 1), Cells(65536, 1)).Cells.SpecialCells(xlCellTypeBlanks).Item(1).Row
1
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
15.06.2012, 11:02
Цитата Сообщение от sulfur Посмотреть сообщение
Не по теме:
как тут в коде VB вставлять отступы? тэг[INDENT] не работает =/

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от Dmitrii Посмотреть сообщение
Да ведь ничего же не мешает задать вместо целого столбца нужный диапазон.
Ну так функция то была написана или может быть даже откуда то выдернута в непонятно каком забытом году
Багаж знаний то растет.
А сейчас просто по привычке тащу ее из проекта в проект
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
15.06.2012, 11:04
хотя со SpecialCells проще, оказывается =)
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 12:59  [ТС]
Цитата Сообщение от Gibboustooth Посмотреть сообщение
Range(Cells(i0, j0), Cells(i1,j1))
Решил сделать по Вашему примеру, но теперь мне выдает ошибку в строке Selection.AutoFill Destination.
Вот собственно весь код, мне нужно до последней ячейки, в которой есть данные, столбца С- вставить формулу.

Visual Basic
1
2
3
4
5
6
7
8
Range("C5").Select
    ActiveCell.FormulaR1C1 = "=++RC[2]/RC[1]"
    Range("C5").Select
    
    Selection.AutoFill Destination:=Range(Cells(i5, j3), Cells(i200, j3)), Type:=xlFillDefault
    
    Range("C5:C200").Select
    ActiveWindow.SmallScroll Down:=200
0
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
15.06.2012, 13:16
Цитата Сообщение от nnndaniil Посмотреть сообщение
Решил сделать по Вашему примеру, но теперь мне выдает ошибку в строке Selection.AutoFill Destination.
i и j перед числами не надо ставить. "0" и "1" в моих примерах - просто индексы. Надо было отформатировать:

Range(Cells(i0, j0), Cells(i1,j1))


Извинияюсь
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 13:50  [ТС]
Цитата Сообщение от Gibboustooth Посмотреть сообщение
i и j перед числами не надо ставить. "0" и "1" в моих примерах - просто индексы. Надо было отформатировать:

Range(Cells(i0, j0), Cells(i1,j1))


Извинияюсь
Поставил, все заработало, спасибо!
Но я рассчитывал на другой результат, что в этом диапазоне, он будет искать последнюю заполненную ячейку и вставлять формулу только до последней заполненной ячейки, а не для всего диапазона.
Подскажите пожалуйста, как это можно реализовать?
0
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
15.06.2012, 14:25
Цитата Сообщение от nnndaniil Посмотреть сообщение
Но я рассчитывал на другой результат, что в этом диапазоне, он будет искать последнюю заполненную ячейку и вставлять формулу только до последней заполненной ячейки, а не для всего диапазона.
Подскажите пожалуйста, как это можно реализовать?
выбор последней заполненной ячейки на листе:
Visual Basic
1
Cells.Find("*", , , , xlByRows, xlPrevious)

Если нужно найти последнюю ячейку в определенном столбце:
Visual Basic
1
Columns(i).Find("*", , , , xlByRows, xlPrevious)
где i - номер столбца.

В вашем случае код будет выглядеть так:
Visual Basic
1
Selection.AutoFill Destination:=Range(Cells(5, 3), Columns(3).Find("*", , , , xlByRows, xlPrevious)), Type:=xlFillDefault
2
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 14:42  [ТС]
Цитата Сообщение от Gibboustooth Посмотреть сообщение
В вашем случае код будет выглядеть так:
Visual Basic
1
Selection.AutoFill Destination:=Range(Cells(5, 3), Columns(3).Find("*", , , , xlByRows, xlPrevious)), Type:=xlFillDefault

Теперь на этой строчке
Visual Basic
1
Selection.AutoFill Destination:=
выдает ошибку, что метод AutoFill из класса Range завершен не верно.

Код сейчас такой:
Visual Basic
1
2
3
4
5
 Range("C5").Select
    ActiveCell.FormulaR1C1 = "=++RC[2]/RC[1]"
    Range("C5").Select
    Selection.AutoFill Destination:=Range(Cells(5, 3), Columns(3).Find("*", , , , xlByRows, xlPrevious)), Type:=xlFillDefault
Range("C5:C150").Select
В чем может быть ошибка?
0
призрак
 Аватар для ikki
3265 / 893 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
15.06.2012, 15:18
такую ошибку может выдавать только в одном случае - если Selection совпадает с Destination
конкретно для Вашего случая - все ячейки в столбце C ниже C5 - пустые.
2
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 15:52  [ТС]
Цитата Сообщение от ikki Посмотреть сообщение
такую ошибку может выдавать только в одном случае - если Selection совпадает с Destination
конкретно для Вашего случая - все ячейки в столбце C ниже C5 - пустые.
Точно!! Извините меня, за мою недальновидность.
У меня сначала макрос вставляет пустой столбце С, затем в него протягивается формула.
Можно сделать что бы формулу копировало до последней строки, в которой есть данные?
Например столбец B, строка 120 является последней, то что бы формулу в столбце С протянуло до 120 строки.
0
призрак
 Аватар для ikki
3265 / 893 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
15.06.2012, 16:02
попробуйте так:
Visual Basic
1
[c5].resize([b:b].Find("*", , , , xlByRows, xlPrevious).row-4,1).formular1c1= "=RC[2]/RC[1]"
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2012, 16:02
Помогаю со студенческими работами здесь

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

Как указать аргумент через переменную?
есть код: ShellExecute (NULL, L&quot;open&quot;, L&quot;C:\\Program Files\\1Cv77\\BIN\\1CV7.exe&quot;, L&quot;enterprise /M /DC:\\cpp\\1s_auto_ms\\auto\\db...

Как записать 0 в переменную через ее адрес?
Здравствуйте. Как записать 0 в переменную через ее адрес? .data curDay BYTE 11h curMonth BYTE 22h curYear BYTE 33h ...

Как указать адрес "ячейки"?
Здравствуйте! Есть таблица, создана ленточная форма. Операторы вбивают инфу в &quot;главной&quot; форме по &quot;ячейкам&quot;. Возможно...

Указать адрес ячейки Excel цифровыми координатами, а не буквенными
Открываю или создаю, если нету, файл Excel и забиваю в него данные. ​*private void WriteDataInExcel() { DateTime...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
Вот в чем сила LM.
Hrethgir 02.07.2025
как на английском будет “обслуживание“ Слово «обслуживание» на английском языке может переводиться несколькими способами в зависимости от контекста: * **Service** — самый распространённый. . .
Использование Keycloak со Spring Boot и интеграция Identity Provider
Javaican 01.07.2025
Два года назад я получил задачу, которая сначала показалась тривиальной: интегрировать корпоративную аутентификацию в микросервисную архитектуру. На тот момент у нас было семь Spring Boot приложений,. . .
Содержание темы с примерами на WebGL
8Observer8 01.07.2025
Все примеры из книги Мацуды и Ли в песочнице JSFiddle Пример выводит точку красного цвета размером 10 пикселей на WebGL 1. 0 и 2. 0 WebGL 1. 0. Передача координаты точки из главной программы в. . .
Основы WebGL. Простой треугольник
8Observer8 01.07.2025
Простой треугольник без трансформаций. Для трансформаций можно использовать glMatrix, как в примере: https:/ / plnkr. co/ edit/ qT6ZTwvncLPRamK5?preview На русском: . . .
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
Стратегии кеширования
Javaican 29.06.2025
Кеширование — это хранение часто запрашиваемых данных в быстром хранилище (обычно в памяти), чтобы не обращаться к более медленному первоисточнику. Казалось бы, все просто. Но за этой простотой. . .
Наблюдаемость приложений ASP.NET Core с OpenTelemetry, Prometheus и Grafana
ArchitectMsa 29.06.2025
Наблюдаемость (observability) – это ключевое свойство современной системы, позволяющее понимать её внутреннее состояние на основе внешних данных. Если мониторинг отвечает на вопрос "что случилось?",. . .
Четыре главных модели отношений классов в с++
russiannick 28.06.2025
Продолжаю крестовый поход против c++. ideone. com/ юзаю для проверки валидности кода. Насчитал 4 модели отношений классов: одиночный класс, равноправные классы, слейв - мастер, терминатор. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru