Пометьте набор объектов с помощью (A->Z,AA->ZZ, AAA->ZZZ) в VBA.
У меня есть набор с неизвестным количеством объектов. Я хочу связать метку с каждым из этих объектов. Вместо того, чтобы маркировать каждый объект числом, я хочу маркировать их буквами.
Например, первый объект будет помечен буквой A, а второй - B и т. Д.
Когда я доберусь до Z, следующий объект будет помечен как AA
AZ? затем БА, ББ, БК.
ZZ? затем AAA, AAB, AAC и так далее.
Я работаю с использованием Mapbasic (по аналогии с VBA), но я не могу обернуться вокруг динамического решения. Мое решение предполагает, что будет максимальное количество объектов, которое набор может или не может превышать.
label = pos1 & pos2
Как только pos2 достигнет ASCII "Z", тогда pos1 будет "A", а pos2 будет "A". Однако, если после ZZ есть другой объект, это не удастся.
Как мне преодолеть это статическое решение?
3 ответа
По сути, мне нужен был счетчик Base 26. Функция принимает параметр типа "A" или "AAA" и определяет следующую букву в последовательности.
Function IncrementAlpha(ByVal alpha As String) As String
Dim N As Integer
Dim num As Integer
Dim str As String
Do While Len(alpha)
num = num * 26 + (Asc(alpha) - Asc("A") + 1)
alpha = Mid$(alpha, 2,1)
Loop
N = num + 1
Do While N > 0
str = Chr$(Asc("A") + (N - 1) Mod 26) & str
N = (N - 1) \ 26
Loop
IncrementAlpha = str
End Function
Если нам нужно преобразовать числа в "буквенный формат", где:
1 = A
26 = Z
27 = AA
702 = ZZ
703 = AAA etc
... и это должно быть в Excel VBA, тогда нам повезло. Столбцы Excel нумеруются одинаково!
Function numToLetters(num As Integer) As String
numToLetters = Split(Cells(1, num).Address(, 0), "$")(0)
End Function
Передайте эту функцию число между 1
а также 16384
и он вернет строку между A
а также XFD
,
Редактировать:
Я думаю, что я неправильно прочитал; вы не используете Excel. Если вы используете VBA, вы все равно сможете сделать это с помощью ссылки на библиотеку объектов Excel.
Это должно привести вас в порядок с точки зрения логики. Не проверили это полностью, но вы должны быть в состоянии работать отсюда.
Public Function GenerateLabel(ByVal Number As Long) As String
Const TOKENS As String = "ZABCDEFGHIJKLMNOPQRSTUVWXY"
Dim i As Long
Dim j As Long
Dim Prev As String
j = 1
Prev = ""
Do While Number > 0
i = (Number Mod 26) + 1
GenerateLabel = Prev & Mid(TOKENS, i, 1)
Number = Number - 26
If j > 0 Then Prev = Mid(TOKENS, j + 1, 1)
j = j + Abs(Number Mod 26 = 0)
Loop
End Function