Ошибка времени выполнения, возникающая при запуске скопированного макроса в новой книге - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть макрос, который отлично работает на одной книге, но выдает «Несоответствие типов ошибки времени выполнения 13», когда я скопировал его в новую рабочую книгу.

Функция макросачтобы прочитать список значений и создать новый список, исключая строки, которые были указаны в коде.
Набор данных, с которым я пытаюсь работать, находится в B96: B110, и мне нужно разместить результатыв списке, начинающемся в ячейке C96.

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

Option Explicit

Private Sub compileList()


Dim arr(), i As Long, list As Object
Dim exclusions(), found As Boolean, j As Long

exclusions = Array("examplestring1", "examplestring2", "(examplestring3)", "Example String 4")

With Worksheets("somemacros")

    arr = .Range("B96:B110" & .Cells(.Rows.count, "B").End(xlUp).Row).Value


    Set list = CreateObject("System.Collections.ArrayList")
    For i = LBound(arr, 1) To UBound(arr, 1)
        found = False
        With list
            For j = LBound(exclusions) To UBound(exclusions)
                If InStr(arr(i, 1), exclusions(j)) > 0 Then
                   found = True
                   Exit For
                End If
            Next
            If Not found Then .Add arr(i, 1)
        End With
    Next i

    .Range("C96").Resize(list.count, 1) = Application.WorksheetFunction.Transpose(list.ToArray)

End With

End Sub

В исходной книге код работает нормально, однако, когда я пытаюсь выполнить код в новой книге, появляется сообщение об ошибке со ссылкой на следующий фрагмент кода:

Application.WorksheetFunction.Transpose(list.ToArray)

Я уже без проблем скопировал несколько макросов в разные рабочие книги, и, насколько я понимаю, возникает ошибка несоответствия типов, когда типы данных не совпадаютправильно, я совершенно заблудился из-за того, как здесь возникло несоответствие, поэтому, если кто-нибудь сможет объяснить этому новобранцу причину этой проблемы, чтобы он мог избежать этого в будущем, это было бы очень признательно.

Если я пропустил какую-либо важную информацию, пожалуйста, дайте мне знать.

Большое спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Одной из проблем является следующая строка:

arr = .Range("B96:B110" & .Cells(.Rows.count, "B").End(xlUp).Row).Value

Если желаемый диапазон является жестко заданным значением B96: B110, то можно использовать следующий код:

arr = .Range("B96:B110").Value

Еслитребуемый диапазон должен начинаться с B96 и идти до последней строки с данными, а затем использовать:

arr = .Range("B96:B" & .Cells(.Rows.count, "B").End(xlUp).Row).Value

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


Пояснение


Этот разделкода: .Cells(.Rows.count, "B").End(xlUp).Row, находит последнюю строку с данными в столбце B. Если эта последняя строка равна 2, то она возвращает 2, если 3 возвращает 3 и т. д.

Когда этот код используется следующим образом:

arr = .Range("B96:B110" & .Cells(.Rows.count, "B").End(xlUp).Row).Value

Добавляет номер последней строки в конец адреса строки.Например, если последняя строка с данными равна 2, то диапазон просматривается от ячеек B96 до B1102.Если последний ряд равен 97, то последний рассматриваемый диапазон - от B96 до B11097 (11 тысяч 97).Предполагая, что последняя строка с данными на вашем листе составляет не менее сотен, конечный диапазон будет от B96 до как минимум B110100 (это более ста десяти тысяч, более десятой части миллиона).

Это много клеток, ведущих к очень большому массиву.Неудивительно, что функция .Transpose имеет проблемы.

...