Копирование определенного столбца со всех листов в новый файл

Автор d.taras, 15 октября 2024, 17:38

0 Пользователи и 1 гость просматривают эту тему.

d.taras

Доброго времени!
Помогите довести до ума макрос копирования определенного столбца (например Е) со всех листов одного файла в один лист нового файла Calc (*.ods).
C chatgpg составили следующее
Sub CopyColumnEFromAllSheets()
    Dim oDoc As Object
    Dim oSheet As Object
    Dim oNewDoc As Object
    Dim oRange As Object
    Dim oData As Variant
    Dim iRow As Long
    Dim i As Long

    oDoc = ThisComponent
    ' Создание нового файла формата ODS
    oNewDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())

    iRow = 0

    ' Проверка количества листов
    Dim totalSheets As Long
    totalSheets = oDoc.Sheets.getCount()
   
    ' Проходим по всем листам в документе
    For i = 0 To totalSheets - 1
        oSheet = oDoc.Sheets(i)
        MsgBox "Обрабатываем лист: " & oSheet.Name ' Сообщение о текущем листе
       
        oRange = oSheet.getCellRangeByName("E1:E104") ' Замените 1048576 на нужное количество строк

        ' Получаем данные из диапазона
        oData = oRange.getDataArray()

        ' Проверяем, есть ли данные для копирования
        If Not IsEmpty(oData) Then
            Dim numRows As Long
            numRows = UBound(oData) + 1 ' Количество строк в данных
            ' Вставка данных в новый документ
            oNewDoc.Sheets(0).getCellRangeByName("A" & (iRow + 1) & ":A" & (iRow + numRows)).setDataArray(oData)
            iRow = iRow + numRows ' Увеличение текущей строки для следующей вставки
        End If
    Next i

    ' Сохранение документа в формате ODS
    oNewDoc.storeAsURL("file:///home/taras/GRIDS/Скопированные_колонки.ods", Array())
    oNewDoc.close(True)
Макрос сохранен в библиотеке мои макросы. При запуске создает новый документ и копирует данные с первого листа. И на этом всё... Окошко обработки появляется, по завершению файл сохраняется. Но только с данными с первого листа.

sokol92

Запустил Ваш (ChatGPT) макрос.
Он работает так.
С первого листа копируются данные столбца E (E1:E104) в ячейки A1:A104.
Со второго листа копируются данные (E1:E104) в ячейки A105:A208 и т.д.
Владимир.

d.taras

Цитата: sokol92 от 15 октября 2024, 18:08Запустил Ваш (ChatGPT) макрос.
Он работает так.
С первого листа копируются данные столбца E (E1:E104) в ячейки A1:A104.
Со второго листа копируются данные (E1:E104) в ячейки A105:A208 и т.д.

Спасибо  :o , я даже не догадывался о таком варианте....
Идея была копировать данные со второго листа столбца E (E1:E104) в ячейки В1:В104 и т.д.

sokol92

Цитата: d.taras от 15 октября 2024, 19:22Идея была копировать данные со второго листа столбца E (E1:E104) в ячейки В1:В104 и т.д.
ЦитироватьЛегким движением руки брюки превращаются...
Замените
oNewDoc.Sheets(0).getCellRangeByName("A" & (iRow + 1) & ":A" & (iRow + numRows)).setDataArray(oData)на
oNewDoc.Sheets(0).getCellRangeByPosition(i, 0, i, numRows-1).setDataArray(oData)
Владимир.