2013-07-23 41 views
3

我已通過此網站搜索並搜索了一個公式。我需要計算一個Excel列號從信如:如何從Excel列信中獲取列號(或索引)

A=1 
B=2 
.. 
AA=27 
AZ=52 
... 
AAA=703

代碼似乎是1位過字母表中的隨機的週期後(AZ - > BA ==關閉位)。它也將看似隨機從兩個不同的輸入產生相同的整數:

GetColumnNumber(xlLetter : Text) : Integer //Start of function 

StringLength := STRLEN(xlLetter); 
FOR i := 1 TO StringLength DO BEGIN 
Letter := xlLetter[i]; 
    IF i>1 THEN 
    Count += ((xlLetter[i-1]-64) * (i-1) * 26) - 1; 
    Count += (Letter - 64); 
END; 
EXIT(Count); //return value 

我的代碼示例是用C/AL其用於動態導航,但我可以寫C#或vb.net以及因此我如果一個例子是用這兩種語言中的任何一種都不介意的話。

+0

對不起,這是我的錯誤,當我打字的時候,我只是在做我的腦袋裏的數學。我得到的結果,當我對一個完整的字母系列運行此功能 - 我得到AZ下一個字母是一個數字了,所以如果AZ = 52那麼BA = 54 – kevindstanley

回答

3

在VBA:

Public Function GetCol(c As String) As Long 
    Dim i As Long, t As Long 
    c = UCase(c) 
    For i = Len(c) To 1 Step -1 
     t = t + ((Asc(Mid(c, i, 1)) - 64) * (26^(Len(c) - i))) 
    Next i 
    GetCol = t 
End Function 
+0

我重寫它爲我的語言(C/AL),但是這個概念完美地工作 – kevindstanley

+0

GetColumnNumbers(c:Text):Integer For i:= STRLEN(c)DownTo 1 DO BEGIN t:= t +(c [i] -64)*(POWER(26,STRLEN C)-i)); END; EXIT(t); – kevindstanley

3

在VBA:

Function ColLetter(C As Integer) As String 
    If C < 27 Then 
    ColLetter = Chr(64 + C) 
    Else 
    ColLetter = ColLetter((C - 1) \ 26) & ColLetter((C - 1) Mod 26 + 1) 
    End If 
End Function 
0

在VBA:(遞歸函數)

Function Get_Col_Number(strColName As String, dRunningNo As Integer) As Double 
     Dim dCurrentColNo As Double 
     Dim dMultipleValue As Double 

     strColName = Ucase(strColName) 

     If (dRunningNo <= 0) Then Get_Col_Number = 0: Exit Function 

     dCurrentColNo = ((Asc(Mid(strColName, dRunningNo, 1)) - Asc("A") + 1)) 
     dMultipleValue = 26^(Len(strColName) - dRunningNo) 

     Get_Col_Number = (dCurrentColNo * dMultipleValue) + Get_Col_Number(strColName, (dRunningNo - 1)) 
    End Function 

使用如下此功能。

Sub Main() 
    Dim StrGetNoForThisColumnName As String 
    StrGetNoForThisColumnName = "Xfd" 

    Msgbox "Final Result : " & Get_Col_Number(StrGetNoForThisColumnName, Len(StrGetNoForThisColumnName)) 
End Sub