复制上面的单元格并将值递增1(值按字母顺序排列)



我是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

应该适用于任何两个字母的组合(但"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

字节数组方法作为启动帮助

为了艺术的目的,我展示了另一种方法;"增量";在从"0"到"0"的给定范围内的两个字母的组合;AA";至";ZZ";;这可以通过递增所谓的字节数组中最后一个|前一个字母的数值来实现。

将变量(例如by()(声明为Byte类型后,可以很容易地通过by = s将字符串值(例如s(分配给它。使用的字母(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

最新更新