В вашем коде есть некоторые недостатки. Например, когда вы назначаете lastrow, вы помещаете ячейку в последнюю строку (rows.count), а затем заканчиваете (xlDown), которая останется в последней строке. Это должно быть конец (xlUp), если вы собираетесь получить последнюю использованную строку в столбце 1. Та же проблема касается последнего столбца.
Кроме того, я не вижу, как имя файла будет меняться с каждой итерацией. Обычно я делаю следующее, если хочу перебрать список файлов в каталоге:
Dim fs, f, files, curfile
Dim i As Integer
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(path-to-folder)
Set files = f.Files
i = 5
For Each curfile In files
... whatever you need to be done with every file ...
Next
Также при вставке данных сначала нужно выбрать левый верхний угол, а затем сделать Activesheet.Paste. В этом случае:
x.Worksheets("sheet1").Cells(erow, 1).Select
ActiveSheet.Paste
Но имейте в виду, что вы закрываете источник данных, вставляемых перед фактическим вставлением, а также что на каждой итерации цикла вы открываете файл назначения (smer), что приведет к ошибке. Этот файл назначения должен быть уже открыт к началу цикла.
Надеюсь, это поможет вашей работе