Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中使用(a->;Z、AA->;ZZ、AAA->;ZZZ)标记一组对象_Vba_Map Basic - Fatal编程技术网

在VBA中使用(a->;Z、AA->;ZZ、AAA->;ZZZ)标记一组对象

在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”,则

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

例如,第一个对象将标记为A,第二个对象将标记为B,依此类推

当我到达Z时,下一个对象将被标记为AA

阿兹?然后是BA,BB,BC

ZZ?然后是AAA、AAB、AAC等等

我正在使用Mapbasic(类似于VBA),但我似乎无法理解动态解决方案。我的解决方案假设集合可能超过或不超过最大对象数

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)上。如果写得正确,整个循环应该是谢谢,但我找到了一个解决方案,我将很快发布:)谢谢,这与我在解决方案中作为答案发布的逻辑基本相同。谢谢,这与我在解决方案中作为答案发布的逻辑基本相同。