Незакончено, но это должно привести вас в правильном направлении.
Это добавит ваш трехмерный объект в массив.
AddValue вставит значение в массив в соответствующих местах
PostArray отобразит массив в заданном месте.
Примечание. В обеих функциях нет проверки ошибок.
Ваш пример Высота (названная глубина в моем) неверен для sub_3. Если высота 0 отображается на одной глубине, то 3 должна отображаться на 4 глубинах (начальная глубина расширена на 3 слоя глубины). Подобно тому, как значения длины и ширины, равные 1, расширяются на единицу за исходную позицию.
Sub Test()
Dim oArr(1 To 5, 1 To 5, 1 To 5) As String
Call AddValue(oArr, 4, 4, 1, 0, 0, 0, "s1")
Call AddValue(oArr, 1, 3, 2, 0, 0, 0, "s2")
Call AddValue(oArr, 2, 2, 1, 1, 1, 3, "s3")
Call PostArray(oArr, Sheet1.Range("I4"))
End Sub
Private Sub AddValue(ByRef Arr() As String, ByVal iX As Integer, ByVal iY As Integer, ByVal iZ As Integer, _
ByVal iLength As Integer, ByVal iWidth As Integer, iDepth As Integer, _
ByVal Value As String)
Dim oLength As Integer
Dim oWidth As Integer
Dim oDepth As Integer
For oLength = iX To iX + iLength
For oWidth = iY To iY + iWidth
For oDepth = iZ To iZ + iDepth
Arr(oLength, oWidth, oDepth) = Value
Next
Next
Next
End Sub
Private Sub PostArray(ByRef Arr() As String, ByVal PostRange As Range)
Dim oX As Integer
Dim oY As Integer
Dim oZ As Integer
For oX = 1 To 5
For oY = 1 To 5
For oZ = 1 To 5
PostRange.Offset(oX - 1, (oY - 1) + ((oZ - 1) * 6)).Value = Arr(oX, oY, oZ)
Next
Next
Next
End Sub
дополнительная работа
Значения PostArray идут слева направо, а не ваш пример справа налево. Если вы читаете справа налево в своих таблицах, почему глубины также не перечислены в том же направлении? Если вам нужно это в таком порядке, вы, вероятно, захотите отделить математику, чтобы получить координату позиции 1,1 для каждой глубины, и отдельный расчет для смещений в этой сетке.
PostArray перечисляет значения вместо цвета, но если вы вводите цвет в качестве значения для каждой позиции, вы можете установить цвет вместо публикации значения.
Потребуется цикл для вызова AddValue с использованием значений из вашего рабочего листа, а не для ручного ввода их в массив.