将数组值赋给瞬间

我想find一个适合chkBelow函数的条件的单元格,然后将该单元格的地址存储在数组chkBelow中,该数组返回并存储在另一个数组ch中, moveBelow。

最后,我想存储数组ch的列和行地址,并将它们存储在variablesa和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 

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

首先,你需要将Option Base 1移动到模块的顶部,因为它是一个模块级的语句 – 试图运行你的代码来证实这一点,因为它在运行之前中止运行,声明在程序。

其次,这不是严格意义上的事情,而是更好的编程实践,variables的命名使得代码难以阅读。 可能不是像这样的小程序中的问题,但给你的variables专有名称是一个很好的习惯,无论如何。 在定义你正在工作的单元格时(即至less包括工作表名称,也可能包括什么工作簿),你也应该更加明确,如果可能的话,将variables定为特定的types。 除此之外, 您还应该在代码中使用所有variables ,例如上面代码中的ab 。 为了更容易记住这一点,我build议在你创build的任何模块的顶部添加Option Explicit 。 这使得避免types不匹配错误等变得容易

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

在重写代码的同时,我还注意到,如果符合创build数组的条件,则在完成之前,您会希望跳出for循环,这一点在此答案中我没有考虑到这一点,但这是你应该考虑的。 一旦设置了数组值, 退出函数就可以轻松实现。

在你的问题中的代码做一些改进,它可能看起来像这样:

 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 

所有这一切,我认为你要付出很大的努力(和混淆)来检查一个范围内的所有单元格是否被格式化。 我个人可能会改变你的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在当前单元格及其邻居上工作。 请注意,如果你这样做, 你需要在处理对象时使用set keyword (例如,参见上面的函数中的使用方法)。