Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 为范围单元格的每个循环运行时是否避免错误?_Vba_Excel - Fatal编程技术网

Vba 为范围单元格的每个循环运行时是否避免错误?

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

我已经编写了下面的函数。通常效果很好。但当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
        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