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 应该可以解决您的问题。始终正确声明所有变量。

希望对您有所帮助。