Использование закрытой функции внутри Sub создает нижние индексы вне диапазона? - PullRequest
0 голосов
/ 13 февраля 2020

Итак, у меня есть макрос, который сравнивает две рабочие книги и удаляет любые похожие записи в рабочей книге, в которой выполняется макрос, но в конце у меня есть частная функция, которая запускается для сортировки второго листа содержимого рабочей книги. Когда я сам запускаю функцию, она работает нормально, выполняя и сортируя таблицу без проблем, однако, когда я запускаю ее в самом макросе, она возвращает следующее:

Ошибка времени выполнения '9': Индекс вне диапазона

Sub CheckReadyBoard()
    Dim I, J, total, fRow As Integer
    Dim found As Range


    'SP = SharePoint List, SPS = SharePoint Sheet
    'Filter by Dept then Machine
    '
    Dim SP As Workbook
    Dim SPS As Worksheet
    Set SP = Workbooks.Open(get_user_specified_filepath())
    Set SPS = SP.Sheets(1)
    Set HSheet = ThisWorkbook.Sheets("Building Parts")
    ' Remove Anything from Readyboard and NOT Ready for T
    HBLR = HSheet.Range("A" & Rows.Count).End(xlUp).Row
    RBLR = SPS.Range("A" & Rows.Count).End(xlUp).Row

    For I = 2 To HBLR
        answer1 = HSheet.Range("I" & I).Value
        Set found = SPS.Columns("G:G").Find(what:=answer1) 'finds a match
        If found Is Nothing Then
            'Leave Line w/ Nothing so it will pass this line
        Else
            HSheet.Range("I" & I).EntireRow.Delete
        End If
    Next I
    'Application.ScreenUpdating = False
    'Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    'Application.ScreenUpdating = True
    Sort2
    SP.Close

End Sub



Private Function Sort2()
    Set HSheet = ThisWorkbook.Sheets("Building Parts")
    HBLR = HSheet.Range("A" & Rows.Count).End(xlUp).Row
    Worksheets("Building Parts").Activate

    With Range(Columns("A"), Columns("I"))
        .Sort key1:=Columns("A"), Order1:=xlDescending, Header:=xlNo
        .Sort key1:=Columns("B"), Order1:=xlDescending, Header:=xlNo
    End With
End Function

Когда я нажимаю кнопку отладки, это выделяет Worksheets("Building Parts").Activate Я не очень хорошо разбираюсь в VBA, поэтому я не уверен, что мой синтаксис плох или мой Мне нужно немного отредактировать где-нибудь ..

Информация, которая может быть важна:

1) Моя рабочая тетрадь содержит два листа. Лист 1 имеет кнопки для запуска макросов, а лист 2 содержит данные.

2) Добавление Worksheets("Building Parts").Activate сделало сортировку работающей самостоятельно, ранее она не работала сама по себе или в макросе.

1 Ответ

1 голос
/ 13 февраля 2020

Наряду с моими предложениями и SJR, и BigBen вы можете попробовать это:

Option Explicit
Sub CheckReadyBoard()

    'Dim J, total, fRow As Integer you are not using any variable here

    'SP = SharePoint List, SPS = SharePoint Sheet
    'Filter by Dept then Machine
    '
    Dim SP As Workbook
    Set SP = Workbooks.Open(get_user_specified_filepath())
    Dim SPS As Worksheet
    Set SPS = SP.Sheets(1)
    Dim HSheet As Worksheet
    Set HSheet = ThisWorkbook.Sheets("Building Parts")
    ' Remove Anything from Readyboard and NOT Ready for T
    Dim HBLR As Long
    HBLR = HSheet.Range("A" & Rows.Count).End(xlUp).Row
    Dim RBLR As Long
    RBLR = SPS.Range("A" & Rows.Count).End(xlUp).Row

    'Declare your variable next to their assign line
    Dim I As Long
    Dim answer1 As String
    Dim found As Range
    For I = 2 To HBLR
        answer1 = HSheet.Range("I" & I).Value
        Set found = SPS.Columns("G:G").Find(what:=answer1) 'finds a match

        'The logic here is telling excel to delete the row if a match is found
        If found Is Nothing Then
            'Leave Line w/ Nothing so it will pass this line
        Else
            HSheet.Range("I" & I).EntireRow.Delete
        End If
        'You can change the logic to only keep a single line:
        If Not found Is Nothing Then HSheet.Range("I" & I).EntireRow.Delete
    Next I
    'Application.ScreenUpdating = False
    'Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    'Application.ScreenUpdating = True
    Sort2
    SP.Close

End Sub
Private Sub Sort2()
    Set HSheet = ThisWorkbook.Sheets("Building Parts")
    HBLR = HSheet.Range("A" & Rows.Count).End(xlUp).Row
    'Worksheets("Building Parts").Activate there is no need to activate
    'Besides your error comes here, when you open a workbook, the SP workbook,
    'it goes to the focus, so the active workbook here is SP, not thisworkbook.

    'Fully qualify your ranges so you don't need to activate nor workbooks or sheets.
    With HSheet.Range("A:I")
        .Sort key1:=.Columns("A"), Order1:=xlDescending, Header:=xlNo
        .Sort key1:=.Columns("B"), Order1:=xlDescending, Header:=xlNo
    End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...