Я пытаюсь создать функцию в 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).
Заранее спасибо!
Это работает, но только потому, что 2147483647 — это верхний предел диапазона, который у меня работает. Та же функция, использующая вместо этого 214748364_8_, не работает (я добавил запятые в текст своего вопроса только в качестве наглядного пособия). Спасибо хоть!
@taller - Я думаю, что ОП использует это, чтобы выделить цифру в ваших интересах.
Да, мои извинения за это. Я думал, что могу выделить курсивом измененную цифру, но он не принял мою попытку использовать форматирование в комментариях (т. е. просто игнорируйте подчеркивания).
Если у вас 64-разрядная версия Excel, вы можете использовать тип данных LongLong с ограничением 9,223,372,036,854,775,807.
@RonRosenfeld - Можете ли вы придумать ответ на эту тему? Кажется, я не могу.
@Chon - Как только вы переходите от 2147483647 к 2147483648, VBA меняет тип Variant с Long на Double.
@Enigmativity Вам необходимо использовать эквивалентную функцию Int, поскольку функция Mod имеет некоторые ограничения при работе с большими числами.
Если необходимый вам диапазон превышает тот, который вы можете вычислить в VBA, я предлагаю вам поискать в Интернете надстройку XNumbers. Он работает на моей 64-битной версии 365 и должен работать и на более ранних версиях. Он может вычислить до 32760 значащих цифр.
@Enigmativity На самом деле, проблема в функции заключается в ограничении функции MOD, а не в типе данных, как вы можете видеть в решении Таллера.


Документация Майкрософт:
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 Округляет результат num1 / num2. Ты прав. Int- правильный выбор. Спасибо
Кажется, оператор \ имеет то же ограничение, что и Mod. С большими числами это не работает. например. ?2147483648 \ 62
Попробуйте
=Base62Encode(2147483647)(уберите запятые в аргументе). Я получил2LKcb1в M365.