What is the function to get the current line number and the current column name for a cell in Excel?
You can use the
COLUMN functions to do this. If you omit the argument for those formulas, the current cell is used. These can be directly used with the
OFFSET function, or any other function where you can specify both the row and column as numerical values.
For example, if you enter
=ROW() in cell D8, the value returned is 8. If you enter
=COLUMN() in the same cell, the value returned is 4.
If you want the column letter, you can use the
CHAR function. I do not recommend the use of letters to represent the column, as things get tricky when passing into double-letter column names (where just using numbers is more logical anyways).
Regardless, if you should still want to get the column letter, you can simply add 64 to the column number (64 being one character less then
A), so in the previous example, if you set the cell's value to
=CHAR(COLUMN()+64), the value returned would be
D. If you wanted a cell's value to be the cell location itself, the complete formula would be
=CHAR(COLUMN()+64) & ROW().
Just an FYI, I got 64 from an ASCII table. You could also use the
CODE formula, so the updated formula using this would be
=CHAR(COLUMN() + CODE("A") - 1). You have to subtract 1 since the minimum value of
COLUMN is always 1, and then the minimum return value of the entire formula would be
However, this will not work with two-letter columns. In that case, you need the following formula to properly parse two-letter columns:
=IF(COLUMN()>26,IF(RIGHT(CHAR(IF(MOD(COLUMN()-1,26)=0,1,MOD(COLUMN()-1,26))+64),1)="Y",CHAR(INT((COLUMN()-1)/26)+64) & "Z",CHAR(INT((COLUMN()-1)/26)+64) & CHAR(IF(MOD(COLUMN(),26)=0,1,MOD(COLUMN(),26))+64)),CHAR(COLUMN()+64))&ROW()
I'm not sure if there is an easier way to do it or not, but I know that works from cell
ZZ99 with no problems. However, this illustrates why it's best to avoid the use of letter-based column identifiers, and stick with pure number-based formulas (e.g. using the column number instead of letter with
Type this into any cell:
You can replace column() by row number.
To get column name I used the following formulae.
For a particular cell:
=SUBSTITUTE(CELL("address",H3),"$" & ROW(H3),"")
For the current cell:
=SUBSTITUTE(CELL("address"),"$" & ROW(),"")
Try this variation. It works on 3-letter columns, and doesn't leave a "$" on the front end:
Another possible way would be to use something like this:
colid refers to a named range you would create elsewhere within the workbook comprising two adjacent columns with multiple rows: the first column containing the numbers 1 to n corresponding to the
COLUMN() number, the second containing the letters A - ZZ, or however many column references you wish to accommodate. The
ROW() is fine left as it is to return the Row number.
So if you were to copy the above string to cell A1 of 'MySheet2', it would evaluate as
=MySheet1!A1, and return the value it found in the corresponding cell of
This would enable you, for example, to use
MySheet1 as a working area, to delete and re-insert new data, whilst any formatting or calculations in
MySheet2 that refer to those contents will continue to work correctly with the new datasets from the target tabbed worksheet.
Here's a VBA, user defined formula, solution. It works with 1, 2, & 3 letter columns.
Put the following in a code module:
Function COLUMNLETTER(Optional rng As Range) As String 'Returns the Column Letter of the top left cell in rng. If rng Is Nothing Then Set rng = Application.Caller COLUMNLETTER = Left(rng.Address(0, 0), IIf(rng.Column > 26, IIf(rng.Column > 702, 3, 2), 1)) End Function
=COLUMNLETTER() in any cell will return the column letter of the cell.
=COLUMNLETTER(B3) in any cell will return B.
This User Defined Function works great when creating generic formulas inside the INDIRECT function.
The address formula works by returning the column and row name. The returned format will always be
$(Column Letters)$(Row Numbers) - e.g.
If we know that $ will always occur at the first character, we can use the first mid formula to start pulling characters after the first $ sign (i.e. the 2nd character).
Then, we find the next $ sign (as we know there will only be two) and we know how many characters there are between the first and the second dollar sign. The rest is simple subtraction.
The name of the current cell's column is:
ROW([reference]) function returns the row's cardinal number of the referenced cell.
ROW() returns the cardinal number of the row of the current cell.
COLUMN([reference]) function returns the column's cardinal number of the referenced cell.
COLUMN() returns the cardinal number of the column of the current cell.
ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text]) returns the address (column+row) of the given input. If
4, then the function returns a fully relative address (no
[sheet_text] are optional parameters and the default behavior is correct.
ADDRESS(ROW(),COLUMN(),4) is the relative address of the current cell.
Now we just need to remove the row number. Well, we already have a function that returns the row number:
ROW(). And the column name will not interfere with that because it's always letters. So we can use simple string substitution to remove the row number and replace it with an empty value:
You can replace
ROW() with a static value like
1 in the function, but in my experience I often want to get the current address in the same spreadsheet where I want the column name, so I find this one more flexible.