将数组值分配给瞬间

时间:2016-02-18 11:39:46

标签: excel vba

我想找到一个符合函数chkBelow的条件的单元格,然后将该单元格的地址存储在chkBelow数组中,该数组返回并存储在主子区域中的另一个数组ch中; moveBelow。

最后,我想存储数组ch中的列地址和行地址,并将它们存储在变量a和b中,但a = ch(1)出现错误:Type Mismatch(Error 13)

Sub moveBelow()
    Option Base 1
    Dim ch As Variant
    ch = chkBelow
    a = ch(1)
    b = ch(2)

    Cells(a - 1, b) = Cells(a, b)
    Cells(a, b) = ""

End Sub

Private Function chkBelow() As Variant
    Dim c(1 To 2)
    For k1 = 2 To 5
        For k2 = 3 To 5
            If Cells(k1, k2 + 1).Interior.Pattern = xlNone Then
                c(1) = k1
                c(2) = k2
                chkBelow = c
            End If
        Next k2
    Next k1
End Function

1 个答案:

答案 0 :(得分:1)

我很惊讶之前没有发生错误,因为您的代码存在多个问题。

首先,您需要将Option Base 1移动到模块的顶部,因为它是模块级语句 - 尝试运行您的代码确认这一点,因为它在运行之前中止,声明无效的语句已在程序内完成。

其次,这并不是严格意义上你必须要做的事情,但更好的编码实践,你的变量命名使代码难以阅读。可能不是像这样的小程序中的问题,但给你的变量正确的名称是一个很好的习惯,无论如何进入。在定义您正在处理的单元格时(或至少包括它们所在的工作表名称,也可能是工作簿),您还应该更明确,并且如果可以,请将变量标注为特定类型。除此之外,you should dimension all variables you use in your code,例如上面代码中的ab。为了便于记住这一点,我建议在您创建的任何模块的顶部添加Option Explicit。这样可以更容易地避免类型不匹配错误等。

假设上面没有为您创建错误的任何一个,可能是您正在调用的函数没有设置数组中的任何一个元素,所以你应该检查它们是否是是否可以在引用单元格时使用值,即如果它们的值大于0,则表示您使用它们引用单元格的所有实例。

在重写代码的同时,我还注意到,如果满足创建阵列的条件,你有可能在完成之前打破你的for循环 - 我没有考虑到这一点在这个答案中,但这是你应该考虑的事情。一旦设置了数组值,exiting the function就可以轻松实现这一点。

对问题中的代码进行一些改进,它看起来像这样:

Option Explicit
Option Base 1

Sub moveBelow()
    Dim ch As Variant
    Dim a As Long, b As Long

    ch = chkBelow

    If a > 1 And b > 0 Then
        ThisWorkbook.Worksheets("Sheet1").Cells(a - 1, b) = ThisWorkbook.Worksheets("Sheet1").Cells(a, b)
        ThisWorkbook.Worksheets("Sheet1").Cells(a, b) = ""
    End If

End Sub

Private Function chkBelow() As Variant
    Dim c(1 To 2) As Long
    Dim k1 As Long, k2 As Long

    For k1 = 2 To 5
        For k2 = 3 To 5
            If ThisWorkbook.Worksheets("Sheet1").Cells(k1, k2 + 1).Interior.Pattern = xlNone Then
                c(1) = k1
                c(2) = k2
            End If
        Next k2
    Next k1

    chkBelow = c

End Function

所有这一切,我认为你需要付出很多努力(和混淆)来检查一个范围内的所有单元格是否都被格式化。就个人而言,我可能会将你的功能改为:

Private Function checkBelow() As Range
    Dim rngCurrentCell As Range

    For Each rngCurrentCell In ThisWorkbook.Worksheets("Sheet1").Range("D2:F5")
        If rngCurrentCell.Interior.Pattern = xlNone Then
            Set checkBelow = rngCurrentCell
        End If
    Next rngCurrentCell
End Function

然后使用例如当前的小区及其邻居工作。 OFFSET。请注意,如果您这样做,请you need to use to use the set-keyword when working on objects(例如,请参阅上述函数中我如何使用它。)

相关问题