Note: The other languages of the website are Google-translated. Back to English

如何在Excel中生成或列出所有可能的排列?

例如,我有三個字符XYZ,現在,我想基於這三個字符列出所有可能的排列,以獲得六個不同的結果,例如:XYZ,XZY,YXZ,YZX,ZXY和ZYX。 在Excel中,如何根據不同的字符數快速生成或列出所有排列?

根據帶有VBA代碼的字符生成或列出所有可能的排列


箭頭藍色右氣泡 根據帶有VBA代碼的字符生成或列出所有可能的排列

以下VBA代碼可以幫助您根據字母的具體數量列出所有排列,請執行以下操作:

1。 按住 ALT + F11 鍵打開 Microsoft Visual Basic for Applications 窗口。

2。 點擊 插入 > 模塊,然後將以下代碼粘貼到 模塊 窗口。

VBA代碼:列出excel中所有可能的排列

Sub GetString()
'Updateby Extendoffice
    Dim xStr As String
    Dim FRow As Long
    Dim xScreen As Boolean
    xScreen = Application.ScreenUpdating
    Application.ScreenUpdating = False
    xStr = Application.InputBox("Enter text to permute:", "Kutools for Excel", , , , , , 2)
    If Len(xStr) < 2 Then Exit Sub
    If Len(xStr) >= 8 Then
        MsgBox "Too many permutations!", vbInformation, "Kutools for Excel"
        Exit Sub
    Else
        ActiveSheet.Columns(1).Clear
        FRow = 1
        Call GetPermutation("", xStr, FRow)
    End If
    Application.ScreenUpdating = xScreen
End Sub
Sub GetPermutation(Str1 As String, Str2 As String, ByRef xRow As Long)
    Dim i As Integer, xLen As Integer
    xLen = Len(Str2)
    If xLen < 2 Then
        Range("A" & xRow) = Str1 & Str2
        xRow = xRow + 1
    Else
        For i = 1 To xLen
            Call GetPermutation(Str1 + Mid(Str2, i, 1), Left(Str2, i - 1) + Right(Str2, xLen - i), xRow)
        Next
    End If
End Sub

3。 然後按 F5 鍵以運行此代碼,並彈出一個提示框,提醒您輸入要列出所有排列的字符,請參見屏幕截圖:

文檔列表排列1

4。 輸入字符後,再單擊 OK 按鈕,所有可能的排列都顯示在活動工作表的A列中。 看截圖:

文檔列表排列2

備註:如果輸入的字符長度等於或大於8個字符,則此代碼將無效,因為排列過多。

文檔列表排列3


列出或生成多列中所有可能的組合

如果您需要基於多列數據生成所有可能的組合,也許沒有一種處理任務的好方法。 但, Excel的Kutools's 列出所有組合 實用程序可以幫助您快速輕鬆地列出所有可能的組合。 點擊下載Kutools for Excel!

doc列出所有組合

Excel的Kutools:具有300多個方便的Excel加載項,可以在30天內免費試用,沒有任何限制。 立即下載並免費試用!


最佳辦公效率工具

Kutools for Excel 解決了你的大部分問題,並將你的生產力提高了 80%

  • 重用: 快速插入 複雜的公式,圖表 以及您以前使用過的任何東西; 加密單元 帶密碼 創建郵件列表 並發送電子郵件...
  • 超級公式欄 (輕鬆編輯多行文本和公式); 閱讀版式 (輕鬆讀取和編輯大量單元格); 粘貼到過濾範圍...
  • 合併單元格/行/列 不會丟失數據; 拆分單元格內容; 合併重複的行/列...防止細胞重複; 比較範圍...
  • 選擇重複或唯一 行; 選擇空白行 (所有單元格都是空的); 超級查找和模糊查找 在許多工作簿中; 隨機選擇...
  • 確切的副本 多個單元格,無需更改公式參考; 自動創建參考 到多張紙; 插入項目符號,複選框等...
  • 提取文字,添加文本,按位置刪除, 刪除空間; 創建和打印分頁小計; 在單元格內容和註釋之間轉換...
  • 超級濾鏡 (將過濾方案保存並應用於其他工作表); 高級排序 按月/週/日,頻率及更多; 特殊過濾器 用粗體,斜體...
  • 結合工作簿和工作表; 根據關鍵列合併表; 將數據分割成多個工作表; 批量轉換xls,xlsx和PDF...
  • 超過 300 項強大的功能. 支持 Office / Excel 2007-2021 和 365。支持所有語言。 在您的企業或組織中輕鬆部署。 完整功能 30 天免費試用。 60 天退款保證。
kte選項卡201905

Office選項卡為Office帶來了選項卡式界面,使您的工作更加輕鬆

  • 在Word,Excel,PowerPoint中啟用選項卡式編輯和閱讀,發布者,Access,Visio和Project。
  • 在同一窗口的新選項卡中而不是在新窗口中打開並創建多個文檔。
  • 將您的工作效率提高 50%,每天為您減少數百次鼠標點擊!
officetab底部
按評論排序
留言 (13)
還沒有評分。 成為第一位評論!
網站主持人對此評論進行了最小化
你好,我正在做一個使用排列和組合規則的小項目。 我需要你的支持。 場景:我有 13 位字母數字數據 (00SHGO8BJIDG0) 我想要一個編碼來交換 S 到 5、I 到 1 和 O 到 0,反之亦然。 該項目是,如果我有正確的 13 位數據,我將收到一個 3 位密碼。 (例如) 00SHG08BJ1DG0 - 500 是密碼,但由於錯誤的拼寫錯誤,而不是 1 是 I 和 0 是 O 有錯誤的信息。 你能幫我麼。
網站主持人對此評論進行了最小化
你好,

我試圖獲得 82 個字符的排列,提供的代碼有效,但是,由於列只有 1048576,我想在 B、C、D 中移動下一個輸出.....你們誰能幫我看待
網站主持人對此評論進行了最小化
@蘇普拉亞...

在第一個子清除所有單元格...不僅僅是第一行
--Cells.Clear

Sub GetPermutation(Str1 作為字符串,Str2 作為字符串,ByRef xRow As Long)
Dim i 為整數,xLen 為整數
xLen = Len(Str2)
如果 xLen < 2 那麼
'當你達到 100 時移動到下一列
單元格(((xRow - 1) Mod 100) + 1, 1 + Int(xRow / 100)) = Str1 & Str2
x行 = x行 + 1
其他
對於 i = 1 到 xLen
調用 GetPermutation(Str1 + Mid(Str2, i, 1), Left(Str2, i - 1) + Right(Str2, xLen - i), xRow)
下一頁
如果結束
END SUB
網站主持人對此評論進行了最小化
從 3 個不同的事物替換和順序很重要可以形成多少個 7 事物序列?
網站主持人對此評論進行了最小化
3 的 7 次方:2187
網站主持人對此評論進行了最小化
大家好。 我需要這方面的幫助。 我有兩個字母要排列成 20 行。 但我沒有做對。 任何可以幫助我的人都應該將排列發送到我的電子郵件。 pauladah69@gmail.com。


1.阿爸
2.aabb
3.aabb
4.aabb
5.aabb
6.aabb
7.aabb
8.aabb
9.aabb
10.aabb
11.aabb
12.aabb
13.aabb
14.aabb
15.aabb
16.aabb
17.aabb
18.aabb
19.aabb
20.aabb
網站主持人對此評論進行了最小化
此代碼將不起作用,因為有兩個許多排列


應該:

此代碼不起作用,因為排列太多


HTH
網站主持人對此評論進行了最小化
你好,MC,
謝謝你的熱情提醒,是我的錯。 我已經糾正了。
非常感謝!
網站主持人對此評論進行了最小化
peki bunu listeleyecek bir program uygulama yok mu?basit sıradan bir hesaplamadan daha fazlasına ihtiyacı olan ne yapacak?
網站主持人對此評論進行了最小化
誰能給我發一份由 10 個結果排列的 2 個不同項目的列表。 這段代碼確實

snt 在這方面工作
網站主持人對此評論進行了最小化
您好,如果輸入字符串包含重複的字符,那麼 sub 會產生重複的排列。
如果您對循環進行以下修改,則不會發生這種情況:

' ===========================
對於 i = 1 到 xLen
如果 Instr( Left(Str2, i - 1), Mid(Str2, i, 1) ) = 0 那麼
調用 GetPermutation(Str1 + Mid(Str2, i, 1), Left(Str2, i - 1) + Right(Str2, xLen - i), xRow)
如果最後
下一頁
' ===========================

為 Mid(Str2, i, 1) 和 Left(Str2, i - 1) 創建臨時局部變量,並避免 i=1 的測試使其運行得更快:


' ===========================
Sub GetPermutation(Str1 作為字符串,Str2 作為字符串,ByRef xRow As Long)
Dim i 為整數,xLen 為整數,Str2left 為字符串,c 為字符串
xLen = Len(Str2)
如果 xLen < 2 那麼
範圍(“A” & xRow)= Str1 & Str2
x行 = x行 + 1
其他
調用 GetPermutation(Str1 + Mid(Str2, 1, 1), Right(Str2, xLen - 1), xRow)
對於 i = 2 到 xLen
c = 中 (Str2, i, 1)
Str2left = 左(Str2, i - 1)
如果 Instr( Str2left, c ) = 0 那麼
調用 GetPermutation(Str1 + c, Str2left + Right(Str2, xLen - i), xRow)
如果結束
下一頁
如果結束
END SUB
' ===========================

歡呼聲中,
影碟機
網站主持人對此評論進行了最小化
奧拉!

Como faço para gerar pelo menos 10 permutações ?
網站主持人對此評論進行了最小化
你好,馬特烏斯,
為了解決您的問題,請應用以下代碼:(注意:如果超過 8 個字符,代碼將執行緩慢。)
Sub GetString()
'Updateby Extendoffice
    Dim xStr As String
    Dim FRow As Long
    Dim FC As Integer
    Dim xScreen As Boolean
    Dim xNumber As Long
    xNumber = 10 ' This is the max length of the characters you can change it to 11, 12, 13...as you need
    xScreen = Application.ScreenUpdating
    Application.ScreenUpdating = False
    xStr = Application.InputBox("Enter text to permute:", "Kutools for Excel", , , , , , 2)
    If Len(xStr) < 2 Then Exit Sub
    If Len(xStr) > xNumber Then
        MsgBox "Too many permutations!", vbInformation, "Kutools for Excel"
        Exit Sub
    Else
        ActiveSheet.Columns(1).Clear
        FRow = 1
        FC = 1
        Call GetPermutation("", xStr, FRow, FC)
    End If
    Application.ScreenUpdating = xScreen
End Sub
Sub GetPermutation(Str1 As String, Str2 As String, ByRef xRow As Long, ByRef xc As Integer)
    Dim i As Integer, xLen As Integer
    xLen = Len(Str2)
    If xLen < 2 Then
        If xRow > 1000000 Then
            xc = xc + 1
            xRow = 1
        End If
       ActiveSheet.Cells(xRow, xc) = Str1 & Str2
        xRow = xRow + 1
    Else
        For i = 1 To xLen
            Call GetPermutation(Str1 + Mid(Str2, i, 1), Left(Str2, i - 1) + Right(Str2, xLen - i), xRow, xc)
        Next
    End If
End Sub


請試一試,希望對您有所幫助!
這裡還沒有評論
留下你的意見
以訪客身份發帖
×
評價此帖子:
0   字符
推薦地點

關注我們

版權所有©2009 - 萬維網。extendoffice.com。 | 版權所有。 供電 ExtendOffice。 |
Microsoft和Office徽標是Microsoft Corporation在美國和/或其他國家的商標或註冊商標。
受Sectigo SSL保護