熟悉excel操作的使用者都知道在工作表中列標題有列標(字母形式)和列號(數字形式)兩種,如下圖所示。
cells
的第二個引數,即可以使用數字列號,也可以使用列標字母,然而對於range
來說引數為字串,也就是使用列標形式。
cells(6,3)
cells(6,"c")
range("c6")
在**中使用變數的示例。
strcol = "c"
intcol = 3
cells(6, intcol)
cells(6, strcol)
range(strcol & "6")
在vba**靈活選擇單元格的引用形式,將使得**簡潔高效。某些場景中,可能還是需要實現列標和列號的轉換,此時可以使用自定義函式。
列標字母編號由單個字母開始a,b,c,…,z,之後為aa,ab,…,zz,接下來為aaa,aab,…,xfd,可以看作是26進製編碼的表示形式,和其他的進製轉換類似,也是採用除以26取餘數的方式進行計算,此處需要額外多一步的處理是,對於餘數要轉換為字母形式。
列號轉列標的自定義函式**如下。
function num2name1(byval colnum as long) as string
dim i as long
dim intmod as integer
num2name1 = ""
i = colnum
do while i > 0
intmod = iif(i \ 26 = i / 26, 26, i mod 26)
num2name1 = chr$(intmod + 64) + num2name1
i = (i - intmod) / 26
loop
end function
【**解析】
第7行**判斷迴圈變數i
是否可以被26整除,如果可以,那麼intmod
賦值為26,否者賦值為餘數。
第8行**使用chr
函式將1~26的數字轉換為大小字母,並和前面步驟已經得到的結果組合為新的字串。
第9行**獲得下一次迴圈需要處理的數字,如果i<=0
,則終止迴圈。
列標轉列號的方法是上述的逆運算,自定義函式**如下。
function name2num1(byval colname as string) as long
dim i as integer
dim intlen as integer
name2num1 = 0
intlen = len(colname)
if intlen > 0 then
colname = ucase$(colname)
for i = 1 to intlen
name2num1 = name2num1 + (asc(mid(colname, i, 1)) - 64) * 26 ^ (intlen - i)
next i
end if
end function
【**解析】
第5行**獲取列標字串的長度。
第7行**將列標轉換為大寫字母。
第9行**中使用mid
函式逐位讀取列標字元,使用asc
函式轉換為ascii碼,減去64實現了將字母變換為1~26的陣列序列,根據所在位置不同,乘以26 ^ (intlen - i)
轉換為相應的數值進行累加。
使用如下**可以測試兩個自定義函式的結果。
sub demo()
debug.print name2num1("xfd")
debug.print num2name1(16384)
end sub
上述兩個自定義過程利用進製原理轉換實現了列標和列號的轉換,但是在vba中靈活利用物件的屬性可以更簡潔的實現這個功能。
function num2name(byval colnum as long) as string
num2name = ""
on error resume next
num2name = split(cells(1, colnum).address, "$")(1)
end function
【**解析】
第4行**使用cells(1, colnum).address
獲取列號為colnum
的列中第乙個單元格的絕對引用位址(例如:$abc$1
),split
函式使用$
作為分隔符將絕對引用位址拆分具有3個元素的陣列(下標從零開始),第2個元素為列標。
function name2num(byval colname as string) as long
name2num = 0
on error resume next
name2num = cells(1, colname).column
end function
【**解析】
第4行**使用使用單元格的column
返回列號。
Excel裡數字列號轉換為字元標籤列
在進行資料庫匯出到excel時,常會用到將列,如 第1列轉換為 a,第2列轉換為 b 的情況。這時你就要寫演算法了。哈哈,我這裡有現成的了。先上 後解析。function celltoref const x,y integer string function getref const x integ...
PHP序號轉Excel列號A IV
在轉出excel的時候需要把序號轉換為excel的列值,a,aa ab等,一直到iv,為什麼到iv呢?因為iv的序號是256是2的10次方。function getexcelcolumn index if a1 0 s chr 64 yu return s echo index s 記得不要超過25...
Golang 數字轉換為Excel列A Z
具體需求為匯出excel時,資料只能行數與列數只能為數字,因此在修改制定單元格時無法直觀的定位,要麼修改固定的單元格,要麼就只能通過特殊標識來循壞獲取單元格之後進行修改。或者通過excel工具包中的addrow或者addcell來插入資料。通過以下兩種方法 遞迴和for迴圈 可以做到以下格式的轉換 ...