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

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

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

Author24 — интернет-сервис помощи студентам
Нужно в ("C5:C116") вместо С116 вставить переменну i, которая обозначает ячейку. Подскажите пожалуйста как это реализовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2012, 01:18
Ответы с готовыми решениями:

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

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

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

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

31
11513 / 3799 / 681
Регистрация: 13.02.2009
Сообщений: 11,217
15.06.2012, 01:37 2
Visual Basic
1
"C5:" & i
Подразумевается, что в i есть и буква
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 02:05  [ТС] 3
я сам запутался =(
нужно что бы макрос работал только для тех ячеек, где есть значение. Я хотел следующим кодом определить последнюю ячейку, вывести адрес ячейки в переменную 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
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
15.06.2012, 04:51 4
Visual Basic
1
Range("C5", Cells(lLastRow, lLastCol))
1
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
15.06.2012, 08:35 5
Цитата Сообщение от 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 6
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 7
Цитата Сообщение от 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 8
Цитата Сообщение от Dmitrii Посмотреть сообщение
А разве не проще для этой цели использовать метод SpecialCells?
А если у вас данные идут не с первой строки?
Например несколько строк пропущенных, потом что-то типа шапки таблицы, в которой тоже не все ячейки заполнены?
Какую строку вернет ваш метод?
Правильно - первую строку в которой есть пустая ячейка в столбце поиска.
Но она будет далеко не последняя из строк с данными.

Добавлено через 12 минут
вообще конечно способов может быть туча и разных.
Который и как применить - все зависит от конкретных условий.
ТС дана куча ответов на его вопрос - что нибудь да пригодится
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
15.06.2012, 10:55 9
Цитата Сообщение от 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 10
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 11
Цитата Сообщение от sulfur Посмотреть сообщение
Не по теме:
как тут в коде VB вставлять отступы? тэг[INDENT] не работает =/

Не по теме:

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



Добавлено через 2 минуты
Цитата Сообщение от Dmitrii Посмотреть сообщение
Да ведь ничего же не мешает задать вместо целого столбца нужный диапазон.
Ну так функция то была написана или может быть даже откуда то выдернута в непонятно каком забытом году
Багаж знаний то растет.
А сейчас просто по привычке тащу ее из проекта в проект
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
15.06.2012, 11:04 12
хотя со SpecialCells проще, оказывается =)
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 12:59  [ТС] 13
Цитата Сообщение от 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 14
Цитата Сообщение от 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  [ТС] 15
Цитата Сообщение от 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 16
Цитата Сообщение от 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  [ТС] 17
Цитата Сообщение от 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
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
15.06.2012, 15:18 18
такую ошибку может выдавать только в одном случае - если Selection совпадает с Destination
конкретно для Вашего случая - все ячейки в столбце C ниже C5 - пустые.
2
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 15
15.06.2012, 15:52  [ТС] 19
Цитата Сообщение от ikki Посмотреть сообщение
такую ошибку может выдавать только в одном случае - если Selection совпадает с Destination
конкретно для Вашего случая - все ячейки в столбце C ниже C5 - пустые.
Точно!! Извините меня, за мою недальновидность.
У меня сначала макрос вставляет пустой столбце С, затем в него протягивается формула.
Можно сделать что бы формулу копировало до последней строки, в которой есть данные?
Например столбец B, строка 120 является последней, то что бы формулу в столбце С протянуло до 120 строки.
0
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
15.06.2012, 16:02 20
попробуйте так:
Visual Basic
1
[c5].resize([b:b].Find("*", , , , xlByRows, xlPrevious).row-4,1).formular1c1= "=RC[2]/RC[1]"
2
15.06.2012, 16:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2012, 16:02
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru