Excel буквенно-цифровая последовательность - PullRequest
0 голосов
/ 16 октября 2018

Мне нужно сгенерировать 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

Я попытался разбить код на четыре цифры и затем использовать объединение, чтобы объединить их снова.

Существуют дополнения, которые могут мне помочь, но я бы предпочел найти формулу, прежде чем выбрать дополнение.

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Как сказал Рон выше, в этой последовательности 36 ^ 4 = 1 679 616 значений, что слишком велико для того, чтобы вписаться в одну строку или столбец в excel.Поэтому я бы предложил поместить последовательность в сетку размером 1296 x 1296.

Перед созданием сетки введите уникальные значения (0-9, AZ) в ячейки A1: A36.Затем создайте 2-символьную последовательность в ячейке C4 и скопируйте ее вниз и поперек в ячейку D1299:

=INDEX($A$1:$A$36,QUOTIENT(ROW()-4,36)+1,1)

Здесь вы можете скопировать, вставить и транспонировать значения в ячейках E2: AWZ3.Последним шагом будет объединение значений по этой формуле в ячейке E4:

=CONCATENATE($C4,$D4,E$2,E$3)

Скопируйте эту формулу в диапазон E4: AWZ1299 для получения окончательного результата.Это должно выглядеть примерно так:

enter image description here

0 голосов
/ 16 октября 2018

Копируя «мудрую» идею помещения результатов в квадратную матрицу и используя псевдокод Доминика для подпрограммы 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

Хотя это кажется немногосвернувшись,

  • собирает результаты в коллекцию
  • , заполняет массив VBA результатами и затем
  • записывает массив vba в диапазон листа

код выполняется намного быстрее, чем если бы мы делали последовательную запись на листе.На моей машине процедура занимает чуть более четырех секунд

0 голосов
/ 16 октября 2018

В VBA (псевдокод): создайте какой-нибудь список / коллекцию, например:

A[0] = "0"
A[1] = "1"
...
A[9] = "9"
A[10] = "A"
A[11] = "B"
...
A[35] = "Z"

For i = 0 to 35:
  For j = 0 to 35:
    For k = 0 to 35:
      For l = 0 to 35:
        println(A[i] + A[j] + A[k] + A[l]);
      Next l
    Next k
  Next j
Next i
...