1. 程式人生 > >學以致用——VBA實現十進位制數字轉換為字母(二十六進位制)(Convert a number to letters (Excel Column number to name) with VBA)

學以致用——VBA實現十進位制數字轉換為字母(二十六進位制)(Convert a number to letters (Excel Column number to name) with VBA)

Excel列標與列名轉換問題,本質上是一個十進位制數和二十六進位制數的轉換問題。記得以前學C、C#、JAVA等程式語言時,已經做過一些相關練習了。但是,老實說,在用公式法解決這個十進位制轉二十六進位制的問題時還真是難到我了,花了好幾個小時也沒有解決。

於是,求助網路,在一篇文章的啟發下,先實現了VBA程式設計方式來解決問題。

在此總結一下經驗:

1. 程式設計方式的思路更為清晰一些(很容易識別程式邏輯,如核心演算法)

2. 除錯起來方便很多。Excel自帶函式法嚴格來講不算除錯,只是不斷的試錯而已。而VBE中可通過DEBUG.PRINT語句輸出中間變數及計算過程,對理清思路非常有用

3. 多看看別人的程式碼可以少走很多彎路

程式碼分享:

Sub GetExcelColumnName(ByVal ExcelColumnName As String, ByVal columnNumber As Long)

    Dim dividend As Long
    Dim columnName As String
    Dim modulo As Integer
    Dim n As Integer '迴圈次數
    
    dividend = columnNumber
    Debug.Print "Input: ColumnNumber = " & columnNumber
    Debug.Print "Calculation process:" & vbNewLine

    While (dividend > 0)
        n = n + 1
        modulo = (dividend - 1) Mod 26
        Debug.Print "Iteration No." & n
        Debug.Print "dividend = " & dividend & ", modulo = (dividend - 1) Mod 26 = " & modulo
        columnName = Chr(65 + modulo) + columnName
        dividend = Round((dividend - modulo) / 26, 0)
        Debug.Print "columnName = " & columnName & ", dividend = Round((dividend - modulo) / 26, 0) = " & dividend & vbNewLine
    Wend
    ExcelColumnName = columnName
    Debug.Print "Result: ColumnNumber = " & columnNumber & " <--> ColumnName = " & columnName & vbNewLine & vbNewLine
   
End Sub

測試程式碼:

Sub GetExcelColumnNameTest()
Dim result As String
    'For i = 676 To 678
        GetExcelColumnName result, 2147483647
       
    'Next
End Sub

測試結果:

Input: ColumnNumber = 2147483647
Calculation process:

Iteration No.1
dividend = 2147483647, modulo = (dividend - 1) Mod 26 = 22
columnName = W, dividend = Round((dividend - modulo) / 26, 0) = 82595524

Iteration No.2
dividend = 82595524, modulo = (dividend - 1) Mod 26 = 23
columnName = XW, dividend = Round((dividend - modulo) / 26, 0) = 3176750

Iteration No.3
dividend = 3176750, modulo = (dividend - 1) Mod 26 = 17
columnName = RXW, dividend = Round((dividend - modulo) / 26, 0) = 122182

Iteration No.4
dividend = 122182, modulo = (dividend - 1) Mod 26 = 7
columnName = HRXW, dividend = Round((dividend - modulo) / 26, 0) = 4699

Iteration No.5
dividend = 4699, modulo = (dividend - 1) Mod 26 = 18
columnName = SHRXW, dividend = Round((dividend - modulo) / 26, 0) = 180

Iteration No.6
dividend = 180, modulo = (dividend - 1) Mod 26 = 23
columnName = XSHRXW, dividend = Round((dividend - modulo) / 26, 0) = 6

Iteration No.7
dividend = 6, modulo = (dividend - 1) Mod 26 = 5
columnName = FXSHRXW, dividend = Round((dividend - modulo) / 26, 0) = 0

Result: ColumnNumber = 2147483647 <--> ColumnName = FXSHRXW

參考文章:

https://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa