Страницы: 1
RSS
Найти крайнюю ячейку относительно границы рамки
 
Здравствуйте!
Как найти последнюю заполненную ячейку - есть много постов.
А мне нужно найти адрес правой нижней ячейки диапазона, ограниченного рамкой.
К примеру, рамка охватывает диапазон A1:G18.
Макрос должен найти ячейку G18 или, лучше, первую ячейку вне диапазона - H19.
(независимо, заполнена ячейка или пустая)
Подскажите, пожалуйста, какие команды можно использовать, чтобы макрос опирался на расположение рамки.
Спасибо.
p.s. Если на листе несколько рамок, то ищется самая крайняя ячейка (пересечение - крайний правый столбец, имеющий хотя бы единственную обрамлённую ячейку, и такая же крайняя нижняя строка).
p.p.s Догадываюсь, что нужно использовать слово "Borders", а как именно - ума не приложу.
Изменено: MrBrown - 03.06.2019 16:48:26
 
Муторное это дело - перебирать ячейки и проверять на наличие границ. Лучше 'привязаться' к какому нибудь другому признаку. Как правило, какая нибудь ячейка со словом 'Итого' или что-то вроде этого
Изменено: Sanja - 03.06.2019 16:48:53
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
Муторное это дело
ОК, тогда так (чтобы не перебирать все миллионы ячеек):
организовать цикл справа налево, снизу вверх, начиная с сотой ячейки  в строке и в столбце - "CV:100".
Этого будет более, чем достаточно.
Как макрос упирается в первую попавшуюся ячейку с бордюром (даже если ячейка касается бордюра только точечно, уголком) , так - три зелёных свистка и - msgbox "Вот она!!! Поймал!!!"
Изменено: MrBrown - 03.06.2019 16:55:28
 
Цитата
MrBrown написал: лучше, первую ячейку вне диапазона
Код
Sub FindBorders()
Dim cl As Range
With ActiveSheet
For Each cl In .UsedRange.Cells
    If cl.Borders(xlEdgeRight).LineStyle <> xlNone And cl.Borders(xlEdgeBottom).LineStyle <> xlNone Then
        MsgBox "Ячейка найдена!" & vbCrLf & "Адрес - " & cl.Offset(1, 1).Address(0, 0)
    End If
Next
End With
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja, спасибо, но годится только для одинарной рамки ("внешние границы").
А если сделать несколько вложенных рамок или вообще замостить бордюрами ("все границы"),
то макрос определяет каждую ячейку с бордюром.
А надо - только одну, самую правую и нижнюю.
 
Цитата
MrBrown написал: А надо - только одну, самую правую и нижнюю.
Ну поэкспериментируйте сами.
Цитата
MrBrown написал: Догадываюсь, что нужно использовать слово "Borders", а как именно - ума не приложу.
Я Вам показал как 'использовать это слово'
Согласие есть продукт при полном непротивлении сторон
 
cм. вложение, какая из ячеек с рамкой тут крайняя?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
MrBrown, я Вас сразу предупредил
Цитата
Sanja написал: Муторное это дело
Ищите другой признак.
Согласие есть продукт при полном непротивлении сторон
 
Ігор Гончаренко, здесь - ячейка C3.
пересечение ПРОДОЛЖЕНИЯ крайнего правого и ПРОДОЛЖЕНИЯ нижнего бордюра, и - смещение вправо вниз на ячейку.
(вариант - ячейка В2. Это та, которая остаётся внутри пересечения.)
Мне подошёл бы любой вариант.

Sanja, а можно так? (см. ответ Игорю Гончаренко).
Изменено: MrBrown - 04.06.2019 09:23:16
 
Опираться на границу ячейки - плохая идея.
Угадайте с 2 раз, какая ячейка отвечает вашим условиям?
 
RAN, крайняя - правая нижняя ячейка. Это С10.
Согласен, тут приведён прикольный вариант с бордюрами.
В таком случае макросу надо дать возможность самому виртуально построить рамку вокруг всех ячеек, имеющих части бордюра.
 
Доброе время суток
Цитата
MrBrown написал:
здесь - ячейка C3.
Вариант
Скрытый текст
 
Вот частный случай:
надо найти ячейку АМ56 (закрашена жёлтым).

Андрей VG, благодарю за код. Но, как ни пытался использовать функцию, вставлять её в процедуру "Sub", - не получилось.
Знаний мало. Подскажите, что вписать в скобки после наименования функции:
Код
Sub test()
    getBottomRightOutsideBorderCell
    MsgBox result
End Sub
Изменено: MrBrown - 05.06.2019 12:10:55
 
Цитата
MrBrown написал:
Знаний мало
Предупреждать надо, что вы программист Ctrl+C, Ctrl+V :)
Код
Sub test()
    Dim lastNonBorderCell As Range
    Set lastNonBorderCell = getBottomRightOutsideBorderCell(ActiveSheet)
    If Not lastNonBorderCell Is Nothing Then MsgBox lastNonBorderCell.Address(ReferenceStyle:=xlA1, External:=True)
End Sub
 
Андрей VG, Работает! Моя благодарность - словами не описать.
Цитата
Андрей VG написал:
Предупреждать надо, что вы программист Ctrl+C, Ctrl+V
Класс! Я восхищён таким точным определением дилетанта от программирования. :)
Возьму на вооружение. :D  
Изменено: MrBrown - 05.06.2019 14:12:41
Страницы: 1
Наверх