VBA использовать входы для - PullRequest
0 голосов
/ 05 ноября 2018

Так что я новичок в VBA, и прошло много времени с тех пор, как мне приходилось программировать что-то подобное. Я пытаюсь использовать шесть разных входов для форматирования ячеек. Прямо сейчас, если бы я мог просто получить входные данные в x, y, z для форматирования соответствующей ячейки, это было бы здорово! Я стараюсь избегать написания более 125 различных операторов if или case, и мне нужен способ скопировать любой цвет из столбца B в соответствующее поле x, y, z. Как я могу сделать это итеративно?

* ** 1003 тысяча два * Пример

Редактировать: В основном я пытаюсь найти ячейку, которая соответствует входам x, y, z. Прямо сейчас, l, w, h не имеет значения. Я просто пытаюсь пройти через все ячейки в z-плоскостях и найти ту, которая соответствует трем входным условиям (x, y, z).

1 Ответ

0 голосов
/ 06 ноября 2018

Незакончено, но это должно привести вас в правильном направлении.

Это добавит ваш трехмерный объект в массив. AddValue вставит значение в массив в соответствующих местах PostArray отобразит массив в заданном месте. Примечание. В обеих функциях нет проверки ошибок.

Ваш пример Высота (названная глубина в моем) неверен для sub_3. Если высота 0 отображается на одной глубине, то 3 должна отображаться на 4 глубинах (начальная глубина расширена на 3 слоя глубины). Подобно тому, как значения длины и ширины, равные 1, расширяются на единицу за исходную позицию.

enter image description here

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 с использованием значений из вашего рабочего листа, а не для ручного ввода их в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...