首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组传递给子例程VBA

将数组传递给子例程VBA
EN

Stack Overflow用户
提问于 2018-08-31 14:23:33
回答 2查看 7.9K关注 0票数 0

我正在为excel编写宏,并有一个子子将数组传递给另一个子子,但我一直得到

运行时错误“9” 下标超出范围

下面是我的代码,我留下了一个注释,指出这个错误发生在哪里。我对VBA并不熟悉,所以我可能会尝试不正确地传递数组,但不确定。

代码语言:javascript
复制
'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

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-31 14:30:53

您的问题是没有正确初始化代码数组。

使用Redim执行此操作请参见下面的修改:

代码语言:javascript
复制
    '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索引数组。

代码语言:javascript
复制
'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
票数 2
EN

Stack Overflow用户

发布于 2018-08-31 14:34:48

我将补充以下几点

您还在处理行,但将Integer作为函数的返回,以避免溢出。

代码语言:javascript
复制
Function size() As Integer

更改为Long

您有很多隐式的活动表引用。把这些都扔掉,给父母一张纸。例如,您可以在一个名为ws的变量中设置工作表,如果需要,可以将其作为参数传递。

例如。

代码语言:javascript
复制
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放在代码的顶部,并声明所有变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52117514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档