How do I make vba code compatible with libre office

前端 未结 5 1773
有刺的猬
有刺的猬 2021-01-01 22:43

I have recently migrated to pclinuxos from windows and seem to like it. The only problem I am facing is that libreoffice, the default spreadsheet package is not compatible w

5条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-01 23:36

    You must translate the portions that manipulate the document to use the UNO API. Sadly, this can be tricky depending on what your macro does. Basic statements work directly. Modifying a document generally does not.

    Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a"
    

    The Cells command returns a specific cell based on a row and column. So, you need the current row. Here is some craziness to get the active cell:

    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
    

    When you have the active cell, you get the cell address, and from that, you have the row. You do not need to use the range at all, since you only care about a single cell, so, you get the active sheet and then get a particular cell from the sheet.

    Something like this: ThisComponent.getCurrentController().getActiveSheet().getCellByPosition(nCol, nRow).getString() = "a"

    I don't feel like figuring out what this does

    Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft
    

提交回复
热议问题