#excel #excel-formula
#excel #excel-формула
Вопрос:
Я пытаюсь заполнить ячейки на основе n-1 значений из трех разных ячеек. Я добился успеха в x by y, но у меня возникли проблемы с z
Например, у меня есть входные:
x y z
5 2 2
Вывод должен быть:
x должен иметь 0, 1, 2, 3, 4; каждое повторенное дважды значение
y должно иметь 0 и 1; каждое повторенное пять раз
z должно иметь 0 и 1; каждое повторенное пять раз, но не тот же результат, что x или y
x y z
0 1 0
1 0 0
2 1 0
3 0 0
4 1 0
0 0 0
1 1 0
2 0 0
3 1 0
4 0 0
0 1 1
1 0 1
2 1 1
3 0 1
4 1 1
0 0 1
1 1 1
2 0 1
3 1 1
4 0 1
Я использовал:
для x
=IF(ROW()<=1 A$1*A$2*A$3,INT((ROW()-2)/(A$2 *A$3)),»0″)
для y
=IF(СТРОКА()<=1 A$1*A$2*A$3,MOD(СТРОКА()-1,A$ 3),»0″)
для z
=ЕСЛИ(СТРОКА()<=1 A$1*A$2*A$3,MOD(СТРОКА()-1,A$ 2),»0″)
От A1 до A3 указано количество элементов для xyz. Есть ли какие-либо предложения о том, как я могу это сделать?
Комментарии:
1. Мне кажется, что вы хотите описать декартово произведение трех множеств. Рассматривали ли вы
VBA
решение?2. Я рассматривал VBA, но я пытаюсь избежать этого. Если я использую VBA, как бы я это сделал?
Ответ №1:
Извините за поздний ответ. Если вы позволите себе использовать VBA
(поскольку вы просили об этом в своем комментарии), допустим, у вас есть следующий лист:
Вы могли бы поместить следующий Macro
на кнопку GO
:
Sub CartesianProduct()
'Constants:
Dim top_x As Integer
top_x = ActiveSheet.Cells(2, 1).Value - 1
Dim top_y As Integer
top_y = ActiveSheet.Cells(2, 2).Value - 1
Dim top_z As Integer
top_z = ActiveSheet.Cells(2, 3).Value - 1
'Coordinates
Dim x As Integer
Dim y As Integer
Dim u As Integer
'Counter (row):
Dim c As Integer
c = 2
'----------
For x = 0 To top_x
For y = 0 To top_y
For z = 0 To top_z
ActiveSheet.Cells(c, 5).FormulaR1C1 = x
ActiveSheet.Cells(c, 6).FormulaR1C1 = y
ActiveSheet.Cells(c, 7).FormulaR1C1 = z
c = c 1
Next z
Next y
Next x
End Sub
Затем, нажав на GO
, вы заполняете таблицу набором декартовых произведений ваших множеств:
Если вы хотите избежать точек с координатами с одинаковым значением, просто выполните следующие действия:
For x = 0 To top_x
For y = 0 To top_y
For z = 0 To top_z
If x <> y Or x <> z Or y <> z Then
ActiveSheet.Cells(c, 5).FormulaR1C1 = x
ActiveSheet.Cells(c, 6).FormulaR1C1 = y
ActiveSheet.Cells(c, 7).FormulaR1C1 = z
c = c 1
End If
Next z
Next y
Next x
Комментарии:
1. Это очень полезно! Спасибо.