Ошибка при вызове метода контекста getcellrangebyposition

Помогите пожалуйста написать макрос для openoffice calc. Хочу написать макрос который мог бы в исходно открытый документ *.ods копировал значения выбранного диапазона к примеру (A1:B2) из другого файла *.ods, загвоздка еще в том что бы он копировал в определенно выбранную область т.е на пример копировал из file1.ods диапазон (A1:B2) и вставил в исходно открытый svod.ods диапазон (C3.D4). Помогите, бьюсь второй день! Хочу научится!


Добро пожаловать на форум, VEU! (А что этот ник должен означать? ФИО, что ли?)

Цитата: VEU от 16 марта 2016, 08:35Хочу научится!

Похвальное желание. Тем более — добро пожаловать!

Цитата: VEU от 16 марта 2016, 08:35
Хочу написать макрос который мог бы в исходно открытый документ *.ods копировал значения выбранного диапазона к примеру (A1:B2) из другого файла *.ods, загвоздка еще в том что бы он копировал в определенно выбранную область т.е на пример копировал из file1.ods диапазон (A1:B2) и вставил в исходно открытый svod.ods диапазон (C3.D4).

Эта задача решена уже не один раз. Там всё очень просто.
Сначала скачиваешь файл по

этой ссылке

Открываешь его и по Ctrl+F ищешь «copy sp» — попадаешь на строчку в оглавлении «5.23.1. Copy Spreadsheet Cells With The Clipboard»
Там же чуть ниже ещё и «Copy Spreadsheet Cells Without The Clipboard», и «An alternative to the clipboard – transferable content».
Зажимаешь Ctrl и кликаешь по строчке — перепрыгиваешь сразу в нужное место. Основная часть — собственно макрос. Остальные две строчки — пояснение к нему. Даже если не силён в английском — Гугль-переводчик легко объяснит, о чём пойдёт речь.
Если всё ещё не понятно — опять пишешь сюда и форумчане помогают разобраться что к чему.



Я так понял, что данный макрос переносит данные из исходно открытого документа, может я не совсем понял)) только учусь). Можно ли сделать так что бы, допустим я открыл файл Svod.ods к примеру нажал кнопку и он перенес данные из File1.ods. Просто как правильно это записать, можете помочь?

Sub CopyPasteRange()
  Dim oSourceDoc, oSourceSheet, oSourceRange
  Dim oTargetDoc, oTargetSheet, oTargetCell
  Dim oDisp, octl
  Dim sUrl As String
  Dim NoArg()

  oSourceDoc=ThisComponent
  octl = oSourcedoc.getCurrentController()
  oSourceframe = octl.getFrame()
  oSourceSheet= oSourceDoc.Sheets(0)
  oSourceRange = oSourceSheet.getCellRangeByPosition(0,0,100,10000)

    oDisp = createUnoService(«com.sun.star.frame.DispatchHelper»)

  octl.Select(oSourceRange)

  oDisp.executeDispatch(octl, «.uno:Copy», «», 0, NoArg())

    sURL = «private:factory/scalc»
  oTargetDoc = Stardesktop.loadComponentFromURL(sURL, «_blank», 0, NoArg())
  oTargetSheet = oTargetDoc.getSheets.getByIndex(0)

    oTargetCell = oTargetSheet.getCellByPosition(0,0)
  oTargetDoc.getCurrentController().Select(oTargetCell)

  oTargetframe = oTargetDoc.getCurrentController().getFrame()
  oDisp.executeDispatch(oTargetFrame, «.uno:Paste», «», 0, NoArg())
End Sub


Может быть, так будет понятнее


Большое спасибо!! форум класс!


Здравствуйте! скажите, возможно ли сделать из этого же примера, что бы он так же брал из file1.ods диапазон ячеек (A1:B2) и (A4:B4) т.е скопировал, после вставлял в svod.ods соответственно (A1:B2) в (E7:F7) а (A4:B4) в (E10:F10). Надеюсь понятно объяснил))

Sub onBtnClick(oEvent As Variant)
Dim oSheet As Variant   
Dim lastRow As Long      
Dim oCellRangeByPosition As Variant   
Dim oFileSelector As Variant   
Dim   sFileName As String   
Dim iDoc As Variant      
Dim bDisposable As Boolean   
Dim iSheet As Variant   
Dim iCursor As Variant   
Dim iData As Variant   

   GlobalScope.BasicLibraries.LoadLibrary(«Tools»)
   oSheet = ThisComponent.getCurrentController().getActiveSheet()
   sFileName = oEvent.Source.getModel().getParent().getByName(«selectFile»).Text
   iDoc = OpenDocument(ConvertToURL(sFileName), Array(), bDisposable)
   If IsNull(iDoc) Or IsEmpty(iDoc) Then
      MsgBox(«Файл с именем ‘» + sFileName + «‘ не может быть открыт», 48, «Ошибка открытия файла»)
      Exit Sub
   EndIf
   iSheet = iDoc.getSheets().getByIndex(0)
   iCursor = iSheet.createCursor()
        iCursor.gotoEndOfUsedArea(True)
   iData = iCursor.getDataArray()
   lastRow = GetLastUsedRow(oSheet)
   If lastRow>0 Then lastRow = lastRow + 1
   oCellRangeByPosition = oSheet.getCellRangeByPosition(0, lastRow, UBound(iData(0)), UBound(iData)+lastRow)
   oCellRangeByPosition.setFormulaArray(iData)
   If bDisposable Then iDoc.close(True)
End Sub


Можно, всё можно.
Дело в том, что нужно просто понять что это за зверь .getCellRangeByPosition и какие параметры ему передаются.
Там всё просто — номер левой колонки, номер верхней строки, номер правой колонки, номер нижней строки. При этом не забывать, что нумерация начинается с нуля.
То есть для диапазона (A1:B2) нужно написать .getCellRangeByPosition(0,0,1,1), для (A4:B4) — .getCellRangeByPosition(0,3,1,3). Эти методы нужно применять к листу исходных данных (в нашим примере это iSheet).
Точно так же и диапазоны выходные:

(E7:F7) -> oSheet.getCellRangeByPosition(4, 6, 5, 6),
(E10:F10)  -> oSheet.getCellRangeByPosition(4, 9, 5, 9)

Есть у листа еще и метод .getCellRangeByName(«A4:B4») — ему можно диапазон ячеек подсовывать прямо в виде текстовой строки, не заморачиваясь пересчетом колонок и столбцов. Но, что касается меня, то стараюсь все-таки использовать .getCellRangeByPosition(). Просто был у меня случай, когда скопировал диапазон из сообщения на форуме и целый день искал ошибку в коде. А оказалось, что А12:С240 было написано РУССКИМИ буквами.

Да, а копирование данных диапазон в диапазон можно записать одной длинной строкой

oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray())
Не смотря на «ужасный», нечитаемый вид — должна работать.

PS. И не надо копировать весь текст макроса в следующее сообщение — только тот кусочек, который вызывает вопросы. И форматируй, плз, эти фрагменты как код (такая специальная кнопочка с «диезом»)


Понял, спасибо! попробуем)


Чего то я упускаю! не получается, сори только учусь))

oSheet = ThisComponent.getCurrentController().getActiveSheet()

sFileName = oEvent.Source.getModel().getParent().getByName("selectFile").Text

iDoc = OpenDocument(ConvertToURL(sFileName), Array(), bDisposable)

If IsNull(iDoc) Or IsEmpty(iDoc) Then
MsgBox("Файл с именем '" + sFileName + "' не может быть открыт", 48, "Ошибка открытия файла")
Exit Sub
EndIf

iSheet = iDoc.getSheets().getByIndex(0)

    oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray()

If bDisposable Then iDoc.close(True)


Не переживай, это с непривычки. Смотри внимательно:

(4, 6, 5, 6).setFormula...(0,0,1,1)
Представь себе два прямоугольника с такими координатами… Видишь? Нижний — из двух ячеек в одной строке, а второй — уже квадратик 2х2.
Чтобы оператор копирования сработал, оба прямоугольника должны быть одного размера. Или первый (4, 6, 5, 7), или второй (0,0,1,0)

(И не рассказывай, что это я ошибся!
Во-первых, это у тебя было так написано «(A1:B2) в (E7:F7)», я просто перевёл.
А во-вторых, я и так знаю, что ошибся  ;D )


Здравствуйте! еще раз спасибо за помощь)
Скажите пожалуйста, есть ли команда которая копирует не только значение, а вообще все что имеется в ячейках как например в стандартных функциях Calc «Специальная вставка->выделение ->вставить всё»? Просто имеется строка на некоторых ячейках зашиты формулы, хочу написать макрос что бы он копировал строку со всем содержимым и вставлял в другую пустую строку.


Помнишь, как мы получали активный лист? Спрашивали у текущего документа «Кто у тебя сейчас контроллер?» (.getCurrentController())
Этот вот контроллер знает что выделено в данный момент. И, более того, может скопировать это выделение в переменную — всё-всё, значения, формулы, форматы.
Делается это приблизительно так

oCurrentController = ThisComponent.getCurrentController()
oCurrentController.select(<какой-то участок на листе, oCellRangeByPosition>)
oTransferable = oCurrentController.getTransferable()

А это скопированное можно вставить куда захочешь, то ли прямо в этот документ, то ли в другой — это сделает

oCurrentController.insertTransferable(oTransferable)
Это всё расписано в том самом «An alternative to the clipboard – transferable content», о котором я писал во втором сообщении этой темы



В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Автор VEU, 16 марта 2016, 08:35

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

Помогите пожалуйста написать макрос для openoffice calc. Хочу написать макрос который мог бы в исходно открытый документ *.ods копировал значения выбранного диапазона к примеру (A1:B2) из другого файла *.ods, загвоздка еще в том что бы он копировал в определенно выбранную область т.е на пример копировал из file1.ods диапазон (A1:B2) и вставил в исходно открытый svod.ods диапазон (C3.D4). Помогите, бьюсь второй день! Хочу научится!


Добро пожаловать на форум, VEU! (А что этот ник должен означать? ФИО, что ли?)

Цитата: VEU от 16 марта 2016, 08:35Хочу научится!

Похвальное желание. Тем более — добро пожаловать!

Цитата: VEU от 16 марта 2016, 08:35
Хочу написать макрос который мог бы в исходно открытый документ *.ods копировал значения выбранного диапазона к примеру (A1:B2) из другого файла *.ods, загвоздка еще в том что бы он копировал в определенно выбранную область т.е на пример копировал из file1.ods диапазон (A1:B2) и вставил в исходно открытый svod.ods диапазон (C3.D4).

Эта задача решена уже не один раз. Там всё очень просто.
Сначала скачиваешь файл по

этой ссылке

Открываешь его и по Ctrl+F ищешь «copy sp» — попадаешь на строчку в оглавлении «5.23.1. Copy Spreadsheet Cells With The Clipboard»
Там же чуть ниже ещё и «Copy Spreadsheet Cells Without The Clipboard», и «An alternative to the clipboard – transferable content».
Зажимаешь Ctrl и кликаешь по строчке — перепрыгиваешь сразу в нужное место. Основная часть — собственно макрос. Остальные две строчки — пояснение к нему. Даже если не силён в английском — Гугль-переводчик легко объяснит, о чём пойдёт речь.
Если всё ещё не понятно — опять пишешь сюда и форумчане помогают разобраться что к чему.



Я так понял, что данный макрос переносит данные из исходно открытого документа, может я не совсем понял)) только учусь). Можно ли сделать так что бы, допустим я открыл файл Svod.ods к примеру нажал кнопку и он перенес данные из File1.ods. Просто как правильно это записать, можете помочь?

Sub CopyPasteRange()
  Dim oSourceDoc, oSourceSheet, oSourceRange
  Dim oTargetDoc, oTargetSheet, oTargetCell
  Dim oDisp, octl
  Dim sUrl As String
  Dim NoArg()

  oSourceDoc=ThisComponent
  octl = oSourcedoc.getCurrentController()
  oSourceframe = octl.getFrame()
  oSourceSheet= oSourceDoc.Sheets(0)
  oSourceRange = oSourceSheet.getCellRangeByPosition(0,0,100,10000)

    oDisp = createUnoService(«com.sun.star.frame.DispatchHelper»)

  octl.Select(oSourceRange)

  oDisp.executeDispatch(octl, «.uno:Copy», «», 0, NoArg())

    sURL = «private:factory/scalc»
  oTargetDoc = Stardesktop.loadComponentFromURL(sURL, «_blank», 0, NoArg())
  oTargetSheet = oTargetDoc.getSheets.getByIndex(0)

    oTargetCell = oTargetSheet.getCellByPosition(0,0)
  oTargetDoc.getCurrentController().Select(oTargetCell)

  oTargetframe = oTargetDoc.getCurrentController().getFrame()
  oDisp.executeDispatch(oTargetFrame, «.uno:Paste», «», 0, NoArg())
End Sub


Может быть, так будет понятнее


Большое спасибо!! форум класс!


Здравствуйте! скажите, возможно ли сделать из этого же примера, что бы он так же брал из file1.ods диапазон ячеек (A1:B2) и (A4:B4) т.е скопировал, после вставлял в svod.ods соответственно (A1:B2) в (E7:F7) а (A4:B4) в (E10:F10). Надеюсь понятно объяснил))

Sub onBtnClick(oEvent As Variant)
Dim oSheet As Variant   
Dim lastRow As Long      
Dim oCellRangeByPosition As Variant   
Dim oFileSelector As Variant   
Dim   sFileName As String   
Dim iDoc As Variant      
Dim bDisposable As Boolean   
Dim iSheet As Variant   
Dim iCursor As Variant   
Dim iData As Variant   

   GlobalScope.BasicLibraries.LoadLibrary(«Tools»)
   oSheet = ThisComponent.getCurrentController().getActiveSheet()
   sFileName = oEvent.Source.getModel().getParent().getByName(«selectFile»).Text
   iDoc = OpenDocument(ConvertToURL(sFileName), Array(), bDisposable)
   If IsNull(iDoc) Or IsEmpty(iDoc) Then
      MsgBox(«Файл с именем ‘» + sFileName + «‘ не может быть открыт», 48, «Ошибка открытия файла»)
      Exit Sub
   EndIf
   iSheet = iDoc.getSheets().getByIndex(0)
   iCursor = iSheet.createCursor()
        iCursor.gotoEndOfUsedArea(True)
   iData = iCursor.getDataArray()
   lastRow = GetLastUsedRow(oSheet)
   If lastRow>0 Then lastRow = lastRow + 1
   oCellRangeByPosition = oSheet.getCellRangeByPosition(0, lastRow, UBound(iData(0)), UBound(iData)+lastRow)
   oCellRangeByPosition.setFormulaArray(iData)
   If bDisposable Then iDoc.close(True)
End Sub


Можно, всё можно.
Дело в том, что нужно просто понять что это за зверь .getCellRangeByPosition и какие параметры ему передаются.
Там всё просто — номер левой колонки, номер верхней строки, номер правой колонки, номер нижней строки. При этом не забывать, что нумерация начинается с нуля.
То есть для диапазона (A1:B2) нужно написать .getCellRangeByPosition(0,0,1,1), для (A4:B4) — .getCellRangeByPosition(0,3,1,3). Эти методы нужно применять к листу исходных данных (в нашим примере это iSheet).
Точно так же и диапазоны выходные:

(E7:F7) -> oSheet.getCellRangeByPosition(4, 6, 5, 6),
(E10:F10)  -> oSheet.getCellRangeByPosition(4, 9, 5, 9)

Есть у листа еще и метод .getCellRangeByName(«A4:B4») — ему можно диапазон ячеек подсовывать прямо в виде текстовой строки, не заморачиваясь пересчетом колонок и столбцов. Но, что касается меня, то стараюсь все-таки использовать .getCellRangeByPosition(). Просто был у меня случай, когда скопировал диапазон из сообщения на форуме и целый день искал ошибку в коде. А оказалось, что А12:С240 было написано РУССКИМИ буквами.

Да, а копирование данных диапазон в диапазон можно записать одной длинной строкой

oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray())
Не смотря на «ужасный», нечитаемый вид — должна работать.

PS. И не надо копировать весь текст макроса в следующее сообщение — только тот кусочек, который вызывает вопросы. И форматируй, плз, эти фрагменты как код (такая специальная кнопочка с «диезом»)


Понял, спасибо! попробуем)


Чего то я упускаю! не получается, сори только учусь))

oSheet = ThisComponent.getCurrentController().getActiveSheet()

sFileName = oEvent.Source.getModel().getParent().getByName("selectFile").Text

iDoc = OpenDocument(ConvertToURL(sFileName), Array(), bDisposable)

If IsNull(iDoc) Or IsEmpty(iDoc) Then
MsgBox("Файл с именем '" + sFileName + "' не может быть открыт", 48, "Ошибка открытия файла")
Exit Sub
EndIf

iSheet = iDoc.getSheets().getByIndex(0)

    oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray()

If bDisposable Then iDoc.close(True)


Не переживай, это с непривычки. Смотри внимательно:

(4, 6, 5, 6).setFormula...(0,0,1,1)
Представь себе два прямоугольника с такими координатами… Видишь? Нижний — из двух ячеек в одной строке, а второй — уже квадратик 2х2.
Чтобы оператор копирования сработал, оба прямоугольника должны быть одного размера. Или первый (4, 6, 5, 7), или второй (0,0,1,0)

(И не рассказывай, что это я ошибся!
Во-первых, это у тебя было так написано «(A1:B2) в (E7:F7)», я просто перевёл.
А во-вторых, я и так знаю, что ошибся  ;D )


Здравствуйте! еще раз спасибо за помощь)
Скажите пожалуйста, есть ли команда которая копирует не только значение, а вообще все что имеется в ячейках как например в стандартных функциях Calc «Специальная вставка->выделение ->вставить всё»? Просто имеется строка на некоторых ячейках зашиты формулы, хочу написать макрос что бы он копировал строку со всем содержимым и вставлял в другую пустую строку.


Помнишь, как мы получали активный лист? Спрашивали у текущего документа «Кто у тебя сейчас контроллер?» (.getCurrentController())
Этот вот контроллер знает что выделено в данный момент. И, более того, может скопировать это выделение в переменную — всё-всё, значения, формулы, форматы.
Делается это приблизительно так

oCurrentController = ThisComponent.getCurrentController()
oCurrentController.select(<какой-то участок на листе, oCellRangeByPosition>)
oTransferable = oCurrentController.getTransferable()

А это скопированное можно вставить куда захочешь, то ли прямо в этот документ, то ли в другой — это сделает

oCurrentController.insertTransferable(oTransferable)
Это всё расписано в том самом «An alternative to the clipboard – transferable content», о котором я писал во втором сообщении этой темы



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

  • Главная категория

  • Basic

  • Не получается написать макрос для openoffice calc

   mxs089

17.03.15 — 16:02

в excel включаю запись макроса, выделяю несколько ячеек с зажатым ctrl, смотрю что получилось:

Range(«W13:Y13,AA13:AC13»).Select

пишу в 1с:

Документ.Листы[0].Range(«W13:Y13,AA13:AC13»).Select();

ругается на метод Range, не правильно использую?

   bolobol

1 — 17.03.15 — 16:12

Читаем справку — первая ссылка в яндексе:

Application.Union(Range(«Sheet1!A1:B2»), Range(«Sheet1!C3:D4»))

   manyak

2 — 17.03.15 — 16:16

а какую ошибку выдает?

   mxs089

3 — 17.03.15 — 16:18

Ошибка при вызове метода контекста (Range)

    Документ.Листы[0].Range(«W13:Y13,AA13:AC13»).Select();

по причине:

Произошла исключительная ситуация (0x800a03ec)

   manyak

4 — 17.03.15 — 16:23

в документе у тебя должен лежать excel

попробуй

документ.Worksheets(«лист1»).Range(«A1,C3,E6,G8»).Select

или

документ.Worksheets(0).Range(«A1,C3,E6,G8»).Select

   manyak

5 — 17.03.15 — 16:23

ну и про () в конце ессно не забудь :)

   mxs089

6 — 17.03.15 — 16:40

WorkBooks = EXCEL.WorkBooks.Open(ИмяФайла);

WorkBooks.Worksheets(0).Range(«A1,C3,E6,G8»).Select();

Ошибка при вызове метода контекста (Worksheets)

    WorkBooks.Worksheets(0).Range(«A1,C3,E6,G8»).Select();

по причине:

Произошла исключительная ситуация (0x8002000b)

   manyak

7 — 17.03.15 — 16:42

по имени листа пробывал обращаться?

   manyak

8 — 17.03.15 — 16:43

Worksheets(«имя_листа»)

   mxs089

9 — 17.03.15 — 16:46

(8) получилось по имени, теперь ошибка RANGE

Произошла исключительная ситуация (0x800a03ec)

   mxs089

10 — 17.03.15 — 16:46

(3)

   manyak

11 — 17.03.15 — 16:47

может у тебя куча excel мало ли не прибитых в памяти висит?

перегрузись от греза по дальше :)

так то код святая простота  — должен робить

   mxs089

12 — 17.03.15 — 17:15

удалось выделить одну ячейку, если указываю список — происходит ошибка, вопрос, как выделить несколько ячеек?

   bolobol

13 — 17.03.15 — 17:17

(12) Ты читать-то умеешь? Ответ в первом сообщении дан.

   icrocodile

14 — 17.03.15 — 17:23

(12) вот так :

WorkBooks.Worksheets(1).Range(«A1;B1;C1;D1;E1;F1;G1;H1;I1»).Select();

   icrocodile

15 — 17.03.15 — 17:24

и да, нумерация листов начинается с 1 :)

   mxs089

16 — 17.03.15 — 17:25

(14) спасибо! да, разделитель ;

  

mxs089

17 — 18.03.15 — 14:31

я так понимаю там есть ограничение на количество выделенных ячеек, более 18 не получается выделить, я вижу есть еще метод Area, кто нить использовал?

Эксель.COMОбъект.Selection.Areas(«W13:Y13;AA13:AC13»)

Ошибка

по причине:

Типы не совпадают (1)

Здравствуйте! Подскажите, пожалуйста! Загружаю из Excel данные, хочу обратиться к именованной области, выдает следующую ошибку: «Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
по причине:
Произошла исключительная ситуация (0x800a03ec)»

Процедура ОсновныеДействияФормыЗагрузить(Кнопка)

НомерКолонкиАртикул = ЭлементыФормы.ТабличныйДокумент.Область(«R2C1»;
НомерКолонкиНаименованияТовара = ЭлементыФормы.ТабличныйДокумент.Область(«R2C2»;
НомерКолонкиЕдиницаИзмерения = ЭлементыФормы.ТабличныйДокумент.Область(«R2C3»;
НомерКолонкиСтрана = ЭлементыФормы.ТабличныйДокумент.Область(«R2C4»;

//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Excel = новый COMОбъект(«Excel.Application»;

Версия = Лев(Excel.Version,Найти(Excel.Version,».»-1);
Если Версия = «8» тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
ФайлКолонок = Excel.Cells(2,1).SpecialCells(21).Column;
Конецесли;

// Выбираем данные из файла
Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

//Полуим данные из соответсвующих ячеек
Артикул = СокрЛП(Excel.Cells(а,Артикул).Value);
НаименованиеТовара = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
ЕдиницаИзмерения = СокрЛП(Excel.Cells(а,НомерКолонкиЕдиницаИзмерения).Value);

Товар = Справочники.Номенклатура.ПустаяСсылка();

// Ищем товар в справочнике по коду
Товар = Справочники.Номенклатура.НайтиПоКоду.Артикул;

// Если не нашли по коду, то ищем по наименованию
Если Товар.Пустая() Тогда
Товар = Справочники.Номенклатура.НайтиПоНаименованию.Наименование;
Конецесли;

//Если не нашли создаем новый
Если Товар.Пустая() Тогда
Товар = Справочники.Номенклатура.СоздатьЭлемент();
Товар.Наименование = НаименованиеТовара;
Товар.Артикул = Артикул;
Товар.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;
Товар.СтранаПроисхождения = НомерКолонкиСтрана;
Товар.Записать();
Конецесли;
КонецЦикла;

КонецПроцедуры

  • Ошибка при вызове метода контекста execute слишком длинный строковый параметр
  • Ошибка при вызове метода контекста execute произошла исключительная ситуация 0x80020005
  • Ошибка при вызове метода контекста createobject
  • Ошибка при вызове метода контекста connectagent
  • Ошибка при вызове метода контекста connect произошла исключительная ситуация v83 comconnector 1