
Gửi bởi
Hau151978
Nếu là Sub thì không khó: chọn tất cả các hoán vị, loại bỏ trùng rồi ghi ra sheet. Nhưng nếu là Function thì khó đấy, có khi VBA đơn thuần không làm được (trừ khi dùng thủ đoạn bằng cách thêm thủ tục sự kiện).
Được chứ sao không!
Code thế này:
Mã:
Function UniquePermuMain(ByVal x As String, ByVal y As String, byRef dic As Object)
Dim i As Long, j As Long, tmp As String, Ret
If dic Is Nothing Then Set dic = CreateObject("Scripting.Dictionary")
j = Len(y)
tmp = x & y
If j < 2 Then
If Not dic.Exists(tmp) Then dic.Add tmp, ""
Else
For i = 1 To j
Ret = UniquePermuMain(x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i), dic)
Next
End If
UniquePermuMain = dic.Keys
End Function
Function UniquePermu(ByVal text As String)
Dim dic As Object, x As String
UniquePermu = UniquePermuMain(x, text, dic)
End Function
Trên bảng tính, tại cell C4, gõ công thức:
Mã:
=IFERROR(INDEX(UniquePermu($A$4),,ROWS($1:1)),"")
kéo fill xuống
Lưu ý thêm rằng yêu cầu của người ta là hoán vị là lấy giá trị không trùng nên code bài 5 và 6 là không chính xác (thử chuỗi 112, 1122... sẽ biết)
-----------------
Tuy nhiên viết thành Function rồi gõ trên bảng tính có thể làm file "nặng" lên nếu như chuỗi đầu vào có độ dài lớn