Excel VBA - попытка скопировать 300 диапазонов рабочих книг в лист на основе списка пакетных файлов и получения & ldquo; сбой метода Pastespecial класса диапазона & rdquo; ошибка

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

1
задан jstim 10 April 2019 в 19:46
поделиться

1 ответ

Добро пожаловать на SO. Не удалось понять, почему приложение New Excel используется для открытия исходных файлов. Настройка Application.ScreenUpdating = False может быть легко использована, чтобы сделать исходный файл практически невидимым. Цель приложения Ожидание также неясно.

Пробовал несколько раз с измененным кодом для 300 циклов и диапазоном данных около 250 X 15 ячеек (с повторным открытием и закрытием только одного исходного файла для ознакомительной цели) и занимает всего около 3 минут для выполнения задачи успешно.

Sub ImportDataFromList()
Dim wsActive As Worksheet
Dim wbImport As Workbook
Dim wsCalc As Worksheet
Dim Fname As String, Rw As Long, sSht As String, sRng As String, Trng As String
Dim srcRng As Range, TrgRng As Range
'Dim Tm As Double

Set wsActive = ThisWorkbook.Sheets("data1")
Set wsCalc = ThisWorkbook.Sheets("calc_page")
'Tm = MicroTimer()

Application.ScreenUpdating = False
For Rw = 5 To 305
Fname = wsCalc.Range("C" & Rw) ' Source File Name4
sSht = wsCalc.Range("D" & Rw)  ' Source Sheet name
sRng = wsCalc.Range("E" & Rw)  ' Source Range
Trng = wsCalc.Range("F" & Rw)  ' Target Range.(Only Top Left cell address is used for trial. later resized to the source range)

Set wbImport = Workbooks.Open(Filename:=Fname, UpdateLinks:=True, ReadOnly:=True)
Set srcRng = wbImport.Worksheets(sSht).Range(sRng)
Set TrgRng = wsActive.Range(Trng)
Set TrgRng = TrgRng.Resize(srcRng.Rows.Count, srcRng.Columns.Count)
TrgRng.Cells.Value = srcRng.Cells.Value
wbImport.Close SaveChanges:=False
Next

'Tm = MicroTimer() - Tm
Application.ScreenUpdating = True
'Debug.Print Tm
End Sub
0
ответ дан Ahmed AU 10 April 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: