Обработка значения #NA в VBA - PullRequest
       12

Обработка значения #NA в VBA

0 голосов
/ 11 сентября 2018

Я написал VBA-код, который копирует данные из Sheet1 в Sheet2 с помощью функции Match на основе значения столбца.

Matchфункция выдает ошибку, так как некоторые значения отсутствуют в столбце Sheet2, поэтому для этого я пытаюсь использовать следующий код:

On Error Resume Next

Код скопировал данные из Sheet1 в Sheet2но когда код не находит Match, он вставляет то же значение последнего столбца в следующий столбец.

Поэтому я попытался использовать следующий код для обработки #NA ошибки:

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

Но сам код начал выдавать ошибку, и когда я пытаюсь использовать оба кода вместе, значение переменных cont всегда ложно.

Полный код проблемыВот как это выглядит:

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

Может кто-нибудь подсказать мне, как обработать ошибку #NA в VBA?

Это ссылка на пример данных с кодом: https://drive.google.com/file/d/1-luUAqleKgxcg4pWl_Mn4ecI9HrjnJAq/view?usp=sharing

1 Ответ

0 голосов
/ 11 сентября 2018

Не уверен насчет остальной части вашего кода, но просто чтобы показать, как вы можете обработать эту ошибку, потенциально возвращаемую функцией Match.Объявите temp как вариант, чтобы он мог сохранить значение ошибки, если оно будет возвращено.Используйте Application.Match, который может возвращать значения ошибок, не выбрасывая его.Проверьте temp, является ли это ошибкой с IsError, и затем действуйте соответствующим образом.

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
...