Макрос, який буде працювати в MS Excel і LibreOffice Calc


1

У мене є електронна таблиця, з якою користувачі працюватимуть як в Excel, так і в LibreOffice Calc. Я хотів би розробити макроси, які будуть працювати в обох. Я думав про код, який би сказав: Якщо Excel Потім [код VBA], Else [Основний або код Python]

Я думаю, що два клавіші - це оператор IF / THEN (або еквівалент), який обидві програми могли прочитати, і спосіб переконатися, що обидві програми ігнорують код, який не стосується їх.

Я вже намагався запустити його в LibreCalc, але він не вийде. Ось код, який мені потрібно запустити в Excel та Calc:

Public Sub spubInsertCurrDateTimeText()
'DESCRIPTION:  inserts current date and time into the active cell in text format.

Dim dtmNow As Date
Dim CurrTemp As Date
Dim CurrTot As Date
Dim NewTot As Date
Dim StartCol As Integer
Dim StopCol As Integer
Dim ClockTimerCol As Integer
Dim TotalTimeCol As Integer

dtmNow = Now 'sets variable to value of function NOW (current date/time)
StartCol = 1 'this is the column where the user enter the starting time
StopCol = 2 'this is the column where the user enter the ending or stop time
ClockTimerCol = 3 'this is the column that calculates elapsed time (StopCol minus StartCol)
TotalTimeCol = 4 'this is the column that tracks the total time elapsed in minutes

If ActiveCell.Column = StartCol Then

ActiveCell = dtmNow 'inserts variable into the active cell
Worksheets(ActiveSheet.Name).Cells(ActiveCell.Row, StopCol).Value = 0

ElseIf ActiveCell.Column = StopCol Then

ActiveCell = dtmNow 'inserts variable into the active cell

CurrTot = Worksheets(ActiveSheet.Name).Cells(ActiveCell.Row, TotalTimeCol).Value
CurrTemp = Worksheets(ActiveSheet.Name).Cells(ActiveCell.Row, ClockTimerCol).Value

NewTot = CurrTot + (CurrTemp * 1440)

Worksheets(ActiveSheet.Name).Cells(ActiveCell.Row, TotalTimeCol).Value = NewTot

Worksheets(ActiveSheet.Name).Cells(ActiveCell.Row, StartCol).Value = 0
Worksheets(ActiveSheet.Name).Cells(ActiveCell.Row, StopCol).Value = 0

Else

ActiveCell = dtmNow 'inserts variable into the active cell

End If

End Sub

Будь-які пропозиції?

Відповіді:


2

API для Calc дуже відрізняється від API для Excel, тому, хоча VBA має багато подібності з StarBasic, вам потрібно буде написати окремий код для обробки різних викликів API. Щоб перевірити, чи працює над файлом Calc, це працює в StarBasic:

If oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
    REM Run code for Calc
Else
    REM Run code for Excel
End If

Більша проблема, яку я бачу, полягає в тому, що ви говорите про запуск цього коду зсередини електронної таблиці. Якщо електронну таблицю збережено у форматі .xls або .xlsx, тоді OpenOffice та LibreOffice відключать будь-які макроси, коли файл відкриється. Я вважаю, що навпаки для Excel, якщо електронну таблицю буде збережено як .ods файл. Навіть якщо ви правильно написали весь код, принаймні одна з програм просто відмовиться його виконувати.

Незважаючи на те, що зовнішня програма може перевірити, чи Excel або Calc відкрили електронну таблицю та виконали відповідний блок коду, я не бачу, щоб це працювало з будь-якими макросами, вбудованими в електронну таблицю.


Чи можете ви зберегти два макроси, по одному для кожного формату, і скористатися подібним тестом, щоб викликати відповідний макрос?
fixer1234

@ fixer1234 Я не знаю. Я думаю, вам буде потрібно, щоб користувач відкрив електронну таблицю, а потім запустив окремий сценарій. Або помістіть скрипт у папку запуску на своєму комп’ютері і постійно його (кожні 20 секунд чи щось) перевіряйте, чи цей файл відкритий, а якщо він відкритий - запустіть код для електронної таблиці.
Лірл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.