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

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

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

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

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

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

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

31
 Аватар для Alex77755
11525 / 3812 / 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
3266 / 894 / 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
3266 / 894 / 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
3266 / 894 / 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru