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