Vba 是否处理空值

Vba 是否处理空值,vba,excel,Vba,Excel,我有以下代码。If包含一个或,当其中一个(或两者)为空时,代码将失败 For Each cellName In sCMDB.Range("A2:A" & uCMDB) devName = cellName.Offset(, 1) devIP = cellName.Offset(, 10) modNum = cellName.Offset(, 7) modId = cellName.Offset(, 14) Set mnScope = sScope.Ran

我有以下代码。If包含一个或,当其中一个(或两者)为空时,代码将失败

For Each cellName In sCMDB.Range("A2:A" & uCMDB)
    devName = cellName.Offset(, 1)
    devIP = cellName.Offset(, 10)
    modNum = cellName.Offset(, 7)
    modId = cellName.Offset(, 14)

Set mnScope = sScope.Range("A2:A" & uScope).Find(modNum, , , lookat:=xlWhole)
Set miScope = sScope.Range("B2:B" & uScope).Find(modId, , , lookat:=xlWhole)
    If (modNum = mnScope) Or (modId = miScope) Then
        sScope.Cells(mnScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
        sScope.Cells(mnScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)
    Else
        sCMDB.Cells(cellName.Row, 19).Value = "Not Measured"
        sCMDB.Cells(cellName.Row, 21).Value = "Not Measured"
    End If
如果nmScope或miSCope为null,则代码不会进一步执行。 我知道我错过了什么,我只是不知道是什么

虽然前面的任何一个值都不为null,但这是完美的,当至少有一个值为空时,问题就开始了

更新1

在查看了一些评论之后,我发现复制到sCMDB.cells的sScope.cell是这里的问题所在

Set mnScope = sScope.Range("A2:A" & uScope).Find(modNum, , , lookat:=xlWhole)
Set miScope = sScope.Range("B2:B" & uScope).Find(modId, , , lookat:=xlWhole)
    If ((modNum = mnScope) Or (modId = miScope)) Then
        **sScope.Cells(((miScope.Row) Or (mnScope.Row)), 3).Copy sCMDB.Cells(cellName.Row, 19)
        sScope.Cells(((miScope.Row) Or (mnScope.Row)), 4).Copy sCMDB.Cells(cellName.Row, 21)**
    Else
        sCMDB.Cells(cellName.Row, 19).Value = "N/A"
        sCMDB.Cells(cellName.Row, 21).Value = "N/A"
    End If
问题是,如果在检查mnScope.row以获取将复制到sCMDB的值时mnScope为nothing,则该值为空。 我尝试将这两行赋给同一个值,以查看是否可以检索其中任何一行

试图避免使用多个实例

If ((modNum = mnScope) Or (modId = miScope)) Then
    sScope.Cells(mnScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
    sScope.Cells(mnScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)
    sScope.Cells(miScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
    sScope.Cells(miScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)

您可以为
nmScope
nmScope
添加检查,以确保它们不等于
vbNullString

For Each cellName In sCMDB.Range("A2:A" & uCMDB)
    devName = cellName.Offset(, 1)
    devIP = cellName.Offset(, 10)
    modNum = cellName.Offset(, 7)
    modId = cellName.Offset(, 14)

Set mnScope = sScope.Range("A2:A" & uScope).Find(modNum, , , lookat:=xlWhole)
Set miSCope = sScope.Range("B2:B" & uScope).Find(modId, , , lookat:=xlWhole)
    If ((modNum = mnScope) Or (modId = miSCope)) And _
            miSCope <> vbNullString And nmScope <> vbNullString Then
        sScope.Cells(mnScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
        sScope.Cells(mnScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)
    Else
        sCMDB.Cells(cellName.Row, 19).Value = "Not Measured"
        sCMDB.Cells(cellName.Row, 21).Value = "Not Measured"
    End If
sCMDB.Range(“A2:A”和uCMDB)中每个cellName的

devName=cellName.Offset(,1)
devIP=cellName.Offset(,10)
modNum=cellName.Offset(,7)
modId=cellName.Offset(,14)
设置mnScope=sScope.Range(“A2:A”&uScope.Find(modNum,,lookat:=xlother)
设置miSCope=sScope.Range(“B2:B”和uScope.Find)(modId,,lookat:=xlother)
如果((modNum=mnScope)或(modId=miSCope))和_
miSCope vbNullString和nmScope vbNullString,然后
sScope.Cells(mnScope.Row,3)。复制sCMDB.Cells(cellName.Row,19)
sScope.Cells(mnScope.Row,4)。复制sCMDB.Cells(cellName.Row,21)
其他的
sCMDB.Cells(cellName.Row,19).Value=“未测量”
sCMDB.Cells(cellName.Row,21).Value=“未测量”
如果结束

空/空范围对象不返回VBA值。因此,请尝试以下方法:

For Each cellName In sCMDB.Range("A2:A" & uCMDB)
    devName = cellName.Offset(, 1)
    devIP = cellName.Offset(, 10)
    modNum = cellName.Offset(, 7)
    modId = cellName.Offset(, 14)

Set mnScope = sScope.Range("A2:A" & uScope).Find(modNum, , , lookat:=xlWhole)
Set miScope = sScope.Range("B2:B" & uScope).Find(modId, , , lookat:=xlWhole)
    If Not (mnScope Is Nothing Or miScope Is Nothing) Then
        If (modNum = mnScope) Or (modId = miScope) Then
            sScope.Cells(mnScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
            sScope.Cells(mnScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)
        Else
            sCMDB.Cells(cellName.Row, 19).Value = "Not Measured"
            sCMDB.Cells(cellName.Row, 21).Value = "Not Measured"
        End If
    End If

我真傻,我一开始就在解决这个问题,但没能看到它 这里我宣布我要找的是什么

For Each cellName In sCMDB.Range("A1104:A1104")
    devName = cellName.Offset(, 1)
    devIP = cellName.Offset(, 10)
    modNum = cellName.Offset(, 7)
    modId = cellName.Offset(, 14)

The if is looking for it, and it was resolving on Nothing or else.
    If ((modNum = mnScope) Or (modId = miScope)) Then
        sScope.Cells(((miScope.Row) Or (mnScope.Row)), 3).Copy sCMDB.Cells(cellName.Row, 19)
        sScope.Cells(((miScope.Row) Or (mnScope.Row)), 4).Copy sCMDB.Cells(cellName.Row, 21)
    Else
        sCMDB.Cells(cellName.Row, 19).Value = "N/A"
        sCMDB.Cells(cellName.Row, 21).Value = "N/A"
    End If
但问题很早就解决了,因为我们已经找到了这个值(或者没有)

因此,mnScope是“If modNum=mnScope或modId=miScope”计算的结果


您是指空字符串或零长度字符串中的null还是空字符串中的null(找不到匹配项)?modNum和modId是否始终为非空?是否应该在A列和B列的同一行中找到它们?空值,因为在Nothing(找不到匹配项)列A和B中获得了modNum(A)和modId(B)需要满足的引用值。modNum和modId并不总是空的,但往往会发生,有时是modNum,有时是modId,有时两者都有,有时没有。我正试着一下子把他们都弄到手,想知道答案!我试过你的,但在“如果不是(mnScope为Nothing或miScope为Nothing)”之后,代码结束。谢谢你的帮助。这个帮助了我。我编辑了原文以反映当前问题
Set mnScope = sScope.Range("A2:A" & uScope).Find(modNum, , , lookat:=xlWhole)
Set miScope = sScope.Range("B2:B" & uScope).Find(modId, , , lookat:=xlWhole)
Set mnScope = sScope.Range("A2:A" & uScope).Find(modNum, , , lookat:=xlWhole)
Set miScope = sScope.Range("B2:B" & uScope).Find(modId, , , lookat:=xlWhole)
    If Not mnScope Is Nothing Then
        sScope.Cells(mnScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
        sScope.Cells(mnScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)
    ElseIf Not miScope Is Nothing Then
        sScope.Cells(miScope.Row, 3).Copy sCMDB.Cells(cellName.Row, 19)
        sScope.Cells(miScope.Row, 4).Copy sCMDB.Cells(cellName.Row, 21)
    Else
        sCMDB.Cells(cellName.Row, 19).Value = "N/A"
        sCMDB.Cells(cellName.Row, 21).Value = "N/A"
    End If