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

Vba 将另一工作簿中的数组粘贴到活动工作簿中,vba,excel,Vba,Excel,场景:我正在尝试打开工作簿,将其中的数据放入数组,关闭它,然后将其传递到活动工作簿的选定工作表 问题:我已经尝试过直接循环和调整大小(从我在其他帖子和网络上看到的情况来看,这些似乎是更好的解决方案),但我仍然遇到同样的错误: 应用程序定义或对象定义错误 代码: Sub BT_CA_ADJ() Dim wbpath, bidp_name As String Dim wb, tabb As Workbook Dim inpb As Variant wbpath = ThisWorkbook.

场景:我正在尝试打开工作簿,将其中的数据放入数组,关闭它,然后将其传递到活动工作簿的选定工作表

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

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

代码:

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
两者都会导致相同的错误


问题:关于我做错了什么,你有什么想法吗?

首先,你将你的
wb
变量声明为
变量
类型,而不是
工作簿
类型。如果要在同一行中将声明串在一起,则必须按如下方式执行:

Dim wb as工作簿,tabb as工作簿

否则,VBA会自动将未声明的变量指定为
变量
类型,该类型不知道如何像
工作簿
类型那样处理一系列对象


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

首先,您将
wb
变量声明为
变量
类型,而不是
工作簿
类型。如果要在同一行中将声明串在一起,则必须按如下方式执行:

Dim wb as工作簿,tabb as工作簿

否则,VBA会自动将未声明的变量指定为
变量
类型,该类型不知道如何像
工作簿
类型那样处理一系列对象


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

您的代码中有许多不精确之处,我已在下面的代码中更正了这些不精确之处

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
有三个主要错误。一是您没有在代码表的顶部指定
选项Explicit
。因此,您可以使用未声明的变量,从而产生不可预测的效果。 第二,任何未声明为其他变量的变量都被假定为变量。例如,
Dim wb,tabb As Workbook
不会将
wb
声明为工作簿。 三、不要将范围与范围值混淆<代码>值是默认属性。大多数情况下,你可以忽略它,除了让自己困惑之外,不会产生任何不良影响。但是,变量可以是值或范围。因此,如果您没有指定您的意思是哪一个,那么您必须使用Excel的最佳猜测来生存(或死亡),即使该猜测会导致错误。
纠正了明显的错误并不意味着代码现在可以工作。可能吧。我还没能测试。但是,请记住,您从
单元格(4,3)
中选择的文件名必须包含文件扩展名。

您的代码中有许多不精确之处,我已在下面的代码中更正

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
有三个主要错误。一是您没有在代码表的顶部指定
选项Explicit
。因此,您可以使用未声明的变量,从而产生不可预测的效果。 第二,任何未声明为其他变量的变量都被假定为变量。例如,
Dim wb,tabb As Workbook
不会将
wb
声明为工作簿。 三、不要将范围与范围值混淆<代码>值是默认属性。大多数情况下,你可以忽略它,除了让自己困惑之外,不会产生任何不良影响。但是,变量可以是值或范围。因此,如果您没有指定您的意思是哪一个,那么您必须使用Excel的最佳猜测来生存(或死亡),即使该猜测会导致错误。
纠正了明显的错误并不意味着代码现在可以工作。可能吧。我还没能测试。但是,请记住,您从
单元格(4,3)
中获取的文件名必须包含文件扩展名。

错误的原因是什么?刚刚尝试了您的代码,没有任何扩展名就运行了errors@Magnetron在“wb”表(“B”)单元格(i+2,j+2)上。值=inpb(i,j)'您还可以像下面这样将整个数组复制到工作簿中:wb.Sheets(“B”).Range(单元格(1,1)、单元格(Ubound(inpb,1)、Ubound(inpb,2))=inpb好的,我发现了问题,这完全是我的错。我原始数组的第一个单元格上有一个公式。有人能解释一下为什么会产生错误吗?错误的原因是什么?只是尝试了你的代码,没有任何错误就运行了errors@Magnetron在“wb”表(“B”)单元格(i+2,j+2)上。值=inpb(i,j)'您还可以像下面这样将整个数组复制到工作簿中:wb.Sheets(“B”).Range(单元格(1,1)、单元格(Ubound(inpb,1)、Ubound(inpb,2))=inpb好的,我发现了问题,这完全是我的错。我原始数组的第一个单元格上有一个公式。有人能解释一下为什么会产生这样的结果和错误吗?如果他使用
Dim inpb()也会帮到他作为变量
并在为其赋值时使用了
.value
方法。我认为
.value
位是失败的主要原因。如果他使用
Dim inpb()作为变量
并在为其赋值时使用了
.value
方法。我认为
.value
位是失败的主要原因