Я недавно перешел на 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 | ||
|
Как сделать код 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 Кликаю второй- появляется ещё один.