Vba 是否处理空值
我有以下代码。If包含一个或,当其中一个(或两者)为空时,代码将失败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
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