Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

20 Октябрь 2017, 13:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 4 »   Вниз
  Печать  
Автор Тема: Копировать с помощью макроса на другой лист  (Прочитано 36389 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 346


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #15: 20 Январь 2011, 18:07 »

Будет макрос! Обязательно будет! Но попозже... Просто увлекся оформлением вот этой книжки (см. в приложении) и макрос пока отложил... и даже на форум не заглядывал... Потому не сразу увидел, что ты наотрез отказываешься от "не программного" заполнения...

Ты уж прости меня за упрямство навязчивость настойчивость - посмотри это решение и еще раз подумай, ладно? Имей в виду, эти два варианта - далеко не единственные! А то что это я в самом деле? Прошу подумать, а над чем подумать - не показываю...

А сейчас сорри - труба зовёт, должен убегать...

[вложение удалено Администратором]
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 346


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #16: 21 Январь 2011, 13:12 »

Апну тему, чтобы топикстартер не подумал, что о нем забыли.
Так, на чем мы остановились? Ага, у нас есть основная процедура из 14 строк и процитированная из книжки Питоньяка функция для определения типа документа:

Код:
REM  *****  BASIC  *****
Option Explicit ' Это означает, что каждая переменная должна быть описана с помощью инструкции Dim.

REM Author: Владислав Орлов aka JohnSUN, Киев, Украина, 2011

REM Макрос копирования выделенных данных
REM в новую строку листа с именем Прайс1
REM Для каждой выделенной в момент запуска
REM макроса ячейки и трех соседних с ней (справа)
REM копирует содержимое в лист с именем Прайс1
REM в столбец C в первую пустую строку
REM Первой целевой клеткой является C2.
Sub CopyDataToPrice1()
Dim oDoc As Object ' Текущий документ
Dim oSheets As Object ' Все листы нашего документа
Const shName = "Прайс1" ' Если потребуется сменить имя листа — меняем в этом месте
Dim oTargetSheet As Object ' Лист-цель с именем shName, куда копируем
oDoc = ThisComponent
If GetDocumentType(oDoc) <> "scalc" Then Exit Sub ' Eсли не из Калка запустили, то ничего не делать
oSheets = oDoc.getSheets()
REM Попытаться получить лист с именем shName:
If NOT oSheets.hasByName(shName) Then
print "Где-то потерялся " & shName & "!"
Exit Sub
End If
oTargetSheet = oSheets.getByName(shName)
REM Теперь нужно отыскать что сейчас выделено
REM На листе oTargetSheet найти последнюю заполненную строку
REM И где-то здесь будет предложенная convas строка насчет
REM Sheet2.copyRange (CellAddress, CellRangeAddress)
End Sub


REM Цитата из книжки Питоньяка Listing 4.1: Identify most OpenOffice.org document types.
REM Функция определяет тип документа, ссылка
REM на который передается параметром oDoc
REM и возвращает текстовое название этого типа
'Author: Included with OpenOffice
'Modified by Andrew Pitonyak
Function GetDocumentType(oDoc)
Dim sImpress$
Dim sCalc$
Dim sDraw$
Dim sBase$
Dim sMath$
Dim sWrite$

sCalc    = "com.sun.star.sheet.SpreadsheetDocument"
sImpress = "com.sun.star.presentation.PresentationDocument"
sDraw    = "com.sun.star.drawing.DrawingDocument"
sBase    = "com.sun.star.sdb.DatabaseDocument"
sMath    = "com.sun.star.formula.FormulaProperties"
sWrite   = "com.sun.star.text.TextDocument"

On Local Error GoTo NODOCUMENTTYPE
If oDoc.SupportsService(sCalc) Then
GetDocumentType() = "scalc"
ElseIf  oDoc.SupportsService(sWrite) Then
GetDocumentType() = "swriter"
ElseIf  oDoc.SupportsService(sDraw) Then
GetDocumentType() = "sdraw"
ElseIf  oDoc.SupportsService(sMath) Then
GetDocumentType() = "smath"
ElseIf  oDoc.SupportsService(sImpress) Then
GetDocumentType() = "simpress"
ElseIf  oDoc.SupportsService(sBase) Then
GetDocumentType() = "sbase"
End If
NODOCUMENTTYPE:
If Err <> 0 Then
GetDocumentType = ""
Resume GOON
GOON:
End If
End Function
Продолжаем разговор... (с) Карлсон
Или уже можно не продолжать, тема отпала?..  lyolikfx, макрос продолжаем писать? Или уже можно чем-то другим заняться?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #17: 21 Январь 2011, 14:40 »

Добрый день. Я сейчас опробую даный екземпляр. Но если он не полный, то мне он по преджнему нужен.
Записан
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #18: 21 Январь 2011, 14:41 »

Исходя из кода, я так понял, нужно подписать лист2 ?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 346


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #19: 21 Январь 2011, 14:44 »

Нет, далеко не полный! Можно и не пробовать! Это "заготовка, которую еще нужно обточить надфилем согласно эскиза"  Смеющийся

П
Исходя из кода, я так понял, нужно подписать лист2 ?
Почему 2? Ты же итоговый прайс держишь на "лист1"? Ну, в общем, куда копируем - тот и переименовываем...

А "безмакросный" вариант никак не прокомментируешь?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #20: 21 Январь 2011, 14:47 »

Дело в том, что мне нужен динамический вариант формирования прайсов. Копировал-не то- удалил - добавил - отправил....
С макросом в МС офис очень удобно, но МС Офис отходит в историю, т.к. дядюшка Билл несколько зажрался. Приходится использовать безплатное ПО.
Записан
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #21: 21 Январь 2011, 14:53 »

Н да, смотрю код - тёмный лес. Честь вам и слава энтузиастам-альтруистам.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 346


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #22: 21 Январь 2011, 15:06 »

мне нужен динамический вариант формирования прайсов. Копировал-не то- удалил - добавил - отправил....
Ну так лист Прайс2 чем плох? Проставил на исходных в колонке НУЖЕН! цифирки напротив позиций "отправим вот это", скопировал Прайс2 - да и отправил...
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #23: 21 Январь 2011, 15:12 »

мне нужен динамический вариант формирования прайсов. Копировал-не то- удалил - добавил - отправил....
Ну так лист Прайс2 чем плох? Проставил на исходных в колонке НУЖЕН! цифирки напротив позиций "отправим вот это", скопировал Прайс2 - да и отправил...
А можно пошагово?
А то вариант Копировать весь лист - отфильтровать - отправить -------- очень не удобный. Там 2500-3000 позиций начинаеш сверху и вниз, а потом данные изменились, возвращатся искать так неудобно.
« Последнее редактирование: 21 Январь 2011, 15:19 от lyolikfx » Записан
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #24: 21 Январь 2011, 15:21 »

И ещё, если всё-же  рассматривать вариант с макросом, в ОпенОфис прописывается выполнение макроса на комбинацию клавиш или нажатие (созданной) кнопки?
Записан
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #25: 21 Январь 2011, 15:39 »

Да, в меню Сервис/Настройка- вкладка Клавиатура.

[вложение удалено Администратором]
Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #26: 21 Январь 2011, 15:48 »

Одной строчкой можно так скопировать:
Код:
Sub Main
ThisComponent.Sheets.getByName("Лист2").getCellRangeByName("A1:B2").setDataArray(ThisComponent.CurrentSelection.DataArray)
End Sub
Но нужно выделить область размером 2х2 (чтобы она соответствовала "A1:B2")
Либо можно жетско задать то что вы собираетесь копировать:
Код:
Sub Main
ThisComponent.Sheets.getByName("Лист2").getCellRangeByName("B1:C2").setDataArray(ThisComponent.Sheets.getByName("Лист1").getCellRangeByName("A1:B2").DataArray)
End Sub

[вложение удалено Администратором]
Записан

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 346


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #27: 21 Январь 2011, 16:02 »

А можно пошагово?
1. Идем на лист Исходные.
2. Если будем готовить совершенно новый прайс, очистим колонку Е (становимся на E2; жмем Ctrl+Shift+End - выделены ячейки до конца листа; не отпуская Shift - несколько раз стрелку влево, чтобы остался выделенным один столбец; жмем Del - все ячейки очищены, в Прайс2 остался только заголовок "Артикул-Наименование-Наличие-Цена")
3. Просматриваем список товаров, напротив нужных в итоговом прайсе позиций жмем 1 (или 2, или 3... любую цифру) и Enter - в клетке появляется "птичка", а рядом, в столбце F - номер.
4. Если "птичка" стоит напротив ненужного товара - жмем Del: "птичка" и номер строки исчезают.
5. В любой момент переключаемся на Прайс2, проверяем готовность...
6. Для получения окончательного варианта переключаемся на Прайс2, жмем Ctrl+Home и Ctrl+Shift+End - выделены ячейки до конца заполненной части листа (можно и Ctrl+A, но тогда выделится весь лист, больше миллиона строк). Жмем Ctrl+C - скопировали. Жмем Ctrl+N - создали новую пустую книгу. Жмем Ctrl+Shift+V - Вставить как... (типа, "специальная вставка"), выставляем флажки как на рисунке, ОК.
7. Сохраняем с нужным именем или выгружаем в PDF.
А то вариант Копировать весь лист - отфильтровать - отправить -------- очень не удобный.
Конечно неудобный! А кто такой вариант предложил?
Там 2500-3000 позиций начинаеш сверху и вниз, а потом данные изменились, возвращатся искать так неудобно.
Не понял насчет "а потом данные изменились"... Когда изменились и с какого перепугу?

[вложение удалено Администратором]
« Последнее редактирование: 21 Январь 2011, 16:05 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
convas
Старожил
****
Offline Offline

Сообщений: 310


« Ответ #28: 21 Январь 2011, 16:08 »

Одной строчкой можно так скопировать:
...
Либо можно жетско задать то что вы собираетесь копировать:

1. По условию задачи, требуется исходное выделение еще и растянуть до 4 ячеек.
2. Вставлять после (ниже) уже заполненных ранее ячеек.

В этом большая часть трудностей.
Записан
lyolikfx
Новичок
*
Offline Offline

Расположение: Мамка Украина
Сообщений: 25


« Ответ #29: 21 Январь 2011, 16:11 »

Sub MainThisComponent.Sheets.getByName("Лист2").getCellRangeByName("B1:C2").setDataArray(ThisComponent.Sheets.getByName("Лист1").getCellRangeByName("A1:B2").DataArray)End Sub

О, спасибо Клио, теперь мы уже ближе. Но ещё не всё, может всем миром сейчас и разрешим задачу.  Улыбка
Записан
Страниц: « 1 2 3 4 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!