VBA 错误 1004,源文件变为只读
VBA error 1004 and source file become read only
我正在尝试将 excel 文件的两页("SYN" 和 "STR")读取到两个不同的数组中。
代码非常简单,如果我只需要一页就可以正常工作:
Sub recap()
Dim wb As Workbook
Dim fpath As String
fpath = Application.ActiveProject.Path & "\Suivi d'études.xlsm"
'(this is the file I want to read in the same folder)
Set wb = Workbooks.Open(fpath, True, False)
Dim rng1 As Range
Dim i, j As Integer
i = wb.Worksheets("STR").UsedRange.Rows.Count
j = wb.Worksheets("STR").Columns.Count
Set rng1 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
Dim data2(), data1() As Variant
data1() = rng1
wb.Close
Debug.Print (data1(10, 10))
End Sub
它工作得很好。
然后我整合了第二页。
Sub recap()
Dim wb As Workbook 'Need Microsoft Excel 16.0 Object Library
Dim fpath As String
fpath = Application.ActiveProject.Path & "\Suivi d'études.xlsm"
Set wb = Workbooks.Open(fpath, True, False)
Dim rng1, rng2 As Range
Dim i, j, a, b As Integer
a = wb.Worksheets("SYN").UsedRange.Rows.Count
b = wb.Worksheets("SYN").Columns.Count
i = wb.Worksheets("STR").UsedRange.Rows.Count
j = wb.Worksheets("STR").Columns.Count
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
Set rng2 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
Dim data2(), data1() As Variant
data1() = rng1
data2() = rng2
wb.Close
Debug.Print (data2(10, 10))
End Sub
不仅在范围设置行给我1004错误:set rng1 = blablabla,而且由于代码没有完全执行,输入的excel文件还在"open"代码,它变成了一个只读文件。
所以我的问题是:
1.这可能会导致这个错误,为什么他们不能读取数组中的第二页?
2. 如果没有执行wb.close,如何强制输入文件为"close"?
这里的问题是如何定义变量。在你的第一个代码中你做了:
Dim rng1 As Range
'
'
'
Set rng1 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
因为rng1
已经创建为Range Object
,是的,你需要设置成Set
。
在你的第二个代码中你做了:
Dim rng1, rng2 As Range
'
'
'
'
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
Set rng2 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
请注意,只有 rng2
被定义为 Range Object
。变量 rng1
被定义为 Variant
,当您未指定类型时 VBA 中的默认选项。
所以 VBA 认为 rng1
是一个 Variant
然后你稍后做:
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
这会引发错误,因为 Set
只能与对象一起使用。
VBA,因为 rng1
已被定义为 Variant
,需要这样的行:
rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
这意味着您将该范围内的所有这些值放入名为 rng1
的 二维 数组中。您不想这样做,但这解释了为什么 VBA 会引发该错误。
解决方法非常简单。只需定义 always 您正在使用的 variables/objects 类型。
行 Dim rng1 as Range, rng2 As Range
应该可以解决您的问题。始终正确声明所有变量。
希望对您有所帮助。
我正在尝试将 excel 文件的两页("SYN" 和 "STR")读取到两个不同的数组中。
代码非常简单,如果我只需要一页就可以正常工作:
Sub recap()
Dim wb As Workbook
Dim fpath As String
fpath = Application.ActiveProject.Path & "\Suivi d'études.xlsm"
'(this is the file I want to read in the same folder)
Set wb = Workbooks.Open(fpath, True, False)
Dim rng1 As Range
Dim i, j As Integer
i = wb.Worksheets("STR").UsedRange.Rows.Count
j = wb.Worksheets("STR").Columns.Count
Set rng1 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
Dim data2(), data1() As Variant
data1() = rng1
wb.Close
Debug.Print (data1(10, 10))
End Sub
它工作得很好。 然后我整合了第二页。
Sub recap()
Dim wb As Workbook 'Need Microsoft Excel 16.0 Object Library
Dim fpath As String
fpath = Application.ActiveProject.Path & "\Suivi d'études.xlsm"
Set wb = Workbooks.Open(fpath, True, False)
Dim rng1, rng2 As Range
Dim i, j, a, b As Integer
a = wb.Worksheets("SYN").UsedRange.Rows.Count
b = wb.Worksheets("SYN").Columns.Count
i = wb.Worksheets("STR").UsedRange.Rows.Count
j = wb.Worksheets("STR").Columns.Count
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
Set rng2 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
Dim data2(), data1() As Variant
data1() = rng1
data2() = rng2
wb.Close
Debug.Print (data2(10, 10))
End Sub
不仅在范围设置行给我1004错误:set rng1 = blablabla,而且由于代码没有完全执行,输入的excel文件还在"open"代码,它变成了一个只读文件。
所以我的问题是: 1.这可能会导致这个错误,为什么他们不能读取数组中的第二页? 2. 如果没有执行wb.close,如何强制输入文件为"close"?
这里的问题是如何定义变量。在你的第一个代码中你做了:
Dim rng1 As Range
'
'
'
Set rng1 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
因为rng1
已经创建为Range Object
,是的,你需要设置成Set
。
在你的第二个代码中你做了:
Dim rng1, rng2 As Range
'
'
'
'
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
Set rng2 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
请注意,只有 rng2
被定义为 Range Object
。变量 rng1
被定义为 Variant
,当您未指定类型时 VBA 中的默认选项。
所以 VBA 认为 rng1
是一个 Variant
然后你稍后做:
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
这会引发错误,因为 Set
只能与对象一起使用。
VBA,因为 rng1
已被定义为 Variant
,需要这样的行:
rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
这意味着您将该范围内的所有这些值放入名为 rng1
的 二维 数组中。您不想这样做,但这解释了为什么 VBA 会引发该错误。
解决方法非常简单。只需定义 always 您正在使用的 variables/objects 类型。
行 Dim rng1 as Range, rng2 As Range
应该可以解决您的问题。始终正确声明所有变量。
希望对您有所帮助。