运行每个范围单元循环时避免错误?

use*_*776 3 excel vba excel-vba

我写了下面这个函数.通常它工作正常.但是当r是Nothing时,我在行上收到一条错误信息c in r.Cells告诉我"对象变量或With block变量未设置".

我不知道为什么会发生这种情况.我想象如果r是Nothing,那么循环就不会运行了.

Function CSVFromRange(r As Range) As String
    Dim sTemp As String
    Dim c As Range

    'Append value and comma
    For Each c In r.Cells
        sTemp = sTemp & "," & c.value
    Next c

    'Remove first comma
    If Len(sTemp) > 0 Then
        sTemp = Right(sTemp, Len(sTemp) - 1)
    End If

    CSVFromRange = sTemp
End Function
Run Code Online (Sandbox Code Playgroud)

请告诉我一个优雅的方法,使这个功能不会抛出错误,并且,如果可以的话,教育我为什么它会抛出错误.

Sid*_*out 7

为什么会抛出错误?

因为它希望传递有效范围.看这个例子

Sub Sample()
    Dim r As Range
    Dim ret

    ret = CSVFromRange(r)

End Sub

Function CSVFromRange(r As Range) As String
    CSVFromRange = r.Value
End Function
Run Code Online (Sandbox Code Playgroud)

这是在您的情况下创建错误的最短方法.传递范围对象但未初始化,因此您将收到错误.您需要确保传递有效范围.例如

Sub Sample()
    Dim r As Range
    Dim ret

    Set r = ThisWorkbook.Sheets("Sheet1").Range("A1")
    ret = CSVFromRange(r)

End Sub
Run Code Online (Sandbox Code Playgroud)

我们如何处理这个错误?

您可以在调用sub或函数本身中处理它.我会告诉你们两个

在Sub

Sub Sample()
    Dim r As Range
    Dim ret

    If Not r Is Nothing Then ret = CSVFromRange(r)

End Sub

Function CSVFromRange(r As Range) As String
    CSVFromRange = r.Value
End Function
Run Code Online (Sandbox Code Playgroud)

在功能

Sub Sample()
    Dim r As Range
    Dim ret

    ret = CSVFromRange(r)
End Sub

Function CSVFromRange(r As Range) As String
    If Not r Is Nothing Then
        CSVFromRange = r.Value
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

要么

Sub Sample()
    Dim r As Range
    Dim ret

    ret = CSVFromRange(r)
End Sub

Function CSVFromRange(r As Range) As String
    On Error GoTo ExitGracefully

    CSVFromRange = r.Value

    Exit Function
ExitGracefully:
    MsgBox Err.Description '<~~ comment this if you do not want any alerts
End Function
Run Code Online (Sandbox Code Playgroud)