Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Добро пожаловать на 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