#excel #vba #combinations #permutation
#excel #vba #комбинации #перестановка
Вопрос:
Не могли бы вы рассказать мне, как я могу получить все перестановки «да» и «нет» в 6 столбцах?
Был задан аналогичный вопрос, и для 5 столбцов была предоставлена следующая формула:
=CHOOSE(1 MID(LEFT("00000",5-LEN(DEC2BIN(32-ROW() 1)))amp;DEC2BIN(32-ROW() 1),COLUMN()-1,1),"No","Yes")
Следующий ответ VBA был предоставлен для 5 столбцов:
Option Explicit
Sub DisplayYesNoPerms()
Dim rowsamp;, colsamp;
cols = 5
rows = 2 ^ cols
[b2].Resize(rows cols) = YesNoPerms(rows, cols)
End Sub
Function YesNoPerms(rowsamp;, colsamp;)
Dim iamp;, jamp;, t$, v
ReDim v(0 To rows -1, 1 To cols)
For i=0 To rows - 1
t= Format(DecToBin(i), String(cols, "0"))
For j=1 To cols
v(i, j) = IIf(Mid(t, j, 1), "No", "Yes")
Next
Next
YesNoPerms = v
End Function
Function DecToBin$(ByVal namp;)
Do
DecToBin = n Mod 2 amp; DecToBin
n = n 2
Loop While n
End Function
Бонусная логика:
- Если столбец 1 равен «нет», столбец 2 не может быть «да».
- Если столбец 3 — «нет», столбец 4 не может быть «да».
- Если столбец 5 равен «нет», столбец 6 не может быть «да».
Комментарии:
1. Вы пометили VBA по определенной причине? У вас есть код, который вы забыли включить в свой вопрос?
2. Я добавил приведенный выше код VBA.
Ответ №1:
Также на основе двоичных шаблонов:
Sub qwerty()
Dim i As Long, wf As WorksheetFunction
Set wf = Application.WorksheetFunction
With wf
For i = 0 To 63
arr = Split(Replace(Replace(frag(.Dec2Bin(i, 6)), "1", "yes"), "0", "no"), ",")
Range(Cells(i 1, 1), Cells(i 1, 6)).Value = arr
Next i
End With
End Sub
Public Function frag(sin As String) As String
Dim i As Long, L As Long
frag = Left(sin, 1)
L = Len(sin)
If L = 1 Then Exit Function
For i = 2 To L
frag = frag amp; "," amp; Mid(sin, i, 1)
Next i
End Function
Frag()
преобразует строку в строку, разделенную запятыми.