Вопрос № 166731: Здравствуйте. у меня вопрос по поводу макросов для Екселя. требуется найти на активном листе первую пустую ячейку (при построчном поиске) и записать в нее значение из переменной. нашел функцию Find но не понял как пользоваться ее результатами. пр...
Вопрос № 166.731
Здравствуйте. у меня вопрос по поводу макросов для Екселя. требуется найти на активном листе первую пустую ячейку (при построчном поиске) и записать в нее значение из переменной. нашел функцию Find но не понял как пользоваться ее результатами. приведите пожалуйста пример как извлечь номера (в цифровом виде) строки и столбца пустой ячейки так что потом к ней можно было обращаться через Cells(i,j). заранее спасибо. извиняюсь если где-то что-то некорректно озвучил - я с Бейском почти не дружу
Отправлен: 07.05.2009, 20:23
Вопрос задал: PROD (статус: Студент)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 4)
Отвечает: Megaloman
Здравствуйте, PROD! Как я понял, Вы находитесь в строке в активной ячейке и Вам надо найти первую пустую ячейку в этой же строке. Если Вы не знаете номер строки или столбца, в которой находится активная ячейка, то их номера определим как i = ActiveCell.Row ' Строка j = ActiveCell.Column ' Столбец
Если Вам надо попасть на первую пустую ячейку в строке, то идея нахождения номера столбца такая: 1. станем на первый столбец этой строки, если ячейка пустая, задача решена 2. если следующая
ячейка пустая, прибавим к начальному номеру столбца ячейки 1 (то есть, если ищем сначала строки, это 2 ячейка). Задача решена. 3. если ячейка не пустая, сместимся на последнюю заполненную ячейку до первой пустой и прибавим к номеру столбца найденной ячейки 1. Задача решена.
k = 1 If Cells(i, k) <> "" Then If Cells(i, k + 1) = "" Then k = k + 1 Else k = Cells(i, 1).End(xlToRight).Column +
1 End If End If
Тут не корректно звучит слово "станем" Чтобы этот способ работал, совершенно не обязательно отталкиваться от активной ячейки, способ работает вне зависимости от того, какая ячейка в таблице выбрана. Вы находите пустую ячейку в желаемой строке. Опять же, если Вам надо найти пустую клетку не относительно первой ячейки в строке, то единственно присваеваем нужное начальное значение k
Совершенно аналогично работает поиск в столбце, только Row заменится на
Column, а End(xlToRight) на End(xlDown)
Оффтопик:
После дополнения HookEst (спасибо ему!) выше были заменены следующие строки кода, которые в редком случае могли отработать неправильно. k = 1 If Cells(i, k) <> "" Then k = Cells(i, 1).End(xlToRight).Column + 1
--------- Нет времени на медленные танцы
Ответ отправил: Megaloman (статус: Практикант)
Ответ отправлен: 07.05.2009, 22:43
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 248813 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает: HookEst
Здравствуйте, PROD! В дополнение к предыдущему ответу:
в случае если Cells(i, k) = <> "", но Cells(i, k+1) = "", то - Cells(i, k).End(xlToRight) - вернет не Cells(i, k+1), как хотелось бы, а самую последнюю ячейку в строке, т.е. Cells(i, 255) это легко проверить и без кода, учитывая что аналог ActiveCell.End(xlToRight).Activete - это Ctrl+"Стрелка вправо"
но кроме замечательного метода Range.End, есть еще замечательный метод Range.SpecialCells. Вызов
SpecialCells(xlCellTypeBlanks) - вернет Range из всех пустых ячеек, откуда первую выбрать, уже нет проблем:
Код:
Option Explicit
Sub t() With GetFirstEmpty(ActiveSheet.Cells) MsgBox .Address & " in active sheet"<
br> End With With GetFirstEmpty(ActiveCell.EntireRow) MsgBox .Address & " in active row" End With With GetFirstEmpty(ActiveCell.EntireColumn) MsgBox .Address & " in active column" End With
End Sub
'!!! в случае если r - не принадлежит UsedRange или в UsedRange нет пустых ячеек - НЕ РАБОТАЕТ Function GetFirstEmpty(r As Range) As Range Set GetFirstEmpty = r.SpecialCells(xlCellTypeBlanks).Cells(1) End Function
Успехов.
поторопился
с ответом, в случае если r - не принадлежит UsedRange - требуется доп обработка, универсально здесь не подойдешь, попробую исправиться
Код:
Sub t2() With GetFirstEmptyInRow(ActiveCell)
MsgBox .Address & " in active row" End With With GetFirstEmptyInColumn(ActiveCell) MsgBox .Address & " in active column" End With
End Sub
Function GetFirstEmptyInRow(r As Range) As Range On Error Resume Next Set GetFirstEmptyInRow = r.EntireRow.SpecialCells(xlCellTypeBlanks).Cells(1) If Err.Number <> 0 Then Set GetFirstEmptyInRow = r.EntireRow.Cells(1, 255).End(xlToLeft) If Not IsEmpty(GetFirstEmptyInRow)
Then Set GetFirstEmptyInRow = GetFirstEmptyInRow.Offset(0, 1) End If End Function
Function GetFirstEmptyInColumn(r As Range) As Range On Error Resume Next Set GetFirstEmptyInColumn = r.EntireColumn.SpecialCells(xlCellTypeBlanks).Cells(1) If Err.Number <> 0 Then Set GetFirstEmptyInColumn = r.EntireColumn.Cells(65536, 1).End(xlUp) If Not IsEmpty(GetFirstEmptyInColumn) Then Set GetFirstEmptyInColumn =
GetFirstEmptyInColumn.Offset(1) End If End Function
Ответ отправил: HookEst (статус: Специалист)
Ответ отправлен: 08.05.2009, 03:00
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 248819 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Скажите "спасибо" эксперту, который помог Вам!
Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
на короткий номер 1151 (Россия)
Номер ответа и конкретный текст СМС указан внизу каждого ответа.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.