Ошибка VBA 1004 и исходный файл становятся только для чтения - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь прочитать две страницы ("SYN" и "STR") файла Excel в двух разных массивах.

код очень прост, и он прекрасно работает, если мне нужна только одна страница:

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 по-прежнему «открыт» в коде, это стало файлом только для чтения.

Итак, мои вопросы: 1. что может вызвать эту ошибку, почему они не могут прочитать вторую страницу в массиве? 2. как заставить входной файл «закрыться», если wb.close не был выполнен?

1 Ответ

0 голосов
/ 17 февраля 2020

Проблема в том, как вы определяете свои переменные. В своем первом коде вы сделали:

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 вызывает эту ошибку.

Решение действительно простое. Просто определите всегда , какой тип переменных / объектов вы используете.

Линия Dim rng1 as Range, rng2 As Range должна решить вашу проблему. Всегда объявляйте правильно все ваши переменные.

Надеюсь, это поможет.

...