Ich bin neu in Excel VBA und lerne, indem ich vorhandenen Code ändere / ändere. Ich habe einen Code ausprobiert, der eine Zeichenfolge akzeptiert und mir die nächste Permutation gibt. Meine Daten befinden sich in Zelle A1 und bestehen aus durch Kommas getrennten Zahlen. Die Begrenzer werden als Teil der Daten behandelt. Wenn ich versuche, zweistellige Zahlen (10 usw.) zu permutieren, werden diese als 1 und 0 behandelt.
Function nextPerm(s As String)
' inspired by http://stackoverflow.com/questions/352203/generating-permutations-lazily
' this produces the "next" permutation
' it allows one to step through all possible iterations without having to have them
' all in memory at the same time
Dim L As Integer, ii As Integer, jj As Integer
Dim c() As Byte, temp As Byte
L = Len(s)
If StrComp(s, "**done**") = 0 Or StrComp(s, "") = 0 Then
nextPerm = ""
Exit Function
End If
' convert to byte array... more compact to manipulate
ReDim c(1 To L)
For ii = 1 To L
c(ii) = Asc(Mid(s, ii, 1))
Next ii
' find the largest "tail":
For ii = L - 1 To 1 Step -1
If c(ii) < c(ii + 1) Then Exit For
Next ii
' if we complete the loop without break, ii will be zero
If ii = 0 Then
nextPerm = "**done**"
Exit Function
End If
' find the smallest value in the tail that is larger than c(ii)
' take advantage of the fact that tail is sorted in reverse order
For jj = L To ii + 1 Step -1
If c(jj) > c(ii) Then
' swap elements
temp = c(jj)
c(jj) = c(ii)
c(ii) = temp
Exit For
End If
Next jj
' now reverse the characters from ii+1 to the end:
nextPerm = ""
For jj = 1 To ii
nextPerm = nextPerm & Chr(c(jj))
Next jj
For jj = L To ii + 1 Step -1
nextPerm = nextPerm & Chr(c(jj))
Next jj
End Function
Was muss ich ändern, damit dies funktioniert?
microsoft-excel
vba
Bernard
quelle
quelle
Antworten:
Hier ist die Version für durch Kommas getrennte Listen:
Das Parsing verwendet
Split()
und es gibt andere Änderungen.Nicht vollständig getestet!
quelle
Ich habe den Algorithmus in den ersten Beiträgen nicht geändert:
Ich habe jedoch den VBA-Code geändert, um aussagekräftigere Variablennamen zu erhalten und Begrenzer als Parameter in der Anfangszeichenfolge zuzulassen:
quelle