Здравствуйте! Как найти последнюю заполненную ячейку - есть много постов. А мне нужно найти адрес правой нижней ячейки диапазона, ограниченного рамкой. К примеру, рамка охватывает диапазон A1:G18. Макрос должен найти ячейку G18 или, лучше, первую ячейку вне диапазона - H19. (независимо, заполнена ячейка или пустая) Подскажите, пожалуйста, какие команды можно использовать, чтобы макрос опирался на расположение рамки. Спасибо. p.s. Если на листе несколько рамок, то ищется самая крайняя ячейка (пересечение - крайний правый столбец, имеющий хотя бы единственную обрамлённую ячейку, и такая же крайняя нижняя строка). p.p.s Догадываюсь, что нужно использовать слово "Borders", а как именно - ума не приложу.
Муторное это дело - перебирать ячейки и проверять на наличие границ. Лучше 'привязаться' к какому нибудь другому признаку. Как правило, какая нибудь ячейка со словом 'Итого' или что-то вроде этого
ОК, тогда так (чтобы не перебирать все миллионы ячеек): организовать цикл справа налево, снизу вверх, начиная с сотой ячейки в строке и в столбце - "CV:100". Этого будет более, чем достаточно. Как макрос упирается в первую попавшуюся ячейку с бордюром (даже если ячейка касается бордюра только точечно, уголком) , так - три зелёных свистка и - msgbox "Вот она!!! Поймал!!!"
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, спасибо, но годится только для одинарной рамки ("внешние границы"). А если сделать несколько вложенных рамок или вообще замостить бордюрами ("все границы"), то макрос определяет каждую ячейку с бордюром. А надо - только одну, самую правую и нижнюю.
Ігор Гончаренко, здесь - ячейка C3. пересечение ПРОДОЛЖЕНИЯ крайнего правого и ПРОДОЛЖЕНИЯ нижнего бордюра, и - смещение вправо вниз на ячейку. (вариант - ячейка В2. Это та, которая остаётся внутри пересечения.) Мне подошёл бы любой вариант.
RAN, крайняя - правая нижняя ячейка. Это С10. Согласен, тут приведён прикольный вариант с бордюрами. В таком случае макросу надо дать возможность самому виртуально построить рамку вокруг всех ячеек, имеющих части бордюра.
Public Function getBottomRightOutsideBorderCell(ByVal inSheet As Worksheet) As Range
Dim pCell As Range, rightCol As Long, bottomRow As Long
Dim pBorder As Border, hasBorder As Boolean, result As Range
rightCol = 0: bottomRow = 0: Set result = Nothing
For Each pCell In inSheet.UsedRange
hasBorder = False
For Each pBorder In pCell.Borders
If pBorder.LineStyle <> xlNone Then
hasBorder = True
Exit For
End If
Next
If hasBorder Then
If pCell.Column > rightCol Then rightCol = pCell.Column
If pCell.Row > bottomRow Then bottomRow = pCell.Row
End If
Next
If rightCol > 0 Then Set result = inSheet.Cells(bottomRow + 1, rightCol + 1)
Set getBottomRightOutsideBorderCell = result
End Function
Вот частный случай: надо найти ячейку АМ56 (закрашена жёлтым).
Андрей VG, благодарю за код. Но, как ни пытался использовать функцию, вставлять её в процедуру "Sub", - не получилось. Знаний мало. Подскажите, что вписать в скобки после наименования функции:
Код
Sub test()
getBottomRightOutsideBorderCell
MsgBox result
End Sub
Предупреждать надо, что вы программист 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