2017-10-20 58 views
0

我试图创建一个函数,它返回一个由作为参数传递给它的范围的每个第n个单元组成的范围。从每个第n个单元创建一个范围

Function OFFSETRANGE(AREA As Range, Optional STEP As Integer = 1) As Range 
Dim Counter As Integer 
Dim TempRange As Range 

For Each rCell In AREA.Cells 
    If Counter Mod Counter = 0 Then 
     MsgBox ("In loop" & Counter & " " & rCell) 
     TempRange = Application.Union(TempRange, rCell) 
    End If 
Next 
OFFSETRANGE = TempRange 
End Function 

无论何时我尝试使用该函数,我都会收到#VALUE错误。我在做什么错

+0

你有没有在你的代码什么'Counter'的价值是什么地方申报的吗?我还会''Debug.Print'' Area.Cells'中的每个单元格来查看并确保其中每个单元格都有一个数据。 – hod

+0

你不能在一个空的范围内使用Union(一个是Nothing),并且你没有递增'Counter'。通过从VBA中的Sub而不是从工作表调用它来调试你的函数。 –

+0

你是如何使用这个功能的? – jsotola

回答

0

不知道你想在这里做什么

If Counter Mod Counter = 0 Then

Counter没有这样的值抛出值误差。

0

几件事情看起来不正确。 1)你的“counter”整数没有设置,因为你正在对自己做一个mod值,即使它有一个值,它也总是等于0。也许你的意思是Counter Mod步骤?在下面的示例中,我设置了counter = 2,但显然可以更改。

2)工会将失败的第一次努力。如果没有,最好的方法就是使用if语句。我在下面包含一个示例。

Function OFFSETRANGE(AREA As Range, Optional STEP As Integer = 1) As Range 
Dim Counter As Integer: Counter = 2 
Dim TempRange As Range, rCell As Range 

For Each rCell In AREA.Cells 
    If Counter Mod STEP = 0 Then 
     MsgBox ("In loop" & Counter & " " & rCell) 

     If TempRange Is Nothing Then 
      Set TempRange = rCell 
     Else 
      Set TempRange = Union(TempRange, rCell) 
     End If 

    End If 

Next 
Set OFFSETRANGE = TempRange 
End Function 
2
Function OFFSETRANGE(AREA As Range, Optional theStep As Integer = 1) As Range 

    Dim Counter As Long 
    Dim TempRange As Range, rCell As Range 

    For Each rCell In AREA.Cells 
     Counter = Counter + 1 
     If Counter Mod theStep = 0 Then 
      Debug.Print "In loop" & Counter & " " & rCell 
      'check if we can use Union or not here 
      If TempRange Is Nothing Then 
       Set TempRange = rCell 
      Else 
       Set TempRange = Application.Union(TempRange, rCell) 
      End If 
     End If 
    Next 
    Set OFFSETRANGE = TempRange 

End Function 
相关问题