ti-enxame.com

Como fazer para que o código seja compatível com o escritório livre

Eu migrei recentemente para pclinuxos do windows e parece que gosto. O único problema que estou enfrentando é que o libreoffice, o pacote de planilhas padrão não é compatível com macros do Excel. Abaixo está o código vba que tenho:

Option VBASupport 
Sub DeleteToLeft()
    Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft
End Sub
Function SinceLastWash()
    Application.Volatile
    WashCount = 0
    WearCount = 0
    CurrentRow = Application.ThisCell.Row
    For i = 3 To 35
        If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a" Then
            WearCount = WearCount + 1
        End If
        If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "q" Then
            WashCount = WashCount + 1
            WearCount = 0
        End If
    Next i
    SinceLastWash = WearCount
End Function
Function testhis()
testhis = Application.ThisCell.Row
End Function

Existe uma maneira de converter este código para torná-lo compatível com libreoffice ou eu tenho que aprender uma linguagem completamente nova como python? Aprender python não seria um problema, mas não é uma solução para o meu problema, pois eu tenho muitos arquivos relacionados ao trabalho no Excel, que tem um monte de código vba e não é possível para mim usar o Open Office/libreoffice no trabalho ...

Eu só quero acrescentar que a função SinceLastWash dá o valor correto em algumas células onde eu uso e em outras dá um erro, # NOME?

Obrigado 

11
user3125707

Você deve traduzir as partes que manipulam o documento para usar a API UNO. Infelizmente, isso pode ser complicado dependendo do que sua macro faz. Declarações básicas funcionam diretamente. Modificar um documento geralmente não.

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

O comando Cells retorna uma célula específica com base em uma linha e coluna. Então, você precisa da linha atual. Aqui está alguma loucura para obter a célula ativa:

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

Quando você tem a célula ativa, você obtém o endereço da célula e, a partir disso, você tem a linha. Você não precisa usar o intervalo, pois você só se importa com uma única célula, portanto, você obtém a planilha ativa e obtém uma determinada célula da planilha.

Algo como isto: ThisComponent.getCurrentController (). GetActiveSheet (). GetCellByPosition (nCol, nRow) .getString () = "a"

Eu não sinto vontade de descobrir o que isso faz

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

De arquivo de ajuda on-line do LibreOffice:

Com poucas exceções, o Microsoft Office e o LibreOffice não podem executar o mesmo código de macro. O Microsoft Office usa o código VBA (Visual Basic for Applications) e o LibreOffice usa o código Basic baseado no ambiente da API do LibreOffice (Application Program Interface). Embora a linguagem de programação seja a mesma, os objetos e métodos são diferentes.

As versões mais recentes do LibreOffice podem executar alguns scripts do Excel Visual Basic se você habilitar esse recurso no LibreOffice - PreferencesTools - Opções - Carregar/Salvar - Propriedades do VBA.

Na realidade, você provavelmente precisaria se sentar com a API do LibreOffice e reescrever a funcionalidade. 

7
RubberDuck

A única ferramenta automática que eu conheço é Business Spreadsheets (note que não tenho experiência pessoal ou profissional nem qualquer afiliação com o site).

Parece específico para o OpenOffice, mas acho que funciona com o LibreOffice também.

Em geral, é melhor fazer isso sozinho, pois a ferramenta está longe de ser perfeita ...

2
djikay

No LibreOffice 4.4, a primeira sub-rotina não funcionará (suspeito que devido a todas as variáveis ​​que começam com 'xl'. As outras duas funcionam perfeitamente se você alterar ThisCell para ActiveCell. 

Ao invés de 

Option VBASupport 

Estou usando 

Option VBASupport 1
Option Compatible
1
A. Harding

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft exclui células em branco se não me engano

0
coleman984