Excel VBA类型不匹配,不适用
我有这段代码Excel VBA类型不匹配,不适用,vba,excel,Vba,Excel,我有这段代码 With Data.Cells(rowMatch, GWECol) .Value = Cmp.Cells(i, GWENetPr) .AddComment .Comment.Text Text:=UCase(Environ("UserName")) & ":" & vbNewLine _ & "Comment: " & Cmp.Cells(i, CommCol) &
With Data.Cells(rowMatch, GWECol)
.Value = Cmp.Cells(i, GWENetPr)
.AddComment
.Comment.Text Text:=UCase(Environ("UserName")) & ":" & vbNewLine _
& "Comment: " & Cmp.Cells(i, CommCol) & vbNewLine _
& "Transaction: " & Cmp.Cells(i, QRTran) & vbNewLine _
& "QR Pr: " & Cmp.Cells(i, QRPr) & vbNewLine _
& "QR WD: " & Cmp.Cells(i, QRWD) & vbNewLine _
& "QR WD All: " & Cmp.Cells(i, QRWDA) & vbNewLine _
& "QR XPr: " & Cmp.Cells(i, QRXPr) & vbNewLine _
& "QR XAll: " & Cmp.Cells(i, QRXAll) & vbNewLine _
& "GWE Pr: " & Cmp.Cells(i, GWEPr) & vbNewLine _
& "GWE All: " & Cmp.Cells(i, GWEAll) & vbNewLine _
& "GWE XPr: " & Cmp.Cells(i, GWEXPr) & vbNewLine _
& "GWE XAll: " & Cmp.Cells(i, GWEXAll)
.Comment.Shape.TextFrame.AutoSize = True
End With
其中,Cmp.Cells(i,X)指可能存在#N/A错误(失败的VLOOKUP)的Cells
是否可以让代码将#N/A作为字符串接收,或者将其保留为空?现在,只要引用的其中一个单元格为#N/A,块就会失败,并且不会添加任何注释文本
谢谢 您正在使用单元格的默认属性
Debug.Print Cmp.Cells(i,QRXAll)
例如,这总是指单元格.Value
属性。.Value
实际上是一种错误类型,error 2042
,我认为您可以通过检查来避免它
CLng(Cmp.Cells(i,QRXA11))
但这将导致2042
而不是#N/A
文本
如果要获取字符串#N/A
:请尝试使用Cmp.Cells(i,QRXAll).Text
,它依赖于单元格的.Text
属性,而不是其.Value
Debug.Print Cmp.Cells(i,QRXAll).Text
免责声明:我做过一些VBA编程,但我不认为自己是专家
这可能过于简单,但您可以将每个值分配给一个变量,然后将变量分配给注释。如果任何一个值为N/A,则至少其余值仍将分配给注释。我喜欢这种解决方案,因为它可以确保单个错误不会破坏整个操作
Dim vComment As String
Dim vTransaction As String
Dim vQRPr As String
Dim vQRWD As String
' Etc.
vComment = Cmp.Cells(i, CommCol).Text
vTransaction = Cmp.Cells(i, QRTran).Text
vQRPr = Cmp.Cells(i, QRPr).Text
vQRWD = Cmp.Cells(i, QRWD).Text
' Etc.
.Comment.Text Text:=UCase(Environ("UserName")) & ":" & vbNewLine _
& "Comment: " & vComment & vbNewLine _
& "Transaction: " & vTransaction & vbNewLine _
& "QR Pr: " & vQRPr & vbNewLine _
& "QR WD: " & vQRWD & vbNewLine
' Etc.
编辑:感谢您指出应使用
.Text
属性如果出现错误,您可以使用IIf
使用特定值:
& "Comment: " & IIf(IsError(Cmp.Cells(i, CommCol)),"",Cmp.Cells(i, CommCol)) & vbNewLine _
使用iError检查单元格是否为N/A 范例
With Data.Cells(rowMatch, GWECol)
If IsError(Cmp.Cells(i, GWENetPr)) Then
.Value = "" 'or #N/A
Else
.Value = Cmp.Cells(i, GWENetPr)
End If
.AddComment
.Comment.Text Text:=UCase(Environ("UserName")) & ":" & vbNewLine _
& "Comment: " & Cmp.Cells(i, CommCol) & vbNewLine _
& "Transaction: " & Cmp.Cells(i, QRTran) & vbNewLine _
& "QR Pr: " & Cmp.Cells(i, QRPr) & vbNewLine _
& "QR WD: " & Cmp.Cells(i, QRWD) & vbNewLine _
& "QR WD All: " & Cmp.Cells(i, QRWDA) & vbNewLine _
& "QR XPr: " & Cmp.Cells(i, QRXPr) & vbNewLine _
& "QR XAll: " & Cmp.Cells(i, QRXAll) & vbNewLine _
& "GWE Pr: " & Cmp.Cells(i, GWEPr) & vbNewLine _
& "GWE All: " & Cmp.Cells(i, GWEAll) & vbNewLine _
& "GWE XPr: " & Cmp.Cells(i, GWEXPr) & vbNewLine _
& "GWE XAll: " & Cmp.Cells(i, GWEXAll)
.Comment.Shape.TextFrame.AutoSize = True
End With
无法以这种方式实现,因为单元格的
.Value
属性是错误类型,不会强制转换到字符串容器中。您必须将变量标注为Variant
,但这将返回一个类似Error 2042
的字符串,而不是单元格的文本内容,文本内容可以从其.text
属性中获得。@DavidZemens-主要从.NET interop中工作,我怀疑有些东西更像您的解决方案,但不确定如何在VBA中实现它。我将用更新答案。Text
我的答案已经解决了问题,没有必要重复它:)@DavidZemens-我认为将值划分为变量仍然是一种好的做法,而不是试图在一条语句中执行这么多函数。它确保单个错误不会破坏整个操作。(我已经对你的答案投了赞成票…)我也更喜欢直接使用变量。将来更容易调试和维护。为什么不使用适当的属性呢?不是使用对象的默认属性(.Value
),而是指定.Text
属性?否则,您必须使用iError
处理将每个单元格范围对象包装在IIF
语句中……这是一个优先选择的问题。返回true或false比获取文本并检查文本值是否为NA更容易,也更容易阅读和理解。OP特别想要#N/A
文本。如果使用.Text
属性而不是.Value
,则将返回该属性而不是错误类型。我认为没有必要对它执行任何布尔运算。OP希望它为空或#N/A。提供了上面的示例。这确实是一个偏好的问题。我展示的代码非常容易阅读和理解。如果OP澄清了情况是否如此,或者它只是一个单元格,那么会有帮助。我想你的意思是使用反勾号…;)谢谢大家!!在发布这篇文章之后,我实际上做了一些类似于Sorceri的解决方案的事情。但将改为将其编辑为.Text
属性。他不知道那笔财产。再次感谢!
With Data.Cells(rowMatch, GWECol)
If IsError(Cmp.Cells(i, GWENetPr)) Then
.Value = "" 'or #N/A
Else
.Value = Cmp.Cells(i, GWENetPr)
End If
.AddComment
.Comment.Text Text:=UCase(Environ("UserName")) & ":" & vbNewLine _
& "Comment: " & Cmp.Cells(i, CommCol) & vbNewLine _
& "Transaction: " & Cmp.Cells(i, QRTran) & vbNewLine _
& "QR Pr: " & Cmp.Cells(i, QRPr) & vbNewLine _
& "QR WD: " & Cmp.Cells(i, QRWD) & vbNewLine _
& "QR WD All: " & Cmp.Cells(i, QRWDA) & vbNewLine _
& "QR XPr: " & Cmp.Cells(i, QRXPr) & vbNewLine _
& "QR XAll: " & Cmp.Cells(i, QRXAll) & vbNewLine _
& "GWE Pr: " & Cmp.Cells(i, GWEPr) & vbNewLine _
& "GWE All: " & Cmp.Cells(i, GWEAll) & vbNewLine _
& "GWE XPr: " & Cmp.Cells(i, GWEXPr) & vbNewLine _
& "GWE XAll: " & Cmp.Cells(i, GWEXAll)
.Comment.Shape.TextFrame.AutoSize = True
End With