如何将范围复制到临时工作簿并使用vba函数返回对其的引用?

我在“rTemp.Value = vaTemp”行有以下哪些错误。 我在这里做错了什么? 我在正确的轨道上?

Function CreateTempRange(rSource As range) As range ' Declarations Dim rTemp As range Dim vaTemp As Variant Dim wsTemp As Worksheet Dim wbTemp As Workbook ' Open temp worksheet Set wbTemp = Workbooks.Add Set wsTemp = wbTemp.Worksheets.Add ' Copy range into it and get a reference to the temp range vaTemp = rSource.Value Set rTemp = wsTemp.range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2)) rTemp.Value = vaTemp ' Return the temp range Set CreateTempRange = rTemp End Function 

注意:此function旨在供其他function使用,不能直接从单元中调用。

 Set rTemp = wsTemp.range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2) 

这里会出现types不匹配的情况……我不确定这是否有意义。 ubound(a,2)用于multidimensional array而不是范围。

我猜你想要指定的单元格中的值,然后根据它的值复制多次。 那是对的吗?

希望以下应该给你一个例子来处理。 如果不是编辑你的文章,我会看看我是否可以帮忙。

 Function CreateTempRange(rSource As Range) As Range '' Declarations Dim rTemp As Range Dim vaTemp As Variant Dim wsTemp As Worksheet Dim wbTemp As Workbook '' Open temp worksheet Set wbTemp = Workbooks.Add Set wsTemp = wbTemp.Worksheets.Add '' Copy range into it and get a reference to the temp range vaTemp = rSource.Value ''Set rTemp = wsTemp.Range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2)) Dim iTemp As Integer On Error Resume Next iTemp = CInt(vaTemp) On Error GoTo 0 If iTemp < 1 Then iTemp = 1 End If Set rTemp = wsTemp.Range("A1:A" & iTemp) rTemp.Value = vaTemp '' Return the temp range Set CreateTempRange = rTemp End Function Sub test() Dim r As Range Dim x As Range Set r = ActiveSheet.Range("A1") Set x = CreateTempRange(r) End Sub 
 vaTemp = rSource.Value 

由于您没有为Range对象的Value方法指定RangeValueDataType参数,因此它将默认为xlRangeValueDefault ,对于非空范围,它将返回一个值数组。 因此, UBound(..., 1)UBound(..., 2)部分是有意义的。

这会更容易:

 Function CreateTempRange(rSource As range) As range ' Declarations Dim rTemp As range Dim wsTemp As Worksheet Dim wbTemp As Workbook ' Open temp worksheet Set wbTemp = Workbooks.Add Set wsTemp = wbTemp.Worksheets.Add ' Create new range on that sheet starting at cell A1 Set rTemp = wsTemp.Range(Cells(1, 1), Cells(rSource.Rows.Count, _ rSource.Columns.Count)) rTemp.Value = rSource.Value ' Return the temp range Set CreateTempRange = rTemp End Function 

你仍然需要一些代码来处理由多个区域组成的范围(使用Areas.Count属性来检查)

我会这样做

 Function CreateTempRange(src As Range) As Range Dim wbk As Workbook: Set wbk = Workbooks.Add Dim sht As Worksheet: Set sht = wbk.Worksheets.Add Call src.Copy(sht.Cells(1, 1)) Set CreateTempRange = Range(rSource.Address).Offset(1 - rSource.Row, 1 - rSource.Column) End Function 

最后一行代码的说明(按要求): –

Range(rSource.Address) – 这是指当前工作表(包含代码)与源范围具有相同本地地址的范围,所以如果源范围是“工作表X”上的C3:E5,则Range(rSource.Address)是指当前工作表上的C3:E5。

由于我们将复制的范围粘贴到单元格A1而不是单元格C3(我假定这是您的要求)的当前表单中,因此我们需要相应地抵消该引用。 .Offset(1 - rSource.Row, 1 - rSource.Column)将源范围的行索引(3)减1和列索引(C或3)减1,从而负.Offset(1 - rSource.Row, 1 - rSource.Column)偏移该范围,以便最终的结果参考从单元格A1开始,并保持与源范围相同的尺寸。

希望有所帮助。

Deano,那个代码对我来说是写作的。 你得到的错误是什么?