ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Functions to get range properties (https://www.excelbanter.com/excel-programming/330328-functions-get-range-properties.html)

Nick Hebb

Functions to get range properties
 
I wrote the following utility functions for dealing with ranges. I
often want the first column number or label; last column number or
label; next column label; first row; last row, etc.

What I want to know is whether there is a better way to get this info
with built-in functions. Any ideas?

Here are the utility functions:


' Constants
Private Const ZEE As Integer = 26
Private Const MINCOL As Integer = 1
Private Const MAXCOL As Integer = 256
Private Const ASCII64 As Integer = 64
'
'

Public Function GetFirstColumnNumber(ByVal A1Address As String) As
Integer

Dim rng As Range

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
GetFirstColumnNumber = rng.Columns.Item(1).Column
Set rng = Nothing

End Function


Public Function GetLastColumnNumber(ByVal A1Address As String) As
Integer

Dim rng As Range
Dim iFirst As Integer
Dim iCount As Integer

iFirst = GetFirstColumnNumber(A1Address)

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
iCount = rng.Columns.Count
Set rng = Nothing

GetLastColumnNumber = iFirst + iCount - 1

End Function


Public Function GetFirstColumnLabel(ByVal A1Address As String) As
String

Dim iCol As Integer

iCol = GetFirstColumnNumber(A1Address)
GetFirstColumnLabel = ColumnNumberToLabel(iCol)

End Function


Public Function GetLastColumnLabel(ByVal A1Address As String) As String

Dim iCol As Integer

iCol = GetLastColumnNumber(A1Address)
GetLastColumnLabel = ColumnNumberToLabel(iCol)

End Function


Public Function GetFirstRowNumber(ByVal A1Address As String) As Integer

Dim rng As Range

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
GetFirstRowNumber = rng.Rows.Item(1).Row
Set rng = Nothing

End Function


Public Function GetLastRowNumber(ByVal A1Address As String) As Integer

Dim rng As Range
Dim iFirst As Integer
Dim iCount As Integer

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
iCount = rng.Rows.Count
Set rng = Nothing

GetLastRowNumber = GetFirstRowNumber(A1Address) + iCount - 1

End Function


Public Function ExtractCellAddress(ByVal FullAddress As String) As
String

If InStr(FullAddress, "!") 0 Then
FullAddress = Right(FullAddress, Len(FullAddress) - pos)
End If

ExtractCellAddress = FullAddress

End Function


Public Function ColumnNumberToLabel(ByVal ColumnNumber As Integer) As
String

Dim ret As String

If ColumnNumber < MINCOL Or ColumnNumber MAXCOL Then
ret = "!OutOfRangeError"
ElseIf ColumnNumber ZEE Then
ret = Chr(Int(ColumnNumber / ZEE) + ASCII64) &
Chr((ColumnNumber Mod ZEE) + ASCII64)
Else
ret = Chr(ColumnNumber + ASCII64)
End If

ColumnNumberToLabel = ret

End Function


Public Function GetNextColumnLabel(ByVal ColumnLabel As String) As
String

Dim char1 As String
Dim char2 As String
Dim iCol As Integer
Dim ret As String

If Len(ColumnLabel) = 1 Then
If ColumnLabel < "Z" Then
ret = Chr(Asc(ColumnLabel) + 1)
Else
ret = "AA" ' special case "Z" rolls over to "AA"
End If
ElseIf Len(ColumnLabel) = 2 Then
char1 = Left(ColumnLabel, 1)
char2 = Right(ColumnLabel, 1)
iCol = (Asc(char1) - ASCII64) * ZEE + Asc(char2) - ASCII64 + 1
ret = ColumnNumberToLabel(iCol)
Else
ret = "!OutOfRangeError"
End If

GetNextColumnLabel = ret

End Function


Bernie Deitrick

Functions to get range properties
 
Nick,

No need to fool around with declaring range variables, etc. For example, for
your first two functions, you could use:

Public Function GetFirstColumnNumber(ByVal A1Address As String) As Integer
GetFirstColumnNumber = Range(A1Address).Item(1).Column
End Function

Public Function GetLastColumnNumber(ByVal A1Address As String) As Integer
GetLastColumnNumber =
Range(A1Address).Cells(Range(A1Address).Cells.Coun t).Column
End Function

or you could use the worksheet functions - Array entered using
Ctrl-Shift-Enter (for consistency). For example:

=MIN(COLUMN(C1:F1))
=MAX(COLUMN(C1:F1))

HTH,
Bernie
MS Excel MVP


"Nick Hebb" wrote in message
oups.com...
I wrote the following utility functions for dealing with ranges. I
often want the first column number or label; last column number or
label; next column label; first row; last row, etc.

What I want to know is whether there is a better way to get this info
with built-in functions. Any ideas?

Here are the utility functions:


' Constants
Private Const ZEE As Integer = 26
Private Const MINCOL As Integer = 1
Private Const MAXCOL As Integer = 256
Private Const ASCII64 As Integer = 64
'
'

Public Function GetFirstColumnNumber(ByVal A1Address As String) As
Integer

Dim rng As Range

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
GetFirstColumnNumber = rng.Columns.Item(1).Column
Set rng = Nothing

End Function


Public Function GetLastColumnNumber(ByVal A1Address As String) As
Integer

Dim rng As Range
Dim iFirst As Integer
Dim iCount As Integer

iFirst = GetFirstColumnNumber(A1Address)

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
iCount = rng.Columns.Count
Set rng = Nothing

GetLastColumnNumber = iFirst + iCount - 1

End Function


Public Function GetFirstColumnLabel(ByVal A1Address As String) As
String

Dim iCol As Integer

iCol = GetFirstColumnNumber(A1Address)
GetFirstColumnLabel = ColumnNumberToLabel(iCol)

End Function


Public Function GetLastColumnLabel(ByVal A1Address As String) As String

Dim iCol As Integer

iCol = GetLastColumnNumber(A1Address)
GetLastColumnLabel = ColumnNumberToLabel(iCol)

End Function


Public Function GetFirstRowNumber(ByVal A1Address As String) As Integer

Dim rng As Range

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
GetFirstRowNumber = rng.Rows.Item(1).Row
Set rng = Nothing

End Function


Public Function GetLastRowNumber(ByVal A1Address As String) As Integer

Dim rng As Range
Dim iFirst As Integer
Dim iCount As Integer

Set rng = Application.ActiveWorkbook.Sheets(1).Range(A1Addre ss)
iCount = rng.Rows.Count
Set rng = Nothing

GetLastRowNumber = GetFirstRowNumber(A1Address) + iCount - 1

End Function


Public Function ExtractCellAddress(ByVal FullAddress As String) As
String

If InStr(FullAddress, "!") 0 Then
FullAddress = Right(FullAddress, Len(FullAddress) - pos)
End If

ExtractCellAddress = FullAddress

End Function


Public Function ColumnNumberToLabel(ByVal ColumnNumber As Integer) As
String

Dim ret As String

If ColumnNumber < MINCOL Or ColumnNumber MAXCOL Then
ret = "!OutOfRangeError"
ElseIf ColumnNumber ZEE Then
ret = Chr(Int(ColumnNumber / ZEE) + ASCII64) &
Chr((ColumnNumber Mod ZEE) + ASCII64)
Else
ret = Chr(ColumnNumber + ASCII64)
End If

ColumnNumberToLabel = ret

End Function


Public Function GetNextColumnLabel(ByVal ColumnLabel As String) As
String

Dim char1 As String
Dim char2 As String
Dim iCol As Integer
Dim ret As String

If Len(ColumnLabel) = 1 Then
If ColumnLabel < "Z" Then
ret = Chr(Asc(ColumnLabel) + 1)
Else
ret = "AA" ' special case "Z" rolls over to "AA"
End If
ElseIf Len(ColumnLabel) = 2 Then
char1 = Left(ColumnLabel, 1)
char2 = Right(ColumnLabel, 1)
iCol = (Asc(char1) - ASCII64) * ZEE + Asc(char2) - ASCII64 + 1
ret = ColumnNumberToLabel(iCol)
Else
ret = "!OutOfRangeError"
End If

GetNextColumnLabel = ret

End Function




Nick Hebb

Functions to get range properties
 
That works as a cell formula, but I need it in VBA. So if I do
something like:

Application.WorksheetFunction.Min()

Then the Min() function expects as series of arguments [arg1], [arg2],
[arg3], etc. I don't know how to turn COLUMN(C1:F1) into an array or a
series of arguments without a lot of extra code.

Any tips would be great. I hate writing and using code that re-invents
the wheel, and I have a suspicion that I have.



All times are GMT +1. The time now is 12:09 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com