LINUX.ORG.RU

Макрос на VBA для Libreoffice, странная ошибка

 , , ,


0

1

Доброго времени суток. Написал функцию в Libreoffice Calc на VBA. Она отрабатывает правильно и без ошибок, но в момент открытия документа появляется следующая ошибка ровно столько раз, сколько эта функция используется в формулах:

BASIC runtime error.
'1'

Type: com.sun.star.uno.RuntimeException
Message: unsatisfied query for interface of type com.sun.star.sheet.XSpreadsheetView!

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

Знатоки макросов в Libreoffice, подскажите, в чем проблема?

Сам макрос (сумма чисел в строке с заданным отступом и промежутком):

REM  *****  BASIC  *****

Sub Main

End Sub

Option VBASupport 1
Option Explicit

Function SumEvery(startCell As Range, row As Boolean, gape As Integer) As Double
	On Error GoTo ErrorHandler
	
	Dim sht As Worksheet
	Set sht = ActiveSheet
	
	Dim lastCell As Range
	If row Then
		Set lastCell =  Cells(startCell.Row, sht.Columns.Count)
	Else
		Set lastCell = Cells(sht.Rows.Count, startCell.Column)
	End If
	
	Dim resRan As Range
	Set resRan = Range(startCell, lastCell)
	
	Dim res As Double
	res = 0.0

	Dim c As Integer
	For c = 1 to resRan.Cells.Count
		If (c - 1) Mod gape = 0 Then
			res = res + resRan.Cells(c).Value
		End If	
	Next
	
	SumEvery = res
	
	Exit Function
	
	ErrorHandler:
	Stop
End Function

Выяснил, что проблемный участок кода здесь:

Dim sht As Worksheet
Set sht = ActiveSheet

Что с ним можно сделать? Если заменить на

Dim sht As Object
Set sht = ThisComponent.getCurrentController().getActiveSheet()

то ситуация та же самая, но ошибка изменяется на:

BASIC runtime error.
'91'
Object variable not set.

Ошибка исправлена созданием новой библиотеки в Macros Organizer. Но теперь использование макроса возвращает ошибку #NAME? пока он не будет открыт на редактирование

Причина ошибки #NAME? здесь https://stackoverflow.com/questions/26442049/name-error-after-opening-spreadsheet-with-macro

В итоге вернул функцию обратно в docname.ods - Standard - Module1 и добавил игнорирование ошибок. В описании исправленная функция



Последнее исправление: Rot1 (всего исправлений: 4)

Ответ на: комментарий от anonymous

Пишут, но захотелось на VBA, проблема не в нем. Я так понял, что макрос выполняется слишком рано во время открытия. Ссылка помогла побороть ошибку, но теперь вместо результата в ячейке появляются такие ошибки: #NAME?, после открытия макроса меняется на #VALUE!

Rot1
() автор топика
Последнее исправление: Rot1 (всего исправлений: 1)
Ответ на: комментарий от Rot1

#VALUE!

Это у меня опечатка была (в описании ее нет). #NAME? до открытия макроса все еще актуально

Rot1
() автор топика
Последнее исправление: Rot1 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Макросы для LO на JS вроде пишут

В основном на Basic и Python. На JS редко кто птшет для Либры

Kompilainenn ★★★★★
()

Set resRan = Range(startCell, lastCell)

Давненько не употреблял VBA. Вопрос: startCell - это «кто»?

anonymous
()

Set sht = ActiveSheet

И второй вопрос: Зачем пользовать ActiveSheet, если функции передается вполне определённый Range.

anonymous
()

If row Then

И последний вопрос: Объект Range не содержит в себе субобъект, определяющий границы «реальных» значений?

anonymous
()
Ответ на: комментарий от anonymous

Костылище!

это энтерпрайз разработка!

anonymous
()
Ответ на: комментарий от anonymous

Это отступ, ячейка, начиная с которой нужно считать сумму

Rot1
() автор топика
Ответ на: комментарий от anonymous

Просто чтобы максимальное число строк или столбцов оттуда достать

Rot1
() автор топика
Ответ на: комментарий от Rot1

Не понял. row нужен, чтобы

Вот и я не понял. Это не функция, а помесь функции и макроса. Говоря проще - винегрет. Разрабы на подобную бурду не рассчитывают. Функции работают только с теми диапазонами, которые ты им непосредственно указываешь. С произвольными диапазонами работают макросы. Так что твой косяк.

anonymous
()
Ответ на: комментарий от anonymous

Если имеется ввиду, что в функциях нужно работать только с теми ячейками, которые в нее передаются, то возможно это так для VBA

Rot1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.