Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

Чемпионы рейтинга экспертов в этой рассылке

Botsman
Статус: Практикант
Рейтинг: 124
∙ повысить рейтинг >>
Тимошенко Дмитрий
Статус: 10-й класс
Рейтинг: 123
∙ повысить рейтинг >>
DrakoN
Статус: Практикант
Рейтинг: 15
∙ повысить рейтинг >>

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 894
от 12.05.2009, 22:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 292, Экспертов: 29
В номере:Вопросов: 1, Ответов: 2

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>

Вопрос № 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 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает: 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 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вы имеете возможность оценить этот выпуск рассылки.
    Нам очень важно Ваше мнение!
    Оценить этот выпуск рассылки >>

    Отправить вопрос экспертам этой рассылки

    Приложение (если необходимо):

    * Код программы, выдержки из закона и т.п. дополнение к вопросу.
    Эта информация будет отображена в аналогичном окне как есть.

    Обратите внимание!
    Вопрос будет отправлен всем экспертам данной рассылки!

    Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
    экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


    Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
    Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RusFAQ.ru, Россия, Москва.
    Авторское право: ООО "Мастер-Эксперт Про"
    Техподдержка портала, тел.: +7 (926) 535-23-31
    Хостинг: "Московский хостер"
    Поддержка: "Московский дизайнер"
    Авторские права | Реклама на портале

    ∙ Версия системы: 5.13 от 01.12.2008

    Яндекс Rambler's Top100
    RusFAQ.ru | MosHoster.ru | MosDesigner.ru
    RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

    В избранное