2-DRange - >数组 - >使用UDF Excel 2007 VBA的2D范围

时间:2013-04-05 19:41:38

标签: arrays vba resize range user-defined-functions

我正在尝试创建一个将2D-Range作为输入的UDF,调整其大小,调整其中一个值并将新的2D-Range作为输出。将Range作为输出很重要,因为范围将用于其他功能。不幸的是,其他功能无法将新的2D范围识别为范围。


Function Func1(Structure As Range) As Variant

i = 3
Dim temp1 As Range
Dim temp2 As Range
Set temp1 = Structure.Resize(i, 3)

Dim arr1()
ReDim arr1(1 To i, 1 To 3)
arr1 = temp1
arr1(2, 2) = 100

Func1 = arr1

End Function

Function Func2(InputArray)

Func2 = InputArray.Rows.Count

End Function

所以 - 函数Func2(Func1(结构))不起作用。它应该在新的2D范围中给出行数。

有人会帮忙吗?

我正在使用Excel 2007

1 个答案:

答案 0 :(得分:0)

Tim Williams和KazJaw是正确的,你可以考虑使用另一种方法。但是,我有一个可能的解决方案,代码如下。请注意,这种方法很慢,您必须严格处理异常处理。

Option Explicit

Function Func1(Structure As Range) As Range
    Dim TempWs As Worksheet 'Needed to create a range
    Dim temp1 As Range      'Resized input range
    Dim temp2 As Range      'Why is this needed?
    Dim arr1 As Range       'Range to be returned
    Dim i As Integer        '?

    'Add a temporary worksheet to the end
    Set TempWs = ThisWorkbook.Worksheets.Add(, _
        ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
    i = 3

    Set temp1 = Structure.Resize(i, 3)

    With TempWs

        'Set the temporary range and get the existing values
        Set arr1 = TempWs.Range(.Cells(1, 1), .Cells(i, 3))
    End With

    arr1.Value = temp1.Value

    arr1(2, 2) = 100

    Set Func1 = arr1

    'clean up
    Set temp1 = Nothing
    Set temp2 = Nothing
    Set arr1 = Nothing
    Set TempWs = Nothing

End Function


Sub test()
    Dim GetRange As Range
    Set GetRange = Func1(Range("A1:C3"))
    ThisWorkbook.Worksheets(1).Range("D1:F3").Value = GetRange.Value

    'You need to delete the temporary worksheet
    Application.DisplayAlerts = False
    GetRange.Worksheet.Delete
    Application.DisplayAlerts = True
    Set GetRange = Nothing
End Sub