Заполните ячейки, основываясь на значениях ячеек x на y - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь заполнить ячейки на основе n-1 значений из трех разных ячеек. Я был успешным в х от у, но у меня проблемы с z

Например, у меня есть ввод:

x     y     z
5     2     2

Вывод должен быть:

x должен иметь 0, 1, 2, 3, 4; каждый повторяется дважды
у должно быть 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  

Я использовал:

для х
= ЕСЛИ (СТРОКА ()

для y
= ЕСЛИ (СТРОКА () <= 1 + А $ 1 * $ 2 * $ 3, MOD (СТРОКА () - 1, А $ 3), "0") </p>

для z
= ЕСЛИ (СТРОКА () <= 1 + А $ 1 * $ 2 * $ 3, MOD (СТРОКА () - 1, А $ 2), "0") </p>

От A1 до A3 содержит количество элементов для xyz. Есть какие-нибудь предложения о том, как я могу это сделать?

1 Ответ

0 голосов
/ 14 марта 2019

Извините за поздний ответ.Если вы позволите себе использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...