Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays VBA—返回数组的函数,其中每个元素都是一个范围_Arrays_Vba_Range - Fatal编程技术网

Arrays VBA—返回数组的函数,其中每个元素都是一个范围

Arrays VBA—返回数组的函数,其中每个元素都是一个范围,arrays,vba,range,Arrays,Vba,Range,编辑:您可以在下面的“更正代码”下找到修订代码 我正在努力研究如何编写一个VBA函数来返回一个数组,其中数组的每个元素都是一个范围对象。理想情况下,我想知道如何编写,以便每个范围对象可以是一个不连续的单元格选择,在伪代码中,这将类似于: MyReturnedArrayoFrangeObject(1)=(A1:C3、A6、B4:B6) 我发现了这个线索: 这让我接近尾声,但我肯定是在我的函数声明中做错了什么(我想) 一堆原始代码和这个问题无关,所以它被删除了,我做了一个简单的例子,每个数组元素只返

编辑:您可以在下面的“更正代码”下找到修订代码

我正在努力研究如何编写一个VBA函数来返回一个数组,其中数组的每个元素都是一个范围对象。理想情况下,我想知道如何编写,以便每个范围对象可以是一个不连续的单元格选择,在伪代码中,这将类似于:

MyReturnedArrayoFrangeObject(1)=(A1:C3、A6、B4:B6)

我发现了这个线索: 这让我接近尾声,但我肯定是在我的函数声明中做错了什么(我想)

一堆原始代码和这个问题无关,所以它被删除了,我做了一个简单的例子,每个数组元素只返回一个单元格。当我运行此命令时,下面的代码在行中返回ByRef类型不匹配:

Set FindLastContentCell(i)=LastCell

除了下面的代码外,我还尝试将函数声明作为一个变量(没有更改)。如果我从上面显示的代码行中删除“Set”,我会得到一个“赋值左侧的函数调用必须返回Variant或Object”:

    Function FindLastContentCell(Optional WB As Workbook = Nothing, Optional JustWS As Worksheet = Nothing) As Range()

    Dim myLastRow As Long, myLastCol As Long, i As Long
    Dim wks As Worksheet
    Dim dummyRng As Range, LastCell As Range
    Dim AnyMerged As Variant
    Dim Proceed As Boolean
    Dim iResponse As Integer

    ' Initialise variables
    Set LastCell = Nothing
    i = 0

    [Bunch of extra code removed]

    If JustWS Is Nothing Then
        If WB Is Nothing Then Set WB = ActiveWorkbook
        For Each wks In WB.Worksheets

            [Bunch of extra code removed]

            If Proceed Then
                With wks
                    myLastRow = 0
                    myLastCol = 0
                    Set dummyRng = .UsedRange
                    On Error Resume Next
                    myLastRow = .Cells.Find("*", after:=.Cells(1), LookIn:=xlFormulas, LookAt:=xlWhole, _
                                searchdirection:=xlPrevious, SearchOrder:=xlByRows).row
                    myLastCol = .Cells.Find("*", after:=.Cells(1), LookIn:=xlFormulas, LookAt:=xlWhole, _
                                searchdirection:=xlPrevious, SearchOrder:=xlByColumns).Column
                End With
                On Error GoTo 0
                Set LastCell = Cells(myLastRow, myLastCol)
                ReDim Preserve FindLastContentCell(0 To i)
                Set FindLastContentCell(i) = LastCell
                i = i + 1        
            End If
        Next wks
    End If

End Function
呼叫子系统是:

Sub temp()

Call FindLastContentCell

End Sub

修正码



从您所说的,似乎您对VBA中的
数组
范围
没有太清晰的概念。这里有一个示例代码,稍微澄清了这两个问题:

Function getRandomRanges() As Range()

    Dim totRanges As Integer: totRanges = 3
    ReDim outRanges(totRanges - 1) As Range

    Set outRanges(0) = Range("A1")
    Set outRanges(1) = Range("B2:C10")
    Set outRanges(2) = Cells(2, 3)

    getRandomRanges = outRanges

End Function
您可以通过执行以下操作调用此函数:

Dim retrievedRanges() As Range
retrievedRanges = getRandomRanges
您可以以不同的方式使用
retrievedRanges
;例如:

   retrievedRanges(0).Value = "value I want to write in the A1 range"

我不确定您试图实现什么目标,但据我所知,您正在尝试使用工作簿每个工作表的最后一个单元格构建一个范围数组

我的建议是创建一个临时范围数组,并用所需的范围对象填充它,最后返回这个临时数组。现在我看到前面的答案“varocarbas”只是暗示了同样的想法

Function FindLastContentCell(Optional xlsWb As Workbook = Nothing, Optional xlsWs As Worksheet = Nothing) As Range()

    Dim myLastRow As Long, myLastCol As Long
    Dim wks As Worksheet
    Dim lastCell As Range
    Dim arrayTmp() As Range
    Dim index As Integer

    [Bunch of extra code removed]

    If xlsWb Is Nothing then
        Set xlsWb = ActiveWorkbook
    End if
    Redim arrayTemp (wks.Worksheets.Count) As Range
    For Each wks in xlsWb.Worksheets
        myLastRow = wks.UsedRange.Rows.Count
        myLastColumn = wks.UsedRange.Columns.Count
        Set lastCell = wks.Cells(myLastRow,myLastColumn)
        Set arrayTemp(index) = lastCell
        index = index + 1
    Next
    Set FindLastContentCell = arrayTemp

End Function

@简单,没问题。我回答的全部要点是帮助你更好地理解这些想法,这样你就可以修复你现在的错误,或者,更好的是,完全由你自己从头开始创建一个函数,而不是复制现有的代码。好吧,让它工作起来了,多亏了你的提示,我在那里完全疯了!显然,我不能再发布我的更正代码6个小时,我会发布它一旦它允许我。谢谢。好的,将修改后的代码编辑到原来的帖子中,希望有一天它能帮助其他人!:)@很简单,这就是我的想法。是的,这就是我最后所做的(在瓦罗卡巴斯催促我让我的大脑再次活动之后)。不过也谢谢你的回复,它很到位,你完全按照我的意思解释了我原来的帖子,谢谢!
Function FindLastContentCell(Optional xlsWb As Workbook = Nothing, Optional xlsWs As Worksheet = Nothing) As Range()

    Dim myLastRow As Long, myLastCol As Long
    Dim wks As Worksheet
    Dim lastCell As Range
    Dim arrayTmp() As Range
    Dim index As Integer

    [Bunch of extra code removed]

    If xlsWb Is Nothing then
        Set xlsWb = ActiveWorkbook
    End if
    Redim arrayTemp (wks.Worksheets.Count) As Range
    For Each wks in xlsWb.Worksheets
        myLastRow = wks.UsedRange.Rows.Count
        myLastColumn = wks.UsedRange.Columns.Count
        Set lastCell = wks.Cells(myLastRow,myLastColumn)
        Set arrayTemp(index) = lastCell
        index = index + 1
    Next
    Set FindLastContentCell = arrayTemp

End Function