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)
请告诉我一个优雅的方法,使这个功能不会抛出错误,并且,如果可以的话,教育我为什么它会抛出错误.
为什么会抛出错误?
因为它希望传递有效范围.看这个例子
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)