在VBA中使用(a->;Z、AA->;ZZ、AAA->;ZZZ)标记一组对象
我有一个集合,它有未知数量的对象。我想将标签与这些对象中的每一个相关联。我想用字母来标记它们,而不是用数字来标记每个对象 例如,第一个对象将标记为A,第二个对象将标记为B,依此类推 当我到达Z时,下一个对象将被标记为AA 阿兹?然后是BA,BB,BC ZZ?然后是AAA、AAB、AAC等等 我正在使用Mapbasic(类似于VBA),但我似乎无法理解动态解决方案。我的解决方案假设集合可能超过或不超过最大对象数在VBA中使用(a->;Z、AA->;ZZ、AAA->;ZZZ)标记一组对象,vba,map-basic,Vba,Map Basic,我有一个集合,它有未知数量的对象。我想将标签与这些对象中的每一个相关联。我想用字母来标记它们,而不是用数字来标记每个对象 例如,第一个对象将标记为A,第二个对象将标记为B,依此类推 当我到达Z时,下一个对象将被标记为AA 阿兹?然后是BA,BB,BC ZZ?然后是AAA、AAB、AAC等等 我正在使用Mapbasic(类似于VBA),但我似乎无法理解动态解决方案。我的解决方案假设集合可能超过或不超过最大对象数 label = pos1 & pos2 一旦pos2达到ASCII“Z”,则
label = pos1 & pos2
一旦pos2达到ASCII“Z”,则pos1将为“A”,pos2将为“A”。但是,如果在“ZZ”之后有另一个对象,则该操作将失败
如何克服这种静态解决方案?如果我们需要将数字转换为“字母格式”,其中: …它需要在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对象库来完成此操作。如果我们需要将数字转换为“字母格式”,其中: …它需要在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对象库来完成此操作。基本上我需要的是一个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
基本上我需要的是一个基本的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
这应该会让你们在逻辑上继续前进。还没有完全测试过,但你应该可以从这里开始工作
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
这应该会让你们在逻辑上继续前进。还没有完全测试过,但你应该可以从这里开始工作
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
通常,如果在工作表中,人们使用这些列来帮助生成字母(这可以让您在以后的Excel版本中访问XFD)@QHarr不幸的是,我没有使用Excel。我需要一个编程解决方案。你在用什么应用程序编程?@QHarr它是vba语言,但是另一个IDE(mapbasic)。我真的不需要代码,我只需要逻辑方面的帮助。可能的重复通常是,如果在工作表中,人们使用列来帮助生成字母(在以后的Excel版本中可以将您带到XFD)@QHarr不幸的是,我没有使用Excel。我需要一个编程解决方案。你在用什么应用程序编程?@QHarr它是vba语言,但是另一个IDE(mapbasic)。我真的不需要代码,我只是需要逻辑方面的帮助。可能是重复的谢谢你,但不幸的是它不是Excel VBA我正在使用。它是MapBasic VBA:(参见我的编辑,我现在没有时间检查详细信息,但只要机器上安装了Excel,仍然有一种使用Excel对象的方法,与从Word调用Excel的方法相同。还有一种方法可以从数学上实现,与从类似
chmod
的值计算相同,您可以反向工作:检查它是否为nu记住,3位(>703)使用除法和mod
计算出第3个字母,从总数中扣除该代码,然后加到第2个字母(27到702)上。如果写得正确,整个循环应该是谢谢,但我找到了一个解决方案,我将很快发布:)谢谢,但不幸的是,我使用的不是Excel VBA。它是MapBasic VBA:(参见我的编辑,我现在没有时间检查详细信息,但只要机器上安装了Excel,仍然有一种使用Excel对象的方法,与从Word调用Excel的方法相同。还有一种方法可以从数学上实现,与从类似chmod
的值计算相同,您可以反向工作:检查它是否为nu记住,3位(>703)使用除法和mod
计算出第3个字母,从总数中扣除该代码,然后加到第2个字母(27到702)上。如果写得正确,整个循环应该是谢谢,但我找到了一个解决方案,我将很快发布:)谢谢,这与我在解决方案中作为答案发布的逻辑基本相同。谢谢,这与我在解决方案中作为答案发布的逻辑基本相同。