#V / A的Excel VBA类型不匹配

时间:2013-09-20 20:03:59

标签: excel vba excel-vba

我有这段代码

    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失败)。

是否可以将代码作为字符串输入#N / A或者将其留空?现在,只要引用的一个单元格是#N / A,块就会失败,根本不会添加任何注释文本。

谢谢!

4 个答案:

答案 0 :(得分:4)

您正在使用单元格的默认属性

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的{​​{1}}。

.Value

答案 1 :(得分:1)

免责声明:我做过一些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.

已修改:感谢David指出应使用.Text属性

答案 2 :(得分:1)

使用IsError检查单元格是否有#N / A

 if IsError(Cmp.Cells(i, GWENetPr)) then
      'give it a valid value
else
      'use the value int he cell
end if

'start with statement

例如

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

答案 3 :(得分:0)

如果出现错误,您可以使用IIf来使用特定值:

& "Comment: " & IIf(IsError(Cmp.Cells(i, CommCol)),"",Cmp.Cells(i, CommCol)) & vbNewLine _