我想找到一个符合函数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
答案 0 :(得分:1)
我很惊讶之前没有发生错误,因为您的代码存在多个问题。
首先,您需要将Option Base 1
移动到模块的顶部,因为它是模块级语句 - 尝试运行您的代码确认这一点,因为它在运行之前中止,声明无效的语句已在程序内完成。
其次,这并不是严格意义上你必须要做的事情,但更好的编码实践,你的变量命名使代码难以阅读。可能不是像这样的小程序中的问题,但给你的变量正确的名称是一个很好的习惯,无论如何进入。在定义您正在处理的单元格时(或至少包括它们所在的工作表名称,也可能是工作簿),您还应该更明确,并且如果可以,请将变量标注为特定类型。除此之外,you should dimension all variables you use in your code,例如上面代码中的a
和b
。为了便于记住这一点,我建议在您创建的任何模块的顶部添加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(例如,请参阅上述函数中我如何使用它。)