Функция копирования и вставки применяется в макросах очень часто, когда обработанные данные нужно вставить на другой лист, или в новый документ, а также убрать формулы из столбца в котором производились расчеты (в данном случае применяется "Копировать - Вставить как - Значения, Текст).
Для того чтобы скопировать диапазон его нужно сначала выделить. Делается это командами полученными из макрорекодера (так проще). Сначала выделяется верхняя левая ячейка нужного диапазона (обычно это А1), затем происходит выделение до крайней нижней правой и проводится копирование.
Рассмотрим код:
Sub Copyng
'Выделяем ячейку А1 на листе 1
oCell = ThisComponent.Sheets (0).getCellByPosition(0, 0)
ThisComponent.CurrentController.Select(oCell)
' Выделяем (простаскиваем) до конца диапазона и копируем
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = true
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
End Sub
Код стандартный в комментариях особо не нуждается. Обычно он вызывается как подфункция в основной макрос.
Теперь рассмотрим вставку:
Sub Paste
' Выделяем первую левую верхнюю ячейку в которую хотим вставить данные
' В данном случае это ячейка А1 листа 2
oCell = ThisComponent.Sheets (1).getCellByPosition(0, 0)
ThisComponent.CurrentController.Select(oCell)
' Проводим вставку
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
End Sub
Задача: В документе Реестр документов по МХ программно скопировать все данные листа 1, создать лист 2 и вставить на него данные. Как вставлять новые листы вы уже должны знать.
Теперь разберем такое стандартное копирование-вставку как убирание формул. Перед выполнением этого кода нужный столбец должен быть выделен. Лучше всего этот код вставлять сразу после модуля вставки формулы - при протягивании формулы столбец остается выделенным и нужно просто выполнить код. Рассмотрим:
Sub Delete_formul
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args2(5) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "SV"
args2(1).Name = "FormulaCommand"
args2(1).Value = 0
args2(2).Name = "SkipEmptyCells"
args2(2).Value = false
args2(3).Name = "Transpose"
args2(3).Value = false
args2(4).Name = "AsLink"
args2(4).Value = false
args2(5).Name = "MoveMode"
args2(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args2())
End sub
Здесь пояснять особо нечего: функция стандартна, ее можно просто копировать в любой модуль. Она проводит копирование, а потом вставку по выделенным флагам - в данном случае выбраны флаги "Значения" и "Текст".
Задача: Добавить данный код в одну вкладку с кодом вставки формул, который мы разобрали в предыдущем посте. Добавить строчку вызова этой функции в конец макроса вставки формул и выполнить его. Убедиться, что после расчета формул в ячейках остались только значения.
Для того чтобы скопировать диапазон его нужно сначала выделить. Делается это командами полученными из макрорекодера (так проще). Сначала выделяется верхняя левая ячейка нужного диапазона (обычно это А1), затем происходит выделение до крайней нижней правой и проводится копирование.
Рассмотрим код:
Sub Copyng
'Выделяем ячейку А1 на листе 1
oCell = ThisComponent.Sheets (0).getCellByPosition(0, 0)
ThisComponent.CurrentController.Select(oCell)
' Выделяем (простаскиваем) до конца диапазона и копируем
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = true
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
End Sub
Код стандартный в комментариях особо не нуждается. Обычно он вызывается как подфункция в основной макрос.
Теперь рассмотрим вставку:
Sub Paste
' Выделяем первую левую верхнюю ячейку в которую хотим вставить данные
' В данном случае это ячейка А1 листа 2
oCell = ThisComponent.Sheets (1).getCellByPosition(0, 0)
ThisComponent.CurrentController.Select(oCell)
' Проводим вставку
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
End Sub
Задача: В документе Реестр документов по МХ программно скопировать все данные листа 1, создать лист 2 и вставить на него данные. Как вставлять новые листы вы уже должны знать.
Теперь разберем такое стандартное копирование-вставку как убирание формул. Перед выполнением этого кода нужный столбец должен быть выделен. Лучше всего этот код вставлять сразу после модуля вставки формулы - при протягивании формулы столбец остается выделенным и нужно просто выполнить код. Рассмотрим:
Sub Delete_formul
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args2(5) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "SV"
args2(1).Name = "FormulaCommand"
args2(1).Value = 0
args2(2).Name = "SkipEmptyCells"
args2(2).Value = false
args2(3).Name = "Transpose"
args2(3).Value = false
args2(4).Name = "AsLink"
args2(4).Value = false
args2(5).Name = "MoveMode"
args2(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args2())
End sub
Здесь пояснять особо нечего: функция стандартна, ее можно просто копировать в любой модуль. Она проводит копирование, а потом вставку по выделенным флагам - в данном случае выбраны флаги "Значения" и "Текст".
Задача: Добавить данный код в одну вкладку с кодом вставки формул, который мы разобрали в предыдущем посте. Добавить строчку вызова этой функции в конец макроса вставки формул и выполнить его. Убедиться, что после расчета формул в ячейках остались только значения.
Комментариев нет:
Отправить комментарий