方案:我正在尝试打开工作簿,将数据从中获取到数组中,关闭它,然后将其传递到我的活动工作簿的选定工作表。
问题:我已经尝试过直接循环和调整大小(从我看到的其他帖子和网络上看,这些似乎是更好的解决方案),但我仍然得到同样的错误:< / 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
两者都会导致相同的错误。
问题:关于我在这里做错了什么想法?
答案 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)
提取的文件名必须包含文件扩展名。