Заполнение ячеек на основе x by y значением ячейки z

#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 (поскольку вы просили об этом в своем комментарии), допустим, у вас есть следующий лист:

ActiveSheet

Вы могли бы поместить следующий 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 , вы заполняете таблицу набором декартовых произведений ваших множеств:

ActiveSheet

Если вы хотите избежать точек с координатами с одинаковым значением, просто выполните следующие действия:

     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. Это очень полезно! Спасибо.