我需要生成一个4位字母数字代码。它应按以下顺序运行:
0000> 0001> 0002> 0003> 0004> 0005> 0006> 0007> 0008> 0009> 000A> 000B ... ZZZO> ZZZP> ZZZQ> ZZZR> ZZZS> ZZZT> ZZZU> ZZZV> ZZZW> ZZZX> ZZZY> ZZZZ
我尝试将代码分解为四个数字,然后使用级联再次将它们组合在一起。
有一些可以帮助我的附加组件,但是我宁愿在选择附加组件之前先找到一个公式。
答案 0 :(得分:5)
正如罗恩(Ron)所述,该序列中有36 ^ 4 = 1,679,616个值,该值太大,无法放入excel中的任何一行或一列。因此,我建议将序列放入1,296 x 1,296的网格中。
在创建网格之前,在单元格A1:A36中输入唯一值(0-9,A-Z)。然后在单元格C4中创建一个2个字符的序列,并将其向下复制并复制到单元格D1299中:
=INDEX($A$1:$A$36,QUOTIENT(ROW()-4,36)+1,1)
您可以从此处复制,粘贴和转置E2:AWZ3单元格中的值。最后一步是通过单元格E4中的此公式来连接值:
=CONCATENATE($C4,$D4,E$2,E$3)
将此公式复制到E4:AWZ1299范围以得到最终结果。它应该看起来像这样:
答案 1 :(得分:2)
复制将结果放入一个正方形矩阵的“明智”想法,并将Dominique的伪代码用于VBA例程,我们得出:
Option Explicit
Sub Dural()
Dim a(35) As String
Dim I As Long, j As Long, k As Long, l As Long, m As Long
Dim col As Collection
Dim vRes, V
'populate array with the individual items
For I = 0 To 9
a(I) = CStr(I)
Next I
For I = 10 To 35
a(I) = Chr(I + 55)
Next I
Set col = New Collection
I = 0
For j = 0 To 35
For k = 0 To 35
For l = 0 To 35
For m = 0 To 35
I = I + 1
col.Add CStr(a(j) & a(k) & a(l) & a(m))
Next m
Next l
Next k
Next j
ReDim vRes(1 To 1296, 1 To 1296)
I = 0
j = 1
For Each V In col
I = I + 1
If I > UBound(vRes, 1) Then
j = j + 1
I = 1
End If
vRes(I, j) = V
Next V
Dim R As Range
Set R = Range(Cells(1, 3), Cells(UBound(vRes, 1), 2 + UBound(vRes, 2)))
Application.ScreenUpdating = False
With R
.EntireColumn.Clear
.EntireColumn.NumberFormat = "@"
.Value = vRes
.EntireColumn.AutoFit
End With
Application.ScreenUpdating = True
End Sub
尽管看起来有些复杂,但
代码的运行速度比我们对工作表进行串行写入的速度快得多。在我的机器上,例行程序只花了四秒钟以上
答案 2 :(得分:1)
在VBA(伪代码)中:进行某种形式的列表/集合,如下所示:
Declare @test VARCHAR(50) = '85583,85584,85586,85587'
select * from string_split(@test,',')