首页 > 解决方案 > VBA 使用输入

问题描述

所以我是 VBA 的新手,我已经很长时间没有编写这样的程序了。我正在尝试使用六个不同的输入来格式化单元格。现在,如果我可以获取 x、y、z 中的输入来格式化相应的单元格,那就太好了!我试图避免编写超过 125 种不同的 if 语句或案例,并且需要一种方法将 B 列中的任何颜色复制到适当的 x、y、z 框中。我怎样才能迭代地做到这一点?

例子

编辑:基本上我要做的是找到一个对应于 x、y、z 输入的单元格。现在,l、w、h 无关紧要。我只是想遍历 z 平面中的所有单元格并找到与三个输入条件(x、y、z)匹配的单元格。

标签: excelvbastructurecode-organization

解决方案


未完成,但是,这应该让您朝着正确的方向开始。

这会将您的 3d 对象添加到数组中。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,而不是手动将它们输入到数组中。


推荐阅读