Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
VBA: Копирование листа в новую книгу
 
Всем привет
У меня в эксель документе есть таблицы, которые мне нужно копировать в новый документ и сохрнать.(то есть я сгенерировал в Power Query данные) и выгружаю сохраняю как бы кеш.
Данный код работает исправно на маленьких объемах данных, а на больших иногда терминал(я работаю по RDP) зависает из-за объема копирования данных
tbl.Range.Copy - получается эта команда копирует все в буфер и переносит в новый документ.
Вопрос, есть ли оптимальней алгоритм копирования таблицы в новый документ?
Код
Sub csvTable2(lName As String, tName As String, fName As String)
    
    Dim tbl As ListObject
    Set tbl = Worksheets(lName).ListObjects(tName)
    Application.DisplayAlerts = False
    Workbooks.Add
    tbl.Range.Copy Range("A1")
    With ActiveWorkbook
      .SaveAs fName, xlCSV, local:=False
      .Saved = True
      .Close
    End With
    Application.DisplayAlerts = True
    
End Sub
 
Попробуйте заменить строчку
Код
Set tbl = Worksheets(lName).ListObjects(tName)
на
Код
Set tbl = Worksheets(lName).ListObjects(tName).usedrange

Вы сохраняете в формате CSV это текстовый файл.С текстовыми файлами Эксель быстрее работает в режиме прямого доступа. Если там есть возможность перенести копируемые данные в массив и потом в режиме прямого доступа напечатать файл методом Print.Я плохо разбираюсь с сетями. На локальном компе так можно

 
Vsevolod, по мои тестам копирование 5555 строк через массив аж на одну сотую быстрее
Скрытый текст


Код
Sub csvTable2(lName As String, tName As String, fName As String)
     
    Dim tbl As ListObject
    Set tbl = Worksheets(lName).ListObjects(tName)
    Application.DisplayAlerts = False
    Workbooks.Add

    arr1 = tbl.Range("A1").Value
    Range("A1").Value = arr1

    With ActiveWorkbook
      .SaveAs fName, xlCSV, local:=False
      .Saved = True
      .Close
    End With
    Application.DisplayAlerts = True
     
End Sub
Изменено: wfreedom - 21 фев 2021 06:46:16
 
Благодарю! wfreedom, Евгений Смирнов,

Попытался модифицировать.
В первом варианте выдает ошибку на
Set tbl = Worksheets(lName).ListObjects(tName).UsedRange

Во втором варианте на
arr1 = tbl.Range("A1").Value

Подскажите, в чем ошибся?
Тестовый пример прицепил
 
В модуле процедура csvTable0 новая
Если объет tbl залезет в массив то должно прокатить
Файл не появиться на экране он должен появиться в папке где расположен этот файл
Проверить не начем вы не дали 2 файл с которого копируете
 
Цитата
Vsevolod написал:
Подскажите, в чем ошибся?
В вашей ленивости.
Если поглядеть справку, то получится
Код
Set tbl = Worksheets(lName).ListObjects(tName)

arr1 = tbl.Range.Value
 
Евгений Смирнов, таблица очень большая( падает overflow:(

RAN, мой уровень VBA очень слаб и пытаюсь разобраться на примерах.
Как я понимаю в arr1 записался объект таблица.
Но вывод срабатывает только первой ячейки A1
Как сделать чтобы весь arr1 в новую таблицу он внес?
Благодарю
Код
arr1 = tbl.Range.Value
Range("A1").Value = arr1
 
Цитата
Vsevolod написал:
Как я понимаю в arr1 записался объект таблица.
Нет. Не объект, а ЗНАЧЕНИЯ ячеек, входящих в таблицу.
Для того, чтобы массив выгрузить в диапазон, размер диапазона должен быть равен размеру массива.
 
Код
Range("A1").Resize(UBound(arr1, 2), UBound(arr1, 1)).Value = arr1
 
Евгений Смирнов, Евгений благодарю, единственное наоборот
Range("A1").Resize(UBound(arr1, 1), UBound(arr1, 2)).Value = arr1

Благодарю всех за помощь, потестируем на больших объемах таблиц
 
Цитата
Vsevolod написал:
Копирование листа в новую книгу
Код
Sub Copy2NewBook
  Activesheet.Copy
end sub
все. активный лист скопирован в новую книгу
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, когда ты работаешь по RDP в терминале, у тебя он зависает на огромных таблицах. Потому что буфер обмена прилетает по RDP

Поэтому от copy отказываемся на больших таблицах
 
а что это такое RDP и терминал?
и зачем мне в них работать???
Изменено: Ігор Гончаренко - 23 фев 2021 10:49:17
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Vsevolod
Да вы правы с размерностью ошибся.
поторопился
Страницы: 1
Читают тему (гостей: 1)
Наверх