Нужен макрос для копирования строки на другой лист таблицы

Автор rsa_don, 26 августа 2014, 23:20

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

rsa_don

Прошу помощи! Есть строка $лист1.А1:N1(данные в них изменяются).Небходимо ее скопировать в следующую пустую строку на лист2.Может есть готовое
решение? Спасибо.

rami

Цитата: rsa_don от 26 августа 2014, 22:20Есть строка $лист1.А1:N1(данные в них изменяются).Небходимо ее скопировать в следующую пустую строку на лист2.
Жмите на зелёную кнопку в примере.

rsa_don

Спасибо, rami! А если текущий лист1, на нем элемент управления Кнопка,которая должна копировать строку с листа 2 на лист 3 ?

rami

Цитата: rsa_don от 27 августа 2014, 18:24А если текущий лист1, на нем элемент управления Кнопка,которая должна копировать строку с листа 2 на лист 3 ?
Sheets(0) означает ссылку на первый по счёту лист(нумерация с нуля) если хотите копировать строку с листа 2 на лист 3, то в Sheets(0) замените 0 на 1, а в Sheets(1) замените 1 на 2. Названия листов не имеют значения, местонахождение кнопки тоже(переместить кнопку на другой лист можно с помощью "Вырезать"(только не лобзиком ;D) и "Вставить". Если хотите, можно использовать названия листов, а не их порядковые номера. Например так:Sub Main
Sheet1=ThisComponent.Sheets.getByName("Лист2")
Sheet2=ThisComponent.Sheets.getByName("Лист3")
Cursor=Sheet2.createCursor()
Cursor.gotoEndOfUsedArea(false)
x=Cursor.RangeAddress.EndColumn
y=Cursor.RangeAddress.EndRow
Sheet2.getCellRangeByPosition(0,y+1,x,y+1).setDataArray(Sheet1.getCellRangeByName("A1:N1").DataArray)
End Sub
Но в этом случае названия листов имеют значение.

rsa_don

RAMI! За оперативность спасибо ,макрос работает ,НО в исходной строке не только числа ,но и текстовые,дата и т.д.ячейки  и тогда
выдает ошибку на
Sheet2.getCellRangeByPosition(0,y+1,x,y+1).setDataArray(Sheet1.getCellRangeByName("A1:O1").DataArray)
Что изменить ?  Спасибо

rami

Цитата: rsa_don от 27 августа 2014, 19:29макрос работает ,НО в исходной строке не только числа ,но и текстовые,дата и т.д.ячейки  и тогда
выдает ошибку на
Sheet2.getCellRangeByPosition(0,y+1,x,y+1).setDataArray(Sheet1.getCellRangeByName("A1:O1").DataArray)
Что изменить ?
Проблема в том, что вы пытаетесь "втиснуть" увеличенный диапазон("A1:O1"). Нужны дополнительные данные:
1) вы хотите менять размер копируемого диапазона?
2) какие данные хотите получить на новом месте в виде формулы или значения?
Было бы лучше, если бы вы выложили образец документа, мне не пришлось бы догадываться о подробностях.

rsa_don

Цитата: rami от 27 августа 2014, 20:54Проблема в том, что вы пытаетесь "втиснуть" увеличенный диапазон("A1:O1"). Нужны дополнительные данные:
1) вы хотите менять размер копируемого диапазона?
2) какие данные хотите получить на новом месте в виде формулы или значения?
Было бы лучше, если бы вы выложили образец документа, мне не пришлось бы догадываться о подробностях.
По п1.Размер копируемого диапазона изначально был указан не верно(нужно А1:О1),в ячейках этой строки  результаты вычислений с
других листов(лист как промежуточный итог).
По п2.Необходимо на результирующем листе получить значения !


rami

Цитата: rsa_don от 27 августа 2014, 22:03Размер копируемого диапазона изначально был указан не верно(нужно А1:О1)
На Лист3 напишите в ячейке О1 что-нибудь(это чтобы на Лист2 и Лист3 ширина диапазонов была одинаковая).
А зачем вам нужен промежуточный итог? Ведь можно сразу записывать результат в таблицу на Лист3.

Hasim

Цитата: rami от 27 августа 2014, 22:47На Лист3 напишите в ячейке О1 что-нибудь(это чтобы на Лист2 и Лист3 ширина диапазонов была одинаковая).
Это еще что за ерунда?
Макрос сам должен определять ширину целевого диапазона, зная ширину исходного.

rami

Цитата: Hasim от 27 августа 2014, 23:23Это еще что за ерунда?
Макрос сам должен определять ширину целевого диапазона, зная ширину исходного.
Есть и такой макрос ;D:Sub Main
Sheet1=ThisComponent.Sheets.getByName("Лист2")
Sheet2=ThisComponent.Sheets.getByName("Лист3")
Cursor=Sheet2.createCursor()
Cursor.gotoEndOfUsedArea(false)
y=Cursor.RangeAddress.EndRow
oAllData=Sheet1.getCellRangeByName("A1:O1").DataArray
i=UBound(oAllData(0))
Sheet2.insertCells(Sheet2.getCellRangeByPosition(0,y+1,i,y+1).getRangeAddress(),com.sun.star.sheet.CellInsertMode.DOWN)
Sheet2.getCellRangeByPosition(0,y+1,i,y+1).DataArray=oAllData
End Sub

rsa_don

rami ! Спасибо.Все так ,как надо . На вопросы почему так,а не так -да потому, что своих извилин не хватат:)
Еще раз спасибо!