[Решено] Существует ли аналог .Offset

Автор Sirius34, 11 мая 2024, 13:35

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

Sirius34

Всем доброго времени суток!

Вопрос возник: существует ли в LO аналог экселевского "механизма" .Offset ?
Нужно реализовать что-то подобное.
offCell = ActiveCell.Offset(0, 1).Value
Поиск ничего не дал (возможно, не там искал?)...

Пока пришлось сколхозить такого "монстра"
oSel = ThisComponent.getCurrentSelection()
colSel = oSel.getCellAddress().Column
rowSel = oSel.getCellAddress().Row
offCell = oSht.getCellByPosition(colSel+1, rowSel).Value

economist

Колхозить можно и VBA-код, он работает в ODS-формате:

Option vbasupport 1
Sub Main
msgbox ActiveCell.Offset(0, 1).Value
End Sub
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Попробуйте такой аналог:
' lang:en
' Shifts a range of cells and resizes them.
' - offCol shift the upper left corner of the range horizontally.
' - offRow shift the upper left corner of the range vertically.
' - addCol shift the number of columns in the range.
' - addRow shift the number of rows in the range.
' lang:ru
' Сдвигает диапазон ячеек и изменяет размер.
' - offCol   сдвиг левого верхнего угла диапазона по горизонтали.
' - offRow   сдвиг левого верхнего угла диапазона по вертикали.
' - addCol   изменение числа столбцов диапазона.
' - addRow   изменение числа строк диапазона.
Function Range_Offset(Byval oRange, Optional ByVal offCol As Long, Optional ByVal offRow As Long, _
                                    Optional ByVal addCol As Long, Optional ByVal addRow As Long) As Object
  Dim oSheet As Object, adr
  oSheet=oRange.Spreadsheet
  adr=oRange.RangeAddress
  With adr
    If Not IsMissing(offCol) Then
      .StartColumn=.StartColumn + offCol
      .EndColumn=.EndColumn + offCol
    End If
     
    If Not IsMissing(offRow) Then
      .StartRow=.StartRow + offRow
      .EndRow=.EndRow + offRow
    End If
 
    If Not IsMissing(addCol) Then .EndColumn=.EndColumn + addCol
    If Not IsMissing(addRow) Then .EndRow=.EndRow + addRow
 
    Range_Offset=oSheet.getCellRangeByPosition(.StartColumn, .StartRow, .EndColumn, .EndRow)
  End With 
End Function
Владимир.

Sirius34

Цитата: economist от 11 мая 2024, 14:17Колхозить можно и VBA-код, он работает в ODS-формате
Это понятно. Просто хотелось уже весь скрипт сделать без vba'шных вставок.

Sirius34

Цитата: sokol92 от 11 мая 2024, 14:22Попробуйте такой аналог...
При таких раскладах, мой вариант ещё не самый большой получается :)

Короче, понятно: прямого аналога нет.

Всем спасибо!
Вопрос можно закрыть.

sokol92

#5
Цитата: Sirius34 от 11 мая 2024, 15:05мой вариант ещё не самый большой получается
Вы вместо (VBA)
oCell.Offset(0, 1)будете писать (LO Basic)
Range_Offset(oCell, 1)
На несколько долларов несколько символов больше.
Владимир.