Необходимо запретить пользователю запускать макрос, если # N / A присутствует на любом листе - PullRequest
2 голосов
/ 07 марта 2012

Я создал макрос для одного из наших шаблонов загрузки, который использует формулу VLOOKUP для сопоставления описаний с кодами.Если есть новое описание, пользователь должен создать новый код.После того, как они создают новый код и VLOOKUP возвращает совпадение, появляется дополнительный макрос, который будет копировать / вставлять специальные / удалять дубликаты, чтобы подготовить файл для загрузки.Я хотел бы включить что-то в последний макрос, который будет проверять наличие ошибок VLOOKUP, прежде чем копировать / вставлять специальные / удалять дубликаты.Всего имеется 9 рабочих листов, и номер строки будет отличаться.

Я обнаружил, что эта функция проверяет наличие # N / A, но я не уверен, что лучше всего использовать ее в существующем макросе:

Application.WorksheetFunction.IsNA(rngToCheck.Value)

Вот макрос для копирования / вставки специальных / удаления дубликатов, который я сейчас использую:

Sub PasteSpecialAndRemoveDups()
 Application.ScreenUpdating = False
    Cells.Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("1_Vendor_Upload").Select
    Cells.Select
    Range("A:D").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("2_Lines").Select
    Cells.Select
    Range("A:C").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("3_Parts_Info_Brand").Select
    Cells.Select
    Range("A:B").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("4_Vendor_Brand").Select
    Cells.Select
    Range("A:B").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("5_Product_Line_Catalog_Type").Select
    Cells.Select
   Range("A:B").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("6_Product_Lines_Catalog").Select
    Cells.Select
    Range("A:F").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("7_Vendor_Catalogs").Select
    Cells.Select
    Range("A:B").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("8_Vendor_Users").Select
    Cells.Select
    Range("A:B").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("9_Parts").Select
    Cells.Select
    Range("A:P").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("1_Vendor_Upload").Select
    Application.CutCopyMode = False
    Cells.Select
    Sheets("1_Vendor_Upload").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3, 4), Header:=xlYes
    Sheets("2_Lines").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes
    Sheets("3_Parts_Info_Brand").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    Sheets("4_Vendor_Brand").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    Sheets("5_Product_Line_Catalog_Type").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    Sheets("6_Product_Lines_Catalog").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6), Header:=xlYes
    Sheets("7_Vendor_Catalogs").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    Sheets("8_Vendor_Users").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    Sheets("9_Parts").Select
    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, _
        7, 8, 9, 10, 11, 12, 13, 14, 15, 16), Header:=xlYes
        Application.ScreenUpdating = True
        MsgBox "Done"
End Sub

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Я бы просмотрел каждый лист и проверил # N / A, а затем продолжил бы, если это возможно.

Sub PasteSpecialAndRemoveDups() 
Dim sSheetsWithErrors As String
sSheetsWithErrors = vbNullString

If Application.WorksheetFunction.IsNA(Sheets("1_Vendor_Upload").Cells.Value) Then
    sSheetsWithErrors = sSheetsWithErrors & ", "
End If
'Continue for each sheet

If Len(sSheetsWithErrors) > 0 Then
    sSheetsWithErrors = Left(sSheetsWithErrors, Len(sSheetsWithErrors) - 2) 'Remove trailing comma...
    MsgBox "There were errors found on the following sheets:" & vbCr & sSheetsWithErrors 'customize as desired
Else
'The rest of your Sub goes here
End If

End Sub

Также, используя Thing.Select, тогда Selection.DoStuff медленнее и громоздче.То же самое обычно можно сделать, прыгнув прямо на Thing.DoStuff.Если вам нужно сделать более одного шага DoStuff, попробуйте:

With Thing
    .DoStuff1
    .DoStuff2
End With
2 голосов
/ 07 марта 2012

Это должно сделать это без IsNA:

Function FindNA() As Boolean

    Dim sht As Worksheet

        For Each sht In Application.Worksheets

        If Application.WorksheetFunction.CountIf(sht.Range("A:Z"), "#N/A") > 0 Then
            FindNA = True
            Exit Function
        End If

        Next

        FindNA = False

End Function

Затем вы можете просто вызвать эту проверку перед продолжением работы с вашим кодом, если оно истинно, затем выйти, если оно ложно, продолжить.Например,

If FindNA then
    'Don't continue
Else
    'Continue
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...