Skip to content

range

range from cell value

INDIRECT(CONCATENATE("A",B2))

Get Range

Function Rng(ws as Sheet, r0 as long, c0 as long, r1 as long, c1 as long)
  return ws.Range(Cells(r0,c0),Cells(r1,c1))
End Function

get subrange

'remove first row
set subrng=rng.offset(1).resize(rng.rows.count-1)
'remove first col
set subrng=rng.offset(0,1).resize(rng.rows.count, rng.columns.count-1)

generic getrng

Function RngFirst(rng As Range) As Range
    'first cell in rng
    Set RngFirstCell = iif(rng.Cells.count = 1, rng, rng.Cells(1))
End Function

Function RngLastCUsedXlDown(rng0 As Range, Optional rowOffset As Long = 0) As Range
    'find last consecutively used cell at or below rng
    Dim rng As Range: Set rng = RngFirst(rng0).offset(rowOffset)
    Set RngLastCUsedXlDown = iif(IsEmpty(rng.offset(1, 0).Value), rng, rng.End(xlDown)) 'next cell is blank
End Function

Function RngLastCUsedXlRight(rng0 As Range, Optional colOffset As Long = 0) As Range
    'find last consecutively used cell at or after rng
    Dim rng As Range: Set rng = RngFirst(start0).offset(0, colOffset)
    Set RngLastCUsedXlRight = iif(IsEmpty(rng.offset(0, 1).Value), rng, rng.End(xlToRight)) 'next cell is blank
End Function

Function GetRng(rng0 As Range,
    Optional nrow As Long = -1, Optional ncol As Long = -1, _
        Optional rowOffset As Long = 0, Optional colOffset As Long = 0, _
        Optional xlDown As Boolean = True, Optional xlRight As Boolean = False, _
        Optional rowShift As Long = 0, Optional colShift As Long = 0) As Range
    Dim rng As Range: Set rng = RngFirst(rng0).offset(rowOffset, colOffset)
    If nrow = -1 Then nrow = iif(xlDown, RngLastCUsedXlDown(rng, rowOffset:=rowShift).row - rng.row + 1, rng0.rows.count - rowOffset)
    If ncol = -1 Then ncol = iif(xlRight, RngLastCUsedXlRight(rng.offset(rowShift, colShift)).Column - rng.Column + 1, rng0.Columns.count - colOffset)
    Set GetRng = rng.Parent.Range(rng, rng.offset(nrow - 1, ncol - 1))
End Function