我有一个具有未知数目对象的集合。我想将标签与这些对象中的每一个相关联。我没有用数字标记每个对象,而是用字母标记它们。
例如,第一个对象将标记为A,第二个标记为B,依此类推。
当我到达Z时,下一个对象将被标记为AA
AZ?然后BA,BB,BC。
ZZ?然后是AAA,AAB,AAC等。
我正在使用Mapbasic(类似于VBA),但我似乎无法围绕动态解决方案。我的解决方案假设该集合可能会或可能不会超过最大数量的对象。
label = pos1 & pos2
一旦pos2达到ASCII“Z”,则pos1将为“A”,pos2将为“A”。但是,如果在“ZZ”之后还有另一个对象,则会失败。
如何克服这种静态解决方案?
答案 0 :(得分:2)
基本上我需要的是Base 26 Counter。该函数采用“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 :(得分:1)
如果我们需要将数字转换为"字母格式"其中:
physician
...它需要在Excel VBA中,然后我们很幸运。 Excel的列是"编号"同样的方式!
1 = A
26 = Z
27 = AA
702 = ZZ
703 = AAA etc
将此函数传递给Function numToLetters(num As Integer) As String
numToLetters = Split(Cells(1, num).Address(, 0), "$")(0)
End Function
和1
之间的数字,它会在16384
和A
之间返回一个字符串。
我想我误读了;您使用Excel 不。如果您正在使用VBA,您仍然可以通过引用Excel对象库来实现此目的。
答案 2 :(得分:1)
这应该让你了解逻辑。 Haven没有完全测试过,但你应该可以在这里工作。
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