1. 程式人生 > >VBA實現數字列與字母列的相互轉化

VBA實現數字列與字母列的相互轉化

1,方法一:

'列數轉字母
Function CNtoW(ByVal num As Long) As String
    CNtoW = Replace(Cells(1, num).Address(False, False), "1", "")
End Function
'字母轉列數
Function CWtoN(ByVal AB As String) As Long
    CWtoN = Range("a1:" & AB & "1").Cells.Count
End Function

2,方法二:

  1. Function GetColumn(char)
  2.     Dim t
  3.     On Error Resume Next
  4.     If IsNumeric(char) Then
  5.         t = Split(Cells(1, char).Address, "$")(1)
  6.     Else
  7.         t = Columns(char & ":" & char).Column
  8.     End If
  9.     If Err.Number <> 0 Then GetColumn = "超出範圍" Else GetColumn = t
  10. End Function

3,方法三:


不過就功能、目的來說,確實意義不大。

因為既然用到了VBA,就可以後臺使用多種方法處理列數,沒必要再寫一個函式來用。

比如, cells(n,"AB") 或者 Range("AB" & n) 就可以直接定位到指定列標所在列。

或者用 cells(n,28).Address 來獲取列標字母。

如同樓上各位的例子那樣。
而如果需要自己計算把列序號轉換為字母標籤,則可以用下面迭代計算:

假設t為列序號,那麼:

      s = ""
      Do
          s = Chr((t - 1) Mod 26 + 65) & s       '以26除數反複Mod求餘得到對應1-26字母
       t = Int((t - 1) / 26)                         '再用26除後Int取整進行迭代計算
    Loop Until t <= 0                                 '反複算直至數t已不能除26求餘止
+++++++
Function f(t)
    Do
        f = Chr((t - 1) Mod 26 + 65) & f
        t = Int((t - 1) / 26)
    Loop Until t = 0
End Function
+++++++
或者寫成:
+++++++
Function f(t)
    Do
        f = Chr((t - 1) Mod 26 + 65) & f
        t = (t - 1) \ 26
    Loop While t
End Function
+++++++

(本文主要內容歸納自網上文章:EXCEL列標數字與字母的轉換)