Vba 为范围单元格的每个循环运行时是否避免错误?
我已经编写了下面的函数。通常效果很好。但当r为空时,我会在r单元格中的每个c的行上收到一条错误消息,告诉我“未设置对象变量或带块变量” 我不知道为什么会这样。我想象如果r什么都不是,循环就不会运行Vba 为范围单元格的每个循环运行时是否避免错误?,vba,excel,Vba,Excel,我已经编写了下面的函数。通常效果很好。但当r为空时,我会在r单元格中的每个c的行上收到一条错误消息,告诉我“未设置对象变量或带块变量” 我不知道为什么会这样。我想象如果r什么都不是,循环就不会运行 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 s
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
请告诉我一种使此函数不抛出错误的优雅方法,如果可以的话,请告诉我它为什么抛出错误。为什么抛出错误? 因为它希望传递一个有效的范围。看这个例子
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
这是在您的案例中创建错误的最短方法。传递了一个range对象,但它没有初始化,因此您将得到错误。你需要确保你通过了一个有效的范围。比如说
Sub Sample()
Dim r As Range
Dim ret
Set r = ThisWorkbook.Sheets("Sheet1").Range("A1")
ret = CSVFromRange(r)
End 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
在函数中
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
或
子样本()
调光范围
暗网
ret=CSVFromRange(r)
端接头
函数CSVFromRange(r作为范围)作为字符串
错误转到快速退出
CSVFromRange=r.值
退出功能
现有:
MsgBox Err.Description'最简单的答案是测试r
是否为Nothing
Function CSVFromRange(r As Range) As String
Dim sTemp As String
Dim c As Range
If r = Nothing Then
sTemp = vbNullString 'You can change this to a different default return value
Else
'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
Endif
CSVFromRange = sTemp
End Function
我使用On Error Goto,您可以看到代码:
Function CSVFromRange(r As Range) As String
Dim sTemp As String
Dim c As Range
On Error GoTo DisplayError
'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
Exit Function
DisplayError:
... Display a messagebox with error
End Function
以上回答回答了您提出的具体问题。我还建议删除底部的if/end if,而将所有内容都放在For循环中。当有空单元格时,isempty条件将防止使用双逗号
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
If Not IsEmpty(c) And c <> r.Cells.Item(1) Then
sTemp = sTemp & "," & c
Else
sTemp = sTemp & c
End If
Next c
CSVFromRange = sTemp
End Function
函数CSVFromRange(r作为范围)作为字符串
作为字符串的Dim sTemp
调光范围
'附加值和逗号
对于r.单元格中的每个c
如果不是空的(c)和c r.单元格。第(1)项,则
sTemp=sTemp&“,”&c
其他的
sTemp=sTemp&c
如果结束
下一个c
CSVFromRange=sTemp
端函数
这将是一篇文章,所以请耐心听我说:D请告诉我一个优雅的方法,使这个函数不会抛出错误,如果可以的话,还可以告诉我为什么它会抛出错误。
我的答案太难理解了吗?或者我遗漏了我应该回答的问题吗?:)你的回答很好!如果你愿意,你可以接受另一个答案。我的上述评论与此无关。我对“接受”或“追加投票”没有异议:)如果我带着痛苦
仔细回答所有的问题,并举例说明,那么我至少希望在我的答案下面以评论的形式得到承认,不管它是否有用?如果没有,那么面临的问题是什么。就这样。我希望这不是太高的要求?:)当然,一点也不:)谢谢你的反馈!我以后会尽量考虑得更周到:)这个问题我至少得到了三个很好的答案,并且对所有答案都投了赞成票。但我会开始留下更多感激的评论:)谢谢你帮我完成了Siddharth的编程!你比我快很多:)是的,快7分钟:)所以所有谷歌的人都非常幸运,他们拥有如此宝贵的财富,可以自由地传播知识。衷心的感谢。
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
If Not IsEmpty(c) And c <> r.Cells.Item(1) Then
sTemp = sTemp & "," & c
Else
sTemp = sTemp & c
End If
Next c
CSVFromRange = sTemp
End Function