c++ - VBA将Excel样式列名称(具有52个字符集)转换为原始数字

标签 c++ vba excel

我有一个 C++ 程序,它接受一个整数并将其转换为小写和大写字母,类似于 excel 将列索引转换为列号的做法,但也包括小写字母。

#include <string>
#include <iostream>
#include <climits>
using namespace std;
string ConvertNum(unsigned long v)
{
    char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    size_t const base = sizeof(digits) - 1;
    char result[sizeof(unsigned long)*CHAR_BIT + 1];
    char* current = result + sizeof(result);
    *--current = '\0';

    while (v != 0) {
        v--;
        *--current = digits[v % base];
        v /= base;
    }
    return current;
}

// for testing


int main()
{
    cout<< ConvertNum(705);

    return 0;
}

我需要 vba 函数将其反转回原始数字。我对 C++ 没有太多经验,所以我无法找出在 vba 中反转这个的逻辑。任何人都可以帮忙吗?

更新1:我不需要已经编写的代码,只需要一些逻辑上的帮助来反转它。我会尝试自己将逻辑转换为代码。

更新2:根据答案中提供的精彩解释和帮助,很明显代码没有将数字转换为通常的base52,这是误导性的。因此,我更改了函数名称,以消除 future 读者的困惑。

最佳答案

编辑:由下面描述的代码转换为十进制的字符串格式不是标准的 base-52 架构。该架构不包含 0 或任何其他数字。因此,不应按原样使用此代码将标准的 base-52 值转换为十进制。


好的。这是基于根据长字符串中的位置转换单个字符。该字符串是:

chSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

InStr() 函数告诉我们 A 位于位置 1Z 位于位置26 并且a 位于27 位置。所有字符都以相同的方式转换。

我使用这个而不是 Asc() 因为 Asc() 大小写字母之间有一个间隙。

最低有效字符的值乘以 52^0
下一个字符的值乘以 52^1
第三个字符的值乘以 52^3,依此类推。代码:

Public Function deccimal(s As String) As Long
    Dim chSET As String, arr(1 To 52) As String
    Dim L As Long, i As Long, K As Long, CH As String

    chSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    deccimal = 0
    L = Len(s)
    K = 0
    For i = L To 1 Step -1
        CH = Mid(s, i, 1)
        deccimal = deccimal + InStr(1, chSET, CH) * (52 ^ K)
        K = K + 1
    Next i
End Function

一些例子:

enter image description here


注意:

这不是碱基通常的编码方式。通常碱基以 0 开头,并允许在任何编码值的位置上出现 0。在我之前的所有与此类似的 UDF() 中,chSET 中的第一个字符是 0,我必须使用 (InStr(1, chSET, CH) - 1) * (52 ^ K)

关于c++ - VBA将Excel样式列名称(具有52个字符集)转换为原始数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013618/

相关文章:

vba - 如何将 COM 公开的 .NET 项目添加到 VB6(或 VBA)引用对话框?

c++ - 如果键不存在于 std::map 中,如何有效地从 std::unordered_set 中删除该键?

c# - 将 C++(处理 Corona)函数转换为 C#

c++ - 我的课本说数组是用 const 变量设置的。使用非 const 变量时会遇到哪些问题?

vba - Excel VBA 条件过滤器

excel - 将 xlsm 保存为 xlsx 后,为什么打开新文件会关闭旧文件?

c++ - 是否可以迭代不是 'built in' 的对象的 FbxProperties

excel - 当另一列具有 "Yes"时从列中删除文本

excel - VBA ActiveX 控件的大小随着远程桌面连接的增加而增大

excel - VB Excel 忽略范围内的空单元格