Перенос макросов excel в libreoffice calc

Я недавно перешел на pclinuxos из окон, и мне это нравится. Единственная проблема, с которой я столкнулся, заключается в том, что libreoffice, пакет электронных таблиц по умолчанию, несовместим с макросами Excel. Ниже приведен код vba, который у меня есть:

Option VBASupport 
Sub DeleteToLeft()
    Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft
End Sub
Function SinceLastWash()
    Application.Volatile
    WashCount = 0
    WearCount = 0
    CurrentRow = Application.ThisCell.Row
    For i = 3 To 35
        If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a" Then
            WearCount = WearCount + 1
        End If
        If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "q" Then
            WashCount = WashCount + 1
            WearCount = 0
        End If
    Next i
    SinceLastWash = WearCount
End Function
Function testhis()
testhis = Application.ThisCell.Row
End Function

Есть ли способ преобразовать этот код, чтобы сделать его совместимым с libreoffice, или мне нужно выучить совершенно новый язык, например python? Изучение python не будет проблемой, но не является решением моей проблемы, поскольку у меня есть много файлов, связанных с работой, в excel, которые содержат много кода vba, и я не могу использовать открытый офис / libreoffice на работе …

Я просто хочу добавить, что функция SinceLastWash выдает правильное значение в некоторых ячейках, где я ее использую, а в других выдает ошибку #NAME?

Благодарность

5 ответов

Лучший ответ

Вы должны перевести части, которые управляют документом, чтобы использовать UNO API. К сожалению, это может быть сложно в зависимости от того, что делает ваш макрос. Основные утверждения работают напрямую. Как правило, при изменении документа этого не происходит.

Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a"

Команда Cells возвращает определенную ячейку на основе строки и столбца. Итак, вам нужна текущая строка. Вот какое безумие получить активную ячейку:

Sub RetrieveTheActiveCell()
  Dim oOldSelection 'The original selection of cell ranges
  Dim oRanges       'A blank range created by the document
  Dim oActiveCell   'The current active cell
  Dim oConv         'The cell address conversion service
  Dim oDoc
  oDoc = ThisComponent

  REM store the current selection
  oOldSelection = oDoc.CurrentSelection

  REM Create an empty SheetCellRanges service and then select it.
  REM This leaves ONLY the active cell selected.
  oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
  oDoc.CurrentController.Select(oRanges)

  REM Get the active cell!
  oActiveCell = oDoc.CurrentSelection

  oConv = oDoc.createInstance("com.sun.star.table.CellAddressConversion")
  oConv.Address = oActiveCell.getCellAddress
  Print oConv.UserInterfaceRepresentation
  print oConv.PersistentRepresentation

  REM Restore the old selection, but lose the previously active cell
  oDoc.CurrentController.Select(oOldSelection)
End Sub

Когда у вас есть активная ячейка, вы получаете адрес ячейки, а из него — строку. Вам вообще не нужно использовать диапазон, поскольку вас интересует только одна ячейка, поэтому вы получаете активный лист, а затем получаете конкретную ячейку из листа.

Примерно так: ThisComponent.getCurrentController (). GetActiveSheet (). GetCellByPosition (nCol, nRow) .getString () = «a»

Я не хочу разбираться в том, что это делает

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft


4

Andrew
29 Окт 2015 в 17:19

Единственный автоматический инструмент, о котором я знаю, — это бизнес-таблицы (обратите внимание, что у меня нет личных или профессиональный опыт, или какое-либо отношение к сайту).

Это похоже на OpenOffice, но я думаю, что он работает и с LibreOffice.

В общем, лучше сделать это самому, инструмент далек от совершенства …


1

djikay
13 Июл 2014 в 19:25

Из файла интерактивной справки LibreOffice:

За некоторыми исключениями, Microsoft Office и LibreOffice не могут запускать один и тот же код макроса. Microsoft Office использует код VBA (Visual Basic для приложений), а LibreOffice использует код Basic, основанный на среде LibreOffice API (интерфейс прикладных программ). Хотя язык программирования тот же, объекты и методы разные.

Самые последние версии LibreOffice могут запускать некоторые сценарии Excel Visual Basic, если вы включите эту функцию в LibreOffice — PreferencesTools — Параметры — Загрузить / Сохранить — Свойства VBA.

На самом деле вам, скорее всего, придется сесть за LibreOffice API. и перепишем функционал.


14

Community
20 Июн 2020 в 12:12

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft удаляет пустые ячейки, если я не ошибаюсь


0

T-Heron
12 Апр 2017 в 03:18

В LibreOffice 4.4 первая подпрограмма не будет работать вообще (я подозреваю, что все переменные начинаются с ‘xl’. Две другие работают отлично, если вы измените ThisCell на ActiveCell.

Скорее, чем

Option VBASupport 

Я использую

Option VBASupport 1
Option Compatible


2

A. Harding
1 Окт 2015 в 22:33

Автор Keny, 17 мая 2022, 23:17

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

Доброе время суток.
На работе неожиданно перешли с Excel на LO. Не все сотрудники готовы каждый раз при открытии файла «подвязывать» макросы к кнопкам. Большую часть макросов мне уже удалось адаптировать с помощью «просторов интернета» (я не специалист в области программирования), а один (пока один) мне не поддается.
Не могли бы вы помочь переписать  этот макрос для  LO версии 7.3.2.2 (x64)?

Option VBASupport 1
Sub Макрос2()
Sheets(«ИНФОЛИСТЫ»).Select
    PalletsNumber = Sheets(«Данные»).Cells(4, 3).Value + 1
    ActiveWindow.SelectedSheets.PrintOut From:=1, To:=PalletsNumber, Copies:=1, Collate _
        :=True
    Sheets(«Данные»).Select
End Sub

Заранее спасибо.


Цитировать«Вы будете долго смеяться» (c)

но данный конкретный макрос работает без изменений и в LibreOffice.

«Родной» макрос может быть таким:

Sub TestPrint
  Dim oDoc, oSheet
  Dim props(1) As New com.sun.star.beans.PropertyValue
  oDoc=ThisComponent
  oSheet=oDoc.Sheets.GetByName("ИНФОЛИСТЫ")
  oDoc.CurrentController.setActiveSheet oSheet
  props(0).Name="Pages"
  props(0).Value="1-" & (oDoc.Sheets.GetByName("Данные").getCellByPosition(2,3).Value + 1)
  props(1).Name="Wait"
  props(1).Value=True
  oDoc.Print props
  oDoc.CurrentController.setActiveSheet oDoc.Sheets.GetByName("Данные")   
End Sub


Да, макрос Excel работает, но файл каким-то образом вечно «ломают» (пришлось снять пароль, стали сохранять непонятно как, хотя было сказано «НЕ СОХРАНЯТЬ»). Приходилось постоянно корректировать.
Надеюсь теперь проблем не будет.
Огромное спасибо.
Переназначила макросы, сохранила в родном формате  — всё работает.


Доброе время суток.
Мне подкинули ещё одну задачку: при нажатии на копку «Печать документа» на листе «Ввод данных» должны распечататься определенные листы (к примеру лист3, лист5 и листы 8-9). В Excel у меня на этот случай был макрос:

Sub PrintReg
Sheets(Array(«Лист3», «Лист5», «Лист8», «Лист9»)).Select
    Sheets(«Ввод данных»).Activate
    ActiveWindow.SelectedSheets.PrintOut Copies:=4, Collate:=True
End Sub

При сохранение в формате .xlsm макрос «теряется».
Хотелось бы его переписать под «родной» формат. Попытки сделать это самой не увенчались успехом.

Заранее спасибо.


«Родной» аналог может быть таким:

Sub TestPrint2
Dim aPrn(2) as new com.sun.star.beans.PropertyValue
Dim aSel(0) as new com.sun.star.beans.PropertyValue

aSel(0).Name="Tables"
aSel(0).Value=Array(2, 3)      ' индексы листов для печати (нумерация от 0)
With createUnoService("com.sun.star.frame.DispatchHelper")  
   .executeDispatch(ThisComponent.CurrentController.Frame, ".uno:SelectTables", "", 0, aSel)
End With  

aPrn(0).Name  = "Wait"        ' ожидать пока напечатается
aPrn(0).Value = True
aPrn(1).Name  = "CopyCount" ' количество экземпляров
aPrn(1).Value = 2
aPrn(2).Name  = "Collate"    ' разобрать по экземплярам
aPrn(2).Value = True

ThisComponent.Print(aPrn())
End Sub

Обратите внимание, что мы указываем индексы (от 0) листов, а не их имена. Узнать индекс листа по его имени можно, например, так:

sheetIndex=ThisComponent.Sheets.getByName("Sheet4").RangeAddress.Sheet

Еще один нюанс. В указанном выше примере отпечатаются листы с индексами 2 и 3, а также лист, который является текущим (выделенным) на начало выполнения макроса. Если это нежелательно, то нужно до выполнения макроса выделить лист, который принадлежит множеству листов для печати.

И еще. Если документ в момент старта макроса находится в режиме предварительного просмотра (Print Preview), то будет отпечатан только текущий лист.


Дополнила двумя строчками:

      oDoc = Thiscomponent
      oDoc.CurrentController.setActiveSheet oDoc.Sheets.GetByName(«Ввод данных»)
и «вуаля» — всё работает.

Огромное спасибо!!!



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

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

  • Calc

  • Адаптировать макрос Excel под LibreOffice Calc

OOCalc, штука страшная!
В первую очередь, жутко не стабильная, в части выполнения макросов от средней сложности!
Т.е. «вылетает на раз», причем без объяснения причин.
Не поддерживаются, при переносе из Excel, большинство форматов шрифта, ширины столбцов и строк.
Не поддерживаются ВСЕ отключения, как то: экрана, событий, пересчет ячеек и пр., привычные для VBA.

Мой случай, аналогичен Вашему.
Жене на работе (ФССП), год назад, в приказном порядке поменяли на всех машинах
Windows на Linux и Excel на Calc.
Как пример, мною лет 5 назад была написана для них программа в Excel для расчета
задолженностей по алиментам. Естественно все «улетело»!
Так я уже год е…….., пытаясь добиться прежних параметров работы, пока х…….!
Работает конечно, но до Excel далеко.
Если нужно могу выслать литературу, которую нарыл за это время,
сайт поддержки тоска полная, впрочем, как и сайт любителей этой халявы.

Еще прелесть в том, что более новые версии не факт, что будут поддерживать старые.
Например, если у Вас на одной машине установлена версия 3.3, а на другой 4.1, могут
быть проблемы!

Для начала, напишите все на привычном VBA, затем в начале  каждого модуля, уже открыв в ООCalc, вставьте:
Option VBASupport 1
и поглядите, где ругается!
Если версия, старше 4.1 (это OpenOffice, он кстате лучше, чем LibreOffice), то
возможно пойдут большинство макросов на VBA, с минимумом редактирования.
Поскольку объектная модель разная, то всякие Taget не идут в принципе, но можно
подстроиться, заменив на что-нибудь другое по смыслу.

P.S.
Кстати формулы не все идентичны, например Match, имеет другую логику!
Хотя в справке, разработчик клянется, что все good!
Справку вообще лучше не читать, бред ни о чем!

Не выполняются даже макросы, которые приведены в справке, как примеры.

Студворк — интернет-сервис помощи студентам

Помогите преобразовать макрос из excel, что бы он работал в LibreOffice Calc. Или напишите пожалуйста код макроса для создания сводной таблицы в LibreOffice Calc.

Вот код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub CreatePT()
 
Dim Pt As PivotTable
Dim strField As String
 
    strField = Selection.Cells(1, 1).Text
    Range(Selection, Selection.End(xlDown)).Name = "Items"
 
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, _
        SourceData:="=Items").CreatePivotTable TableDestination:="", _
            TableName:="ItemList"
 
    Set Pt = ActiveSheet.PivotTables("ItemList")
    ActiveSheet.PivotTableWizard TableDestination:=Cells(3, 1)
    Pt.AddFields RowFields:=strField
    Pt.PivotFields(strField).Orientation = xlDataField
    
    End Sub

Как сделать код vba совместимым с libre office

Недавно я перешел на pclinuxos из окон и, похоже, понравился. Единственная проблема, с которой я столкнулся, заключается в том, что libreoffice, пакет электронной таблицы по умолчанию несовместим с макросами excel. Ниже приведен код vba:

Есть ли способ конвертировать этот код, чтобы сделать его совместимым с libreoffice или мне нужно изучить совершенно новый язык, такой как python? Изучение python не будет проблемой, но не является решением моей проблемы, так как у меня есть много связанных с работой файлов в excel, у которых много кода vba, и я не могу использовать open office/libreoffice на работе.

Я просто хочу добавить, что функция SinceLastWash дает правильное значение в некоторых ячейках, где я их использую, а в других — ошибка, #NAME?

За некоторыми исключениями Microsoft Office и LibreOffice не могут запускать один и тот же макрокод. Microsoft Office использует код VBA (Visual Basic для приложений), а LibreOffice использует базовый код на основе интерфейса LibreOffice API (Application Program Interface). Хотя язык программирования один и тот же, объекты и методы разные.

Самые последние версии LibreOffice могут запускать некоторые сценарии Excel Visual Basic, если вы включите эту функцию в LibreOffice — PreferencesTools — Options — Load/Save — VBA Properties.

В действительности вам, скорее всего, нужно будет с API LibreOffice и переписать функциональность.

Единственным автоматическим инструментом, о котором я знаю, является Бизнес-таблицы (учтите, что у меня нет личного или профессионального опыта или какой-либо связи с сайтом).

Это похоже на OpenOffice, но я думаю, что он работает и с LibreOffice.

В общем, вам лучше сделать это самостоятельно, так как инструмент далеко не идеален.

В LibreOffice 4.4 первая подпрограмма не будет работать вообще (я подозреваю, что все переменные начинаются с «xl». Остальные два работают отлично, если вы меняете ThisCell на ActiveCell.

Вы должны перевести части, которые манипулируют документом, чтобы использовать API-интерфейс UNO. К сожалению, это может быть сложно в зависимости от того, что делает ваш макрос. Основные утверждения работают напрямую. Обычно изменение документа не выполняется.

Команда Cells возвращает определенную ячейку на основе строки и столбца. Итак, вам нужна текущая строка. Вот несколько безумств, чтобы получить активную ячейку:

Когда у вас есть активная ячейка, вы получаете адрес ячейки, и из этого вы имеете строку. Вам вообще не нужно использовать диапазон, поскольку вам нужна только одна ячейка, поэтому вы получаете активный лист, а затем получаете конкретную ячейку с листа.

Помогите преобразовать макрос из excel, что бы он работал в LibreOffice Calc. Или напишите пожалуйста код макроса для создания сводной таблицы в LibreOffice Calc.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вложения

CreatePivotTable.xls (35.0 Кб, 1 просмотров)

Совместимость таблиц Excel, с таблицей Calc LibreOffice
Здравствуйте уважаемые читатели форума! Появился вопрос , который возможно возникал сотни раз :). .

LibreOffice Calc — диаграммы
Подскажите, пожалуйста. Не могу понять как вместо цифр 1, 2, 3 и т. д. идущих по горизонтальной оси.

Из DBgrid в LibreOffice Calc
Доброго времени суток. пришлось перейти с MS Excel на libreOffice Calc. в связи с етим слетел.

Макросы в LibreOffice Calc
Здравствуйте, вы мой последний шанс ! Задание: Посчитать сумму произведений четных и нечетных.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Чтение данных из LibreOffice Calc
Уважаемые специалисты, подскажите пожалуйста, как прочитать данные из LibreOffice Calc Но при.

LibreOffice Calc плавная прокрутка
В LibreOffice Calc по умолчанию прокрутка дискретная, по строчкам. Это значит, что мы тянем.

Формирование отчета LibreOffice Calc
Привет. Необходимо сформировать отчет в LibreOffice Calc. При этом чтоб формирование отчета было в.

Клик по кнопке -Открытие LibreOffice Calc
Сделал кнопочку. Кликаю раз- появляется документ — 1.ods Кликаю второй- появляется ещё один.

Понравилась статья? Поделить с друзьями:
  • Перенос курсора на следующую строку в ячейке excel
  • Перенос контакты outlook в excel
  • Перенос картинки в текст в word
  • Перенос информации в word
  • Перенос значения с одной страницы на другую в excel