it-swarm.com.de

Wie mache ich vba-Code mit libre office kompatibel?

Ich habe vor kurzem von Windows zu pclinuxos gewechselt und scheint es zu mögen. Das einzige Problem, dem ich gegenüberstehe, ist, dass libreoffice, das Standard-Tabellenkalkulationspaket, nicht mit Excel-Makros kompatibel ist. Unten ist der vba-Code, den ich habe:

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

Gibt es eine Möglichkeit, diesen Code zu konvertieren, um ihn mit libreoffice kompatibel zu machen, oder muss ich eine völlig neue Sprache wie Python lernen? Python zu lernen wäre kein Problem, aber es ist keine Lösung für mein Problem, da ich viele Dateien in Excel mit vielen vba-Dateien habe, die viel VBA-Code enthalten, und es mir nicht möglich ist, Open Office/libreoffice bei der Arbeit einzusetzen.

Ich möchte nur hinzufügen, dass die Funktion SinceLastWash in einigen Zellen, in denen ich sie verwende, den richtigen Wert angibt und in anderen einen Fehler gibt, #NAME?

Vielen Dank 

11
user3125707

Sie müssen die Teile konvertieren, die das Dokument bearbeiten, um die UNO-API zu verwenden. Leider kann dies schwierig sein, je nachdem, was Ihr Makro macht. Grundaussagen funktionieren direkt. Das Ändern eines Dokuments funktioniert im Allgemeinen nicht.

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

Der Befehl Zellen gibt eine bestimmte Zelle basierend auf einer Zeile und Spalte zurück. Sie brauchen also die aktuelle Zeile. Hier ist etwas Verrücktheit, um die aktive Zelle zu bekommen:

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

Wenn Sie über die aktive Zelle verfügen, erhalten Sie die Zelladresse und daraus die Zeile. Sie brauchen den Bereich überhaupt nicht zu verwenden, da Sie sich nur für eine einzelne Zelle interessieren. Sie erhalten also das aktive Blatt und dann eine bestimmte Zelle aus dem Blatt.

Etwas wie das: ThisComponent.getCurrentController (). GetActiveSheet (). GetCellByPosition (nCol, nRow) .getString () = "a"

Ich habe keine Lust herauszufinden, was dies bewirkt

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

In der Online-Hilfedatei von LibreOffice:

Mit wenigen Ausnahmen können Microsoft Office und LibreOffice nicht denselben Makrocode ausführen. Microsoft Office verwendet VBA-Code (Visual Basic for Applications) und LibreOffice verwendet Basiscode, der auf der LibreOffice-API-Umgebung (Application Program Interface) basiert. Obwohl die Programmiersprache dieselbe ist, unterscheiden sich die Objekte und Methoden.

Die neuesten Versionen von LibreOffice können einige Excel Visual Basic-Skripts ausführen, wenn Sie diese Funktion unter LibreOffice - PreferencesTools - Optionen - Laden/Speichern - VBA-Eigenschaften aktivieren.

In der Realität müssten Sie sich wahrscheinlich mit der LibreOffice-API setzen und die Funktionalität neu schreiben. 

7
RubberDuck

Das einzige automatische Tool, das mir bekannt ist, ist Business Spreadsheets (Beachten Sie, dass ich weder persönliche noch berufliche Erfahrung noch eine Verbindung mit der Website habe).

Es scheint spezifisch für OpenOffice zu sein, aber ich denke, es funktioniert auch mit LibreOffice.

Im Allgemeinen ist es jedoch besser, dies selbst zu tun, da das Tool alles andere als perfekt ist ...

2
djikay

In LibreOffice 4.4 funktioniert die erste Subroutine überhaupt nicht (ich vermute, dass alle Variablen mit 'xl' beginnen. Die beiden anderen funktionieren perfekt, wenn Sie ThisCell in ActiveCell ändern. 

Eher, als 

Option VBASupport 

Ich benutze 

Option VBASupport 1
Option Compatible
1
A. Harding

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft löscht leere Zellen, wenn ich mich nicht irre

0
coleman984