Пометьте набор объектов с помощью (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
Другие вопросы по тегам