Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在VBA中处理#NA值_Excel_Vba_Match_Lookup_Worksheet - Fatal编程技术网

Excel 在VBA中处理#NA值

Excel 在VBA中处理#NA值,excel,vba,match,lookup,worksheet,Excel,Vba,Match,Lookup,Worksheet,我编写了VBA代码,该代码通过基于列值的匹配功能将数据从Sheet1复制到Sheet2 Match函数抛出错误,因为Sheet2列中的某些值不可用,因此我尝试使用以下代码: On Error Resume Next 代码将数据从Sheet1复制到Sheet2,但当代码未找到匹配的时,它也将上一列的相同值插入下一列 因此,我尝试使用以下代码来处理#NA错误: cont=Application.WorksheetFunction.IsNA(Excel.WorksheetFunction.Match

我编写了VBA代码,该代码通过基于列值的
匹配功能
将数据从
Sheet1
复制到
Sheet2

Match
函数抛出错误,因为
Sheet2
列中的某些值不可用,因此我尝试使用以下代码:

On Error Resume Next
代码将数据从
Sheet1
复制到
Sheet2
,但当代码未找到匹配的
时,它也将上一列的相同值插入下一列

因此,我尝试使用以下代码来处理
#NA
错误:

cont=Application.WorksheetFunction.IsNA(Excel.WorksheetFunction.Match(Sheet2.Cells(1,i),Sheet1.Range(“A3:Ah3”),0))

但是代码本身开始抛出错误,当我尝试同时使用这两个代码时,cont variables值总是false

问题的完整代码如下所示:

Sub Copy()
Dim lastColumnSheet2 As Long
Dim i As Long
Dim temp As Long
Dim cont As Boolean


lastColumnSheet2 = Sheet2.Cells(1, Columns.Count).End(xlToLeft).Column

On Error Resume Next
For i = 2 To lastColumnSheet2
    'cont = Application.WorksheetFunction.IsNA(Excel.WorksheetFunction.Match(Sheet2.Cells(1, i), Sheet1.Range("A3:Ah3"), 0))
    'If cont = False Then
    temp = Excel.WorksheetFunction.Match(Sheet2.Cells(1, i), Sheet1.Range("A1:Ah1"), 0)


        If Sheet2.Cells(2, i).Value = "" Then
                Sheet2.Cells(2, i).Value = Sheet1.Cells(2, temp).Value

        End If
    'Else
    'End If

Next i
有人能告诉我如何处理VBA中的
#NA
错误吗


这是指向代码示例数据的链接:

不确定代码的其余部分,只是为了说明如何处理
Match
函数可能返回的错误。将
temp
声明为变量,以便在返回时存储错误值。使用
Application.Match
,它可以返回错误值,而不会发出嘶嘶声。测试
temp
是否为
iError
错误,然后采取相应措施

Option Explicit
Public Sub CopyInfo()
    Dim lastColumnSheet2 As Long
    Dim i As Long
    Dim temp As Variant
    Dim cont As Boolean

    lastColumnSheet2 = Sheet2.Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 2 To lastColumnSheet2

        temp = Application.Match(Sheet2.Cells(1, i), Sheet1.Range("A1:AH1"), 0)

        If Not IsError(temp) And IsEmpty(Sheet2.Cells(2, i)) Then
            Sheet2.Cells(2, i).Value = Sheet1.Cells(2, temp).Value
        End If
    Next
End Sub

通常应避免在出现错误时继续下一步
。它不是用于处理错误,而是用于忽略错误。这里是Chip Pearson的概述。提供足够的代码和数据样本,我们可以以有意义的方式为您重现。这是指向样本数据的链接,代码为@Karan-最好在您的问题中包含所有相关信息。您可以在帖子中添加相关代码和示例数据。(请参见如何创建a以及“”,以及此。)@Karan…实际上,几小时前我的另一个问题显示了使用
.Find
(并提到为什么它比VBA中的
Match
VLookUp
更好)的替代解决方案。当您运行VBA文件时,该文件开始在分配临时值的行上给出错误,代码甚至没有转到if语句请问错误是什么?您是否将temp声明为variant?temp声明为Double,我得到的错误是“运行时错误'1004'无法获取工作表函数类的匹配属性”。请按照我的示例使用代码。看到我说的那句话了吗。。。将temp声明为变量,以便在返回的值不存在时存储错误值。另外,请仔细看我的答案。它使用Application.Match和原因使用Application.Match,它可以返回错误值,而不会抛出嘶嘶声