复制上面的单元格并将值增加 1(值按字母顺序排列)
Copy the cell above and increment value by 1 (Value is alphabetical)
我是 VBA 的新手,需要一些帮助。在活动单元格中,我需要复制上面单元格中的值并将该值递增 1。该值始终是两个字母,例如 AA、AB、AC。我可以找到有关递增数字但不是字母的信息。
Sub Tester()
Dim v As String
v = "CD" 'for example
Debug.Print Replace(Range(v & "1").Offset(0, 1).Address(0, 0), "1", "") '> CE
End Sub
应该适用于任何 two-letter 组合(但“ZZ”会给你“AAA”)
没有使用范围引用的限制:
Sub Tester()
Dim e
For Each e In Array("A", "AA", "AZ", "AZZ", "ZZZ", String(10,"Z"))
Debug.Print e, NextSeq(CStr(e))
Next e
End Sub
Function NextSeq(s As String)
Dim rv As String, a As Long, carry As Boolean, ls As Long, i As Long
ls = Len(s)
For i = ls To 1 Step -1
a = Asc(Mid(s, i, 1)) - 64 ' "A"=ASCII 65
If i = ls Or carry Then
a = IIf(a = 26, 1, a + 1) 'roll over ?
carry = a = 1 'carry 1 to next iteration ?
End If
rv = Chr(64 + a) & rv
Next i
NextSeq = IIf(carry, "A" & rv, rv) 'one more "A" ?
End Function
输出:
A B
AA AB
AZ BA
AZZ BAA
ZZZ AAAA
ZZZZZZZZZZ AAAAAAAAAAA
字节数组方法作为开始帮助
为了艺术的缘故,我演示了另一种方法来在从“AA”到“ZZ”的给定范围内“增加”two-letter组合;这可以通过增加所谓的 字节数组 .
中最后一个|前一个字母的数值来完成
将变量(例如 by()
)声明为 Byte 类型,可以轻松地通过 [= 将字符串值(例如 s
)分配给它13=]。使用的字母(A 到 Z)现在显示元素对中相应的数字字符值(第一个字母值可以取自 by(0)
,第二个=最后一个取自 by(2)
或 by(ubound(by)-1)
因为这里有 4 个索引为 0 到 3 的元素)。
Public Function IncLetter(Optional ByVal s As String = "AA") As String
If Len(s) > 2 Or UCase(s) = "ZZ" Then
IncLetter = s & "?": Exit Function
End If
'a) get numeric character values
Dim by() As Byte: by = s
'b) increment last alphabetic letter
Dim indx As Long: indx = UBound(by) - 1
'check if last letter is "Z"
If UCase(Chr(by(indx))) = "Z" Then
by(indx) = by(indx) - 25
by(indx - 2) = by(indx - 2) + 1
Else
by(indx) = by(indx) + 1
End If
'c) return new string as function result
IncLetter = by
End Function
我是 VBA 的新手,需要一些帮助。在活动单元格中,我需要复制上面单元格中的值并将该值递增 1。该值始终是两个字母,例如 AA、AB、AC。我可以找到有关递增数字但不是字母的信息。
Sub Tester()
Dim v As String
v = "CD" 'for example
Debug.Print Replace(Range(v & "1").Offset(0, 1).Address(0, 0), "1", "") '> CE
End Sub
应该适用于任何 two-letter 组合(但“ZZ”会给你“AAA”)
没有使用范围引用的限制:
Sub Tester()
Dim e
For Each e In Array("A", "AA", "AZ", "AZZ", "ZZZ", String(10,"Z"))
Debug.Print e, NextSeq(CStr(e))
Next e
End Sub
Function NextSeq(s As String)
Dim rv As String, a As Long, carry As Boolean, ls As Long, i As Long
ls = Len(s)
For i = ls To 1 Step -1
a = Asc(Mid(s, i, 1)) - 64 ' "A"=ASCII 65
If i = ls Or carry Then
a = IIf(a = 26, 1, a + 1) 'roll over ?
carry = a = 1 'carry 1 to next iteration ?
End If
rv = Chr(64 + a) & rv
Next i
NextSeq = IIf(carry, "A" & rv, rv) 'one more "A" ?
End Function
输出:
A B
AA AB
AZ BA
AZZ BAA
ZZZ AAAA
ZZZZZZZZZZ AAAAAAAAAAA
字节数组方法作为开始帮助
为了艺术的缘故,我演示了另一种方法来在从“AA”到“ZZ”的给定范围内“增加”two-letter组合;这可以通过增加所谓的 字节数组 .
中最后一个|前一个字母的数值来完成将变量(例如 by()
)声明为 Byte 类型,可以轻松地通过 [= 将字符串值(例如 s
)分配给它13=]。使用的字母(A 到 Z)现在显示元素对中相应的数字字符值(第一个字母值可以取自 by(0)
,第二个=最后一个取自 by(2)
或 by(ubound(by)-1)
因为这里有 4 个索引为 0 到 3 的元素)。
Public Function IncLetter(Optional ByVal s As String = "AA") As String
If Len(s) > 2 Or UCase(s) = "ZZ" Then
IncLetter = s & "?": Exit Function
End If
'a) get numeric character values
Dim by() As Byte: by = s
'b) increment last alphabetic letter
Dim indx As Long: indx = UBound(by) - 1
'check if last letter is "Z"
If UCase(Chr(by(indx))) = "Z" Then
by(indx) = by(indx) - 25
by(indx - 2) = by(indx - 2) + 1
Else
by(indx) = by(indx) + 1
End If
'c) return new string as function result
IncLetter = by
End Function