将另一个工作簿中的数组粘贴到活动工作簿中

时间:2018-01-09 13:48:33

标签: excel vba excel-vba

方案:我正在尝试打开工作簿,将数据从中获取到数组中,关闭它,然后将其传递到我的活动工作簿的选定工作表。

问题:我已经尝试过直接循环和调整大小(从我看到的其他帖子和网络上看,这些似乎是更好的解决方案),但我仍然得到同样的错误:< / p>

  

应用程序定义或对象定义错误。

代码:

Sub BT_CA_ADJ()

Dim wbpath,  bidp_name As String
Dim wb, tabb As Workbook

Dim inpb As Variant

wbpath = ThisWorkbook.Path

ThisWorkbook.Activate
Set wb = ActiveWorkbook


b_name = wb.Sheets("Instructions").Cells(4, 3)


Set tabb = Workbooks.Open(wbpath & "\" & b_name)

    inpb = tabb.Sheets(1).UsedRange


tabb.Close True


For i = 1 To UBound(inpb, 1)
    For j = 1 To UBound(inpb, 2)
        wb.Sheets("B").Cells(i + 2, j + 2).Value = inpb(i, j)

    Next j
Next i

' I also tried:
wb.Worksheets("B").[A1].Resize(UBound(inpb, 1), UBound(inpb, 2)) = inpb

两者都会导致相同的错误。

问题:关于我在这里做错了什么想法?

2 个答案:

答案 0 :(得分:2)

首先,您要将wb变量声明为Variant类型,而不是Workbook类型。如果你想在同一行中将声明串起来,你必须这样做:

Dim wb as Workbook, tabb as Workbook

否则VBA会自动将未声明的变量指定为Variant类型,该类型不知道如何处理Workbook类型的对象范围。

您的其他string声明也是如此,但Variant类型确实知道如何处理string类型,因此您不会从中获取任何错误,但是它分配了更多的内存,因为Variant类型必须考虑几种不同的类型,而不是一种特定的类型。

答案 1 :(得分:2)

您的代码中存在许多不完整之处,我已在下面的代码中进行了更正。

Sub BT_CA_ADJ()

    Dim wbpath As String, bidp_name As String
    Dim wb As Workbook, tabb As Workbook
    Dim inpb As Variant

    wbpath = ThisWorkbook.Path

'    ThisWorkbook.Activate
    Set wb = ThisWorkbook
    bidp_name = wb.Sheets("Instructions").Cells(4, 3).Value

    Set tabb = Workbooks.Open(wbpath & "\" & bidp_name)
    inpb = tabb.Sheets(1).UsedRange.Value
    tabb.Close False

'    For i = 1 To UBound(inpb, 1)
'        For j = 1 To UBound(inpb, 2)
'            wb.Sheets("B").Cells(i + 2, j + 2).Value = inpb(i, j)
'
'        Next j
'    Next i

' I also tried:
    wb.Worksheets("B").Cells(1, 1).Resize(UBound(inpb, 1), UBound(inpb, 2)) = inpb
End Sub

有三个主要错误。一个是您没有在代码表的顶部指定Option Explicit。因此,您可以使用具有不可预测效果的未声明变量。 二,任何未声明为其他变量的变量都被假定为变体。例如,Dim wb, tabb As Workbook未将wb声明为工作簿。 三个不要将范围与范围的值混淆。 Value是默认属性。大多数情况下,除了让自己感到困惑之外,你可以省略它并没有任何不良影响。但是,变量可以是 - 值或范围。因此,如果您没有指定您的意思,那么您必须使用Excel的最佳猜测生活(或死亡),即使该猜测导致错误。 纠正明显的错误并不意味着代码现在有效。它可能。我一直无法测试。但请注意,您从Cells(4, 3)提取的文件名必须包含文件扩展名。