Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
如何将范围复制到临时工作簿中,并使用vba函数返回对它的引用?_Vba_Excel - Fatal编程技术网

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

如何将范围复制到临时工作簿中,并使用vba函数返回对它的引用?,vba,excel,Vba,Excel,我在“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 S

我在“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
注意:此函数用于其他函数,不直接从单元格调用

Set rTemp = wsTemp.range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2)
这里将出现类型不匹配。。。我不确定这是否真的有意义。ubound(a,2)用于多维数组,而不是范围

我猜您希望获取指定单元格中的值,然后根据其值复制多次。对吗

希望下面能给你一个例子。如果你不编辑你的帖子,我会看看是否能帮上忙

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
函数CreateTempRange(rSource作为范围)作为范围
“”声明
调暗rTemp作为范围
Dim vaTemp作为变体
Dim wsTemp作为工作表
将wbTemp设置为工作簿
“”打开临时工作表
设置wbTemp=工作簿。添加
设置wsTemp=wbTemp.Worksheets.Add
“”将范围复制到其中并获取对临时范围的引用
vaTemp=rSource.Value
''设置rTemp=wsTemp.Range(“A1”).调整大小(UBound(vaTemp,1),UBound(vaTemp,2))
Dim iTemp作为整数
出错时继续下一步
项目P=CInt(vaTemp)
错误转到0
如果项目P<1,则
iTemp=1
如果结束
设置rTemp=wsTemp.Range(“A1:A”和项目P)
rTemp.Value=vaTemp
“”返回临时范围
设置CreateTempRange=rTemp
端函数
子测试()
调光范围
Dim x As范围
设置r=ActiveSheet.Range(“A1”)
设置x=CreateTempRange(r)
端接头
由于未将
RangeValueDataType
参数指定给Range对象的Value方法,因此它将默认为
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来负偏移此范围,以便最终生成的引用从单元格A1开始,并保持与源范围相同的维度


希望这能有所帮助。

迪诺,这段代码对我来说很有用。您得到的错误是什么?

我仍然在该行中得到类型不匹配。这对你有用吗?在Excel 2003中对我有用我的范围将是一个表而不是一个维度。我只想将范围(行和列)复制到临时工作表中,并返回对它的引用。啊,我很困惑您想要什么。我猜这与你的其他一些问题有关。你可以发布一个问题,详细说明你想用这个临时表实现什么,我会看看我是否能做一些更有用的东西。当逐步完成代码时,执行会在有问题的行上停止。嘎!我想我明白了。我从另一个函数中调用这个函数。允许这样做吗?当编写测试子组件时,它工作得很好。从函数调用它应该不会有问题<代码>函数TestIT()Dim rng As Range Set rng=CreateTempRange(ActiveSheet.Range(“A1:C3”))TestIT=rng(2)End Function工作。您能解释一下这里到底发生了什么吗?我不理解偏移量的用法。在我的另一个公开问题中,你有一个类似的答案。我在那里评论说,在这之后,这些范围似乎共享相同的引用。这是真的吗?感谢您的帮助基本上我正在使用源范围的本地地址来获取其维度,在目标工作表上获取对等效范围的引用,并将其偏移回从单元格A1开始的位置,这将提供对粘贴数据的引用。结果引用是完全独立的。
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