Пользовательская функция VBA для преобразования в Base62

Я пытаюсь создать функцию в VBA, которая будет кодировать число в base62. Если закодированная строка base62 содержит менее 6 символов, функции дополняют начало строки нулями.

Function Base62Encode(ByVal num As Variant) As String
    Dim base62_chars As String
    base62_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    Dim base62 As String
    base62 = ""
    
    ' Encode using base62 conversion
    Do While num > 0
        base62 = Mid(base62_chars, (num Mod 62) + 1, 1) & base62
        num = Int(num / 62)
    Loop
    
    ' Pad with leading zeros to ensure 6-character length
    Base62Encode = String(6 - Len(base62), "0") & base62
End Function

Функция прекрасно работает для всех целых чисел, которые я передаю в функцию, пока не превышу 2 147 483 647 — тогда я получаю ошибку. Я определенно новичок в vba, но похоже, что ошибка как-то связана с ограничением диапазона целочисленных типов данных Long, но я не уверен, как обойти эту проблему.

Я также пытался преобразовать значения во всей функции в десятичный тип данных, но все равно получаю сообщение об ошибке (которое отображается как ошибка #ЗНАЧ! в Excel).

Заранее спасибо!

Попробуйте =Base62Encode(2147483647) (уберите запятые в аргументе). Я получил 2LKcb1 в M365.

taller 20.06.2024 01:09

Это работает, но только потому, что 2147483647 — это верхний предел диапазона, который у меня работает. Та же функция, использующая вместо этого 214748364_8_, не работает (я добавил запятые в текст своего вопроса только в качестве наглядного пособия). Спасибо хоть!

Chon 20.06.2024 01:16

@taller - Я думаю, что ОП использует это, чтобы выделить цифру в ваших интересах.

Enigmativity 20.06.2024 01:24

Да, мои извинения за это. Я думал, что могу выделить курсивом измененную цифру, но он не принял мою попытку использовать форматирование в комментариях (т. е. просто игнорируйте подчеркивания).

Chon 20.06.2024 01:26

Если у вас 64-разрядная версия Excel, вы можете использовать тип данных LongLong с ограничением 9,223,372,036,854,775,807.

Ron Rosenfeld 20.06.2024 01:30

@RonRosenfeld - Можете ли вы придумать ответ на эту тему? Кажется, я не могу.

Enigmativity 20.06.2024 01:34

@Chon - Как только вы переходите от 2147483647 к 2147483648, VBA меняет тип Variant с Long на Double.

Enigmativity 20.06.2024 01:35

@Enigmativity Вам необходимо использовать эквивалентную функцию Int, поскольку функция Mod имеет некоторые ограничения при работе с большими числами.

Ron Rosenfeld 20.06.2024 01:48

Если необходимый вам диапазон превышает тот, который вы можете вычислить в VBA, я предлагаю вам поискать в Интернете надстройку XNumbers. Он работает на моей 64-битной версии 365 и должен работать и на более ранних версиях. Он может вычислить до 32760 значащих цифр.

Ron Rosenfeld 20.06.2024 02:27

@Enigmativity На самом деле, проблема в функции заключается в ограничении функции MOD, а не в типе данных, как вы можете видеть в решении Таллера.

Ron Rosenfeld 20.06.2024 02:28
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
10
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Согласно документации MS, оба аргумента должны быть «любым числовым выражением». В нем явно не указано, поддерживается ли большое количество (например, LongLong).

Документация Майкрософт:

Оператор мода

  • Кажется, это ограничение оператора Mod. Пожалуйста, попробуйте использовать экспресс-функцию Int в качестве замены. (Спасибо за комментарий @Gserg)
Function Base62Encode(ByVal num As Variant) As String
    Dim base62_chars As String
    base62_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    Dim base62 As String
    base62 = ""
    ' Encode using base62 conversion
    Do While num > 0
'        base62 = Mid(base62_chars, (num Mod 62) + 1, 1) & base62
        base62 = Mid(base62_chars, (num - Int(num / 62) * 62) + 1, 1) & base62
        num = Int(num / 62)
    Loop
    ' Pad with leading zeros to ensure 6-character length
    Base62Encode = String(6 - Len(base62), "0") & base62
End Function
Sub Test()
    Dim i As Double
    For i = 2147483647 To 2147483650#
        Debug.Print i, Base62Encode(i)
    Next
End Sub

Выход:

 2147483647   2LKcb1
 2147483648   2LKcb2
 2147483649   2LKcb3
 2147483650   2LKcb4
Split(num1 / num2, ".")(0) - почему? Вы буквально скопировали Int(num / 62) несколько строк ранее, могли бы вы хотя бы использовать это, даже если бы вы не знали об операторе целочисленного деления, \? Помимо того, что это ужасный и неуместный вызов строк, он даже не будет работать в локалях, которые используют , в качестве десятичной запятой.
GSerg 20.06.2024 01:52

@Gserg Округляет результат num1 / num2. Ты прав. Int- правильный выбор. Спасибо

taller 20.06.2024 01:57

Кажется, оператор \ имеет то же ограничение, что и Mod. С большими числами это не работает. например. ?2147483648 \ 62

taller 20.06.2024 02:09

Другие вопросы по теме

Похожие вопросы

Как добавить минимальное/максимальное значение в условное форматирование с помощью xlsxwriter для Python?
Как я могу создать трехмерную гистограмму и построить ее в Excel, используя данные, где отрицательные значения на графике также будут окрашены?
Поставщик ACE OLEDB в vbscript в приложении HTML (hta) для чтения Excel говорит, что поставщик не установлен, vbs работает, но hta не работает
Как отфильтровать массив с помощью другого массива в Excel?
Как получить уникальные столбцы в строке, сделать формулу «РАЗЛИВ» и работать и для других строк?
Прекратить выполнение цикла при обнаружении первой пустой ячейки
Как скопировать стиль и форматирование из шаблонной диаграммы в новую диаграмму?
Excel: Как извлечь определенное слово из списка слов из диапазона ячеек?
Сохранить файл в папку на основе значений ячеек
Как вызвать функцию из другой книги, открытой в другом приложении Excel