gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:57:40 25 4
gpt4 key购买 nike

我有一个 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 在位置 1 并且 Z 在位置26a 的位置是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com