1

У меня есть электронная таблица, с которой пользователи будут работать как в Excel, так и в LibreOffice Calc. Я хотел бы разработать макросы, которые будут работать в обоих. Я думал о коде, который сказал бы: если Excel, то [код VBA], остальное [базовый код или код 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

Какие-либо предложения?

1 ответ1

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 и выполнила соответствующий блок кода, я не вижу, чтобы это работало с макросами, встроенными в электронную таблицу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .