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

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

利用空閒時間,開發了一個十進位制轉換為字母(相當於26進位制)的函式。功能有:

1. 給定Excel列標,返回對應的列名(如,第677列對應的列名為“ZA”)(但是,Excel中的列最多為16384列,對應的列名為XFD)

2. 給定任意正長整形數值(即,1到2147483647),可返回對應的字母

3. 可通過VBE immediate視窗檢視計算過程(debug print)

程式碼:

Function GetExcelColumnNameF(columnNumber As Integer)

    Dim dividend As Integer
    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
    GetExcelColumnNameF = columnName
    Debug.Print "Result: ColumnNumber = " & columnNumber & " <--> ColumnName = " & columnName & vbNewLine & vbNewLine
   
End Function

除錯輸出(Log):

Input: ColumnNumber = 16382
Calculation process:

Iteration No.1
dividend = 16382, modulo = (dividend - 1) Mod 26 = 1
columnName = B, dividend = Round((dividend - modulo) / 26, 0) = 630

Iteration No.2
dividend = 630, modulo = (dividend - 1) Mod 26 = 5
columnName = FB, dividend = Round((dividend - modulo) / 26, 0) = 24

Iteration No.3
dividend = 24, modulo = (dividend - 1) Mod 26 = 23
columnName = XFB, dividend = Round((dividend - modulo) / 26, 0) = 0

Result: ColumnNumber = 16382 <--> ColumnName = XFB

效果圖:



參考文章:

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

相關推薦

學以致用——使用VBA函式十進位制數字轉換字母Convert a number to letters (Excel Column number to name)

利用空閒時間,開發了一個十進位制轉換為字母(相當於26進位制)的函式。功能有:1. 給定Excel列標,返回對應的列名(如,第677列對應的列名為“ZA”)(但是,Excel中的列最多為16384列,對應的列名為XFD)2. 給定任意正長整形數值(即,1到2147483647

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

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

數字轉換leetcode簡單篇四百零五題

給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。 注意: 十六進位制中所有字母(a-f)都必須是小寫。 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元’0’來表示;對於其他情況,十六進位制字串中

相關計算機儲存負數、與十進位制轉換

負數的十六進位制表示 剛開始沒多思考,不知道如何表示負數。 原碼  反碼   補碼  在計算機中,資料是以補碼的形式儲存的。 正數的原碼,補碼,反碼都相同,都等於它本身 負數的補碼是:符號位為1,其餘各位求反,末位加1 反碼是:符號位為

十進位制轉化二進位制與顯示彙編程式

stacks segment stack dw 200h dup(0);不太明白要200h這麼大 stacks ends data segment in_buf db 6;定義輸入字串最大長度 in_len db ?;輸入字串實際長度 dec_buf db 6 dup(3

劍指offer----輸入用字母表示的列號編碼,核心內容:十進位制

題目: 用A表示第一列,用B表示第二列。。。。用Z表示第26列,用AA表示第27列。。。請寫出一個函式,輸入用字母表示的列號編碼,輸出它是第幾列。 思路: 此問題最精彩之處,核心---二十六進位制變十進位制 function calColumn(){ // va

android byte位元組陣列轉換字串物聯網開發總結

想起前段時間的物聯網的外包開發,經常遇到通過wifi接受的資料,要通過轉換成十六進位制字串,或者最後又是十進位制資料。都是根據雙方的協議來開發的。那麼我傳送過去的資料也需要,經過特殊轉換成byte位元組發過去,硬體那邊收到不至於亂碼的資料。 1、硬體除錯發給android這

面試題:輸入一個十進位制整數,這個數字轉化成對應的中,A表示10,B表示11,C表示12,D表示13, E表示14,請寫入轉換程式。例如:235表示10A;

如上是本人一位朋友的公司出的研發小測試,小朋友是一臉懵逼啊! 分析:進位制轉換思路:10進位制除以15商和餘數,反覆拿商除以15獲得商和餘數,類推,知道商為0,停止; 以235表示為10A為例分析: 235/15 = 15 餘數10 15/15 = 1 餘數

十進位制轉換二進位制、八

將十進位制轉換為其它進位制時比較複雜,整數部分和小數部分的演算法不一樣。 1) 整數部分 十進位制整數轉換為 N 進位制整數採用“除 N 取餘,逆序排列”法。具體做法是: 將 N 作為除數,用十進位制整數除以 N,可以得到一個商和餘數; 保留餘數,用商繼續除以 N,又得到一個新的商和餘數;

一個轉換二進位制字元陣列的函式

十六進位制數轉換為二進位制陣列的函式HexToBinStr 函式實現: void HexToBinStr(int hex, char *bin_str, int str_size) { int i; for (i = 0; i !=str_size; ++i) { b

一個字串轉換十進位制數值的問題

在程式中,我們有時需要將一個十六進位制字串轉換為十進位制數字。比如: char *ptr="0x11"; int n=0; //我們想讓n等於0x11,即17 通常我們在C中,想將一個字串轉換為一整形

C語言字串轉換成對應的數字(十進位制)

問題1:講一個十進位制數字的字串表示轉換成對應的整數。舉例:將“1234”轉換成整數1234./*將字串s轉換成相應的整數*/ int atoi(char s[]) { int i = 0; int n = 0; for (i =

字串轉換十進位制數字

Write a function that parses a hex number as a string into a decimal integer. The function header is as follows: int parseHex(co

用遞迴函式實現十進位制轉換輸出

   遞迴函式的定義,不應出現無終止的遞迴呼叫。而應定義為有限次數、有終止的遞迴呼叫函式。       對於一個問題,只要能夠知道遞迴定義式,及邊界條件(即遞迴終止的條件),就可以編寫一個遞迴函式。 #include <stdio.h> #define BASE

405.數字轉換

給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。 注意: 十六進位制中所有字母(a-f)都必須是小寫。 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元'0'來表示;對於其他情況,十六進

編寫一個函式實現數轉換。在主函式中輸人一個十進位制數,輸出相應的數。要求用陣列實現

void decto16 (int a, char c[]) {  // a為要轉換的十進位制數 將結果存放在陣列c中 ,以陣列形式輸出   int y;   int k = 0;   do {     y = a % 16;     a = a / 16;     for (int i = 0

【LeetCode 簡單題】90-數字轉換

宣告: 今天是第90道題。給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:給定

領釦LeetCode數字轉換數 個人題解

給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。 注意: 十六進位制中所有字母(a-f)都必須是小寫。 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元'0'來表示;對於其他情況,十六進位制字串中的第一

bx中的二進位制數轉換輸出

binihex proc near mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl printit add al,7h printit: mov dl,al mov ah

轉換十進位制

#include<stdio.h> #define MAX 100 int main() { int trans(char *s); int c,i=0; char t[MAX]; printf("請輸入一個十六進位制的數:"); while((c=getchar()) !=