Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Excel VBA-返回false的If语句返回#值_Vba_Excel - Fatal编程技术网

Excel VBA-返回false的If语句返回#值

Excel VBA-返回false的If语句返回#值,vba,excel,Vba,Excel,我正在开发一个更大的Excel宏,但我简化了一点代码,发现了我的问题所在。在下面的if语句中,我可以将rng更改为使该语句为真的单元格,它工作正常。但如果我将其更改为返回false的单元格(或范围内的单元格),它将返回#value error。我对VBA很陌生,那么我做错了什么 Function count_same(column As Range, row As Range) Dim rng As Range Dim cell As Range Dim result As Long resu

我正在开发一个更大的Excel宏,但我简化了一点代码,发现了我的问题所在。在下面的if语句中,我可以将rng更改为使该语句为真的单元格,它工作正常。但如果我将其更改为返回false的单元格(或范围内的单元格),它将返回#value error。我对VBA很陌生,那么我做错了什么

Function count_same(column As Range, row As Range)

Dim rng As Range
Dim cell As Range
Dim result As Long
result = 0

Set rng = Worksheets("Install together 2").Range("f10")

For Each cell In rng.Cells

If WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value, cell.Value)) Then
    result = result + 1
End If

Next cell

count_same = result

End Function

接下来,您可以使用on error resume并进行一些错误检查。您还可以将列作为范围,但永远不要在方法中使用它,以便可以删除它

Public Function count_same(row As Range)
On Error Resume Next
Dim rng As Range
Dim cell As Range
Dim result As Long
result = 0

Set rng = ThisWorkbook.Sheets("Install together 2").Range("F10")

For Each cell In rng.Cells

    If WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value, cell.Value)) Then
        If Err.Number <> 0 Then
            Err.Clear
        Else
            result = result + 1
        End If
    End If

Next cell

count_same = result

End Function
公共函数计数\u相同(行作为范围)
出错时继续下一步
变暗rng As范围
暗淡单元格作为范围
结果很长
结果=0
设置rng=ThisWorkbook.Sheets(“一起安装2”).范围(“F10”)
对于rng.单元格中的每个单元格
如果WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value,cell.Value)),则
如果错误号为0,则
呃,明白了
其他的
结果=结果+1
如果结束
如果结束
下一个细胞
计数=结果相同
端函数

您可以在下一步使用“错误恢复”并进行一些错误检查。您还可以将列作为范围,但永远不要在方法中使用它,以便可以删除它

Public Function count_same(row As Range)
On Error Resume Next
Dim rng As Range
Dim cell As Range
Dim result As Long
result = 0

Set rng = ThisWorkbook.Sheets("Install together 2").Range("F10")

For Each cell In rng.Cells

    If WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value, cell.Value)) Then
        If Err.Number <> 0 Then
            Err.Clear
        Else
            result = result + 1
        End If
    End If

Next cell

count_same = result

End Function
公共函数计数\u相同(行作为范围)
出错时继续下一步
变暗rng As范围
暗淡单元格作为范围
结果很长
结果=0
设置rng=ThisWorkbook.Sheets(“一起安装2”).范围(“F10”)
对于rng.单元格中的每个单元格
如果WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value,cell.Value)),则
如果错误号为0,则
呃,明白了
其他的
结果=结果+1
如果结束
如果结束
下一个细胞
计数=结果相同
端函数

尝试以下方法:

Function count_same(column As Range, row As Range)

Dim rng As Range
Dim cell As Range
Dim result As Long
result = 0

Set rng = Worksheets("Install together 2").Range("f10")

For Each cell In rng.Cells
    If Not IsError(WorksheetFunction.Search(Row.Value, cell.Value)) Then
        If WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value, cell.Value)) Then
            result = result + 1
        End If
    End If

Next cell

count_same = result

End Function
从中学习的实践是,我们可以预测潜在的错误。然后我们要做的是检查IsError函数的倒数。如果是错误,IsError将返回TRUE。我们只希望在没有错误的情况下运行工作表函数。通过执行
If Not IsError
我们实际上是在说“如果这不是一个错误,那么”


在学习VBA时,尽量避免错误,而不是在错误恢复下一步时使用
,或
转到
,因为这些在您刚开始时就已经足够好了,但当您进一步学习时就无法使用了(每次看到转到或出错语句时,您都会诅咒自己)。

尝试以下方法:

Function count_same(column As Range, row As Range)

Dim rng As Range
Dim cell As Range
Dim result As Long
result = 0

Set rng = Worksheets("Install together 2").Range("f10")

For Each cell In rng.Cells
    If Not IsError(WorksheetFunction.Search(Row.Value, cell.Value)) Then
        If WorksheetFunction.IsNumber(WorksheetFunction.Search(row.Value, cell.Value)) Then
            result = result + 1
        End If
    End If

Next cell

count_same = result

End Function
从中学习的实践是,我们可以预测潜在的错误。然后我们要做的是检查IsError函数的倒数。如果是错误,IsError将返回TRUE。我们只希望在没有错误的情况下运行工作表函数。通过执行
If Not IsError
我们实际上是在说“如果这不是一个错误,那么”


在学习VBA时,尽量避免错误,而不是在错误恢复下一步时使用
,或
GoTo
,因为这些在您刚开始时就已经足够好了,但在您进一步学习时就变得无法使用了(每次看到GoTo或On Error语句时,您都会诅咒自己).

试试这样的答案,而不是我以前的答案。如果我正确理解你的需求,这应该可以。它接受一个输入范围(您要搜索的范围)和一个带有searchvalue的inputrange。然后返回输入范围内该子字符串的实例

在代码的顶部,我加入了Application.Volatile,当工作表发生变化时,它会强制重新计算。你可以评论一下

Function count_same(InputRange As Range, RowValue As Range, ColValue as Range)
    Application.Volatile

    Dim result As Long
    result = 0

    Dim cell As Range
    For Each cell In InputRange.Cells
        If InStr(1, RowValue.Value, cell.Value, vbTextCompare) > 0 And InStr(1, ColValue.Value, cell.Value, vbTextCompare) > 0 Then
            result = result + 1
        End If
    Next cell

    count_same = result
End Function

尝试这样的答案,而不是我以前的答案。如果我正确理解你的需求,这应该可以。它接受一个输入范围(您要搜索的范围)和一个带有searchvalue的inputrange。然后返回输入范围内该子字符串的实例

在代码的顶部,我加入了Application.Volatile,当工作表发生变化时,它会强制重新计算。你可以评论一下

Function count_same(InputRange As Range, RowValue As Range, ColValue as Range)
    Application.Volatile

    Dim result As Long
    result = 0

    Dim cell As Range
    For Each cell In InputRange.Cells
        If InStr(1, RowValue.Value, cell.Value, vbTextCompare) > 0 And InStr(1, ColValue.Value, cell.Value, vbTextCompare) > 0 Then
            result = result + 1
        End If
    Next cell

    count_same = result
End Function

你能提供一个工作和非工作的例子吗,一个单元格是一个范围对象。上面的一个是工作的,因为单元格f10包含我正在搜索的匹配项。但如果我将该范围更改为f11,甚至“f10:f11”,它会抛出#值,因为f11不包含我要搜索的内容。如果它不包含文本,我只希望跳过f11。请尝试此操作<代码>如果instr(1,单元格,行)>0,那么他为什么需要跳过错误?对于一个新程序员来说,这是一个非常糟糕的建议<除非绝对必要,否则应避免使用“下一步错误恢复时的代码>”
。根据MSDN,关于搜索方法:“如果未找到查找文本,则返回#值!错误值。”您可能必须将其包装在IfError方法中以获得所需内容,或者以其他方式重写。你能重写一下你想用这个实现什么吗?你能提供一个工作和非工作的例子吗,一个单元格是一个范围对象。上面的一个是工作的,因为单元格f10包含我正在搜索的匹配项。但如果我将该范围更改为f11,甚至“f10:f11”,它会抛出#值,因为f11不包含我要搜索的内容。如果它不包含文本,我只希望跳过f11。请尝试此操作<代码>如果instr(1,单元格,行)>0,那么他为什么需要跳过错误?对于一个新程序员来说,这是一个非常糟糕的建议<除非绝对必要,否则应避免使用“下一步错误恢复时的代码>”
。根据MSDN,关于搜索方法:“如果未找到查找文本,则返回#值!错误值。”您可能必须将其包装在IfError方法中以获得所需内容,或者以其他方式重写。你能用这个改写你想要实现的吗?所以对于一个范围“f11”,如果它不应该找到匹配项,它会像它应该的那样返回0。但是如果我把它改回“f10”,在那里它应该找到匹配项并返回1,它也返回0。开玩笑的,我在上面重新复制了你的建议,它又回到了原来的样子。应该返回1,但仍然返回gi