學以致用——VBA實現十進位制數字轉換為字母(二十六進位制)(Convert a number to letters (Excel Column number to name) with VBA)
阿新 • • 發佈:2018-12-30
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