在VBA中标记一组对象(A-> Z,AA-> ZZ,AAA-> ZZZ)

时间:2018-04-06 17:01:57

标签: vba map-basic

我有一个具有未知数目对象的集合。我想将标签与这些对象中的每一个相关联。我没有用数字标记每个对象,而是用字母标记它们。

例如,第一个对象将标记为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”之后还有另一个对象,则会失败。

如何克服这种静态解决方案?

3 个答案:

答案 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之间的数字,它会在16384A之间返回一个字符串。

编辑:

我想我误读了;您使用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