excel 列名称由数字转成字母格式,如何编程实现?
For example:
1 -> A
2 -> B
3 -> C
…
26->Z
27->AA
28->AB
…
52-> AZ
53 -> BA
【数字转成字母】
方法①
思路:先用数组对象,下标1-26对应存储字符A-Z,.然后把excel列数字 看成二十六进制的数
二十六进制,11表示27,12表示28.然后从数组对象里查询到:1对应的是A,.2对应的是B.这样11改成AA,12改成AB。
测试反例:
52 的26进制应该是 20
而excel中52列是AZ,与二十六进制结果不对应。尽管A*26^1+Z*26^0 与2*26^1+0*26^0是相等的。
;正确方法如下
getColName(i)
{
arr:=[]
j:=1
while(i>0)
{
arr[j]:=Mod(i-1,26)
i:=(i-arr[j])//26
j:=j+1
}
alpha:="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
cha_arr:=StrSplit(alpha,"")
for k,v in arr
s:=cha_arr[v+1] . s ;数组从1开始
Return s
}
;再简化下
ColumnLetter(ColumnNumber)
{
n := ColumnNumber
While (n > 0)
{
c:=Mod((n-1),26)
s:= Chr(c + 65) . s
n:= (n-c) // 26
}
return s
}
ColumnNumberToLetter(iCol)
{
If (iCol <= 26)
{
ColumnNumberToLetter := Chr(iCol + 64)
}Else{
lRemainder :=Mod( iCol,26)
lAlpha := floor(iCol / 26)
If (lRemainder = 0 )
{
lRemainder := 26
lAlpha := lAlpha - 1
}
ColumnNumberToLetter := ColumnNumberToLetter(lAlpha) . Chr(lRemainder + 64)
}
return ColumnNumberToLetter
}
vba版本:
Function ColumnLetter(ColumnNumber As Long) As String
Dim n As Long
Dim c As Byte
Dim s As String
n = ColumnNumber
Do
c = ((n - 1) Mod 26)
s = Chr(c + 65) & s
n = (n - c) \ 26
Loop While n > 0
ColumnLetter = s
End Function
方法②
用excel内置函数也可以实现
Col_Letter(lngCol)
{
oExcel := ComObjActive("Excel.Application")
vArr:=[]
vArr:= StrSplit(oExcel.Cells(1, lngCol).Address(True, False), "$")
objRelease(oExcel)
return % vArr[1]
}
vba版本:
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
测试用例:
MsgBox % Col_Letter(52) ;AZ
MsgBox % Col_Letter(53) ;BA
MsgBox % Col_Letter(702) ;ZZ
MsgBox % Col_Letter(703) ;AAA
【字母转成数】给定一个Excel表的列名,返回相应列的数字,很容易:
getColNum(InputVar)
{
StringUpper, OutputVar, InputVar
arr:=StrSplit(OutputVar,"")
result:=0
for k,v in arr
{
result := result * 26 + asc(v)-64
}
return result
}
参考:
http://blog.csdn.net/ajiangfan/article/details/52637389
https://stackoverflow.com/questions/12796973/function-to-convert-column-number-to-letter