Передача массива в подпрограмму VBA - PullRequest
0 голосов
/ 31 августа 2018

Я работаю над макросом для Excel и имею подпрограмму, которая передает массив в другую подпрограмму, но я продолжаю получать

Ошибка времени выполнения '9'

Индекс вне диапазона

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

'Main Driver
Sub Main()
    WorkbookSize = size() 'Run function to get workbook size
    newbook = False
    Call create            'Run sub to create new workbook
    Call pull(WorkbookSize)              'Run sub to pull data
End Sub

'Get size of Worksheet
Function size() As Integer
    size = Cells(Rows.Count, "A").End(xlUp).Row
End Function

'Create workbook
Sub create()
    Dim wb As Workbook
    Set wb = Workbooks.Add
    TempPath = Environ("temp")
    With wb
        .SaveAs Filename:=TempPath & "EDX.xlsm" _
        , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

        .ChangeFileAccess Mode:=xlReadOnly, WritePassword:="admin"
    End With
End Sub

'pull data
Sub pull(size)
    Dim code() As Variant
    For i = 1 To size
    'Check code column fo IN and Doctype column for 810
        If Cells(i, 18).Value = "IN" Then
            code(i) = Cells(i, 18).Value 'store in array
        End If
    Next i
     Call push(code)
End Sub

'push data to new workbook
Sub push(ByRef code() As Variant)
    activeBook = "TempEDX.xlsm"
    Workbooks(activeBook).Activate 'set new workbook as active book
    For i = 1 To UBound(code)   ' <---here is where the error is referencing
        Cells(i, 1).Value = code(i)
    Next i
End Sub

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я добавлю эти другие пункты

Вы также работаете со строками, но у вас есть Integer в качестве возврата для функции, рискующей переполнением например

Function size() As Integer

Изменить на Long.

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

1011 * Е.Г. *

Public Function size(ByVal ws As Worksheet) As Long
    With ws
        size = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
End Function

Как уже упоминалось, поместите Option Explicit вверху вашего кода и объявите все свои переменные.

0 голосов
/ 31 августа 2018

Ваша проблема в том, что вы неправильно инициализируете массив кода.

Сделайте это, используя Redim См. Модификацию ниже:

    'pull data
    Sub pull(size)
        Dim code() As Variant
        Redim code(size-1)  '<----add this here minus 1 because 0 index array
        For i = 1 To size
        'Check code column fo IN and Doctype column for 810
            If Cells(i, 18).Value = "IN" Then
                code(i-1) = Cells(i, 18).Value 'store in array subtract 1 for 0 index array
            End If
        Next i
         Call push(code)
    End Sub

Кроме того, вам необходимо обновить код метода Push, чтобы он соответствовал 0-индексированному массиву

'push data to new workbook
Sub push(ByRef code() As Variant)
    activeBook = "TempEDX.xlsm"
    Workbooks(activeBook).Activate 'set new workbook as active book
    For i = 0 To UBound(code)   ' <0 to ubound
        Cells(i+1, 1).Value = code(i) 'add 1 to i for the cells reference
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...