web-dev-qa-db-fra.com

Comment rendre le code vba compatible avec libre office

J'ai récemment migré vers pclinuxos à partir de Windows et semble l'apprécier. Le seul problème auquel je suis confronté est que libreoffice, le tableur par défaut, n’est pas compatible avec les macros Excel. Ci-dessous le code vba que j'ai:

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-t-il un moyen de convertir ce code pour le rendre compatible avec libreoffice ou dois-je apprendre un tout nouveau langage comme le python? Apprendre à utiliser python ne poserait pas de problème, mais ne constituerait pas une solution à mon problème, car de nombreux fichiers liés au travail dans Excel contiennent beaucoup de code vba.

Je veux juste ajouter que la fonction SinceLastWash donne la valeur correcte dans certaines cellules où je l’utilise et dans d’autres donne une erreur, #NAME?

Merci 

11
user3125707

Vous devez traduire les parties manipulant le document pour utiliser l'API UNO. Malheureusement, cela peut être délicat en fonction de ce que fait votre macro. Les déclarations de base fonctionnent directement. La modification d'un document ne le fait généralement pas.

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

La commande Cells renvoie une cellule spécifique basée sur une ligne et une colonne. Donc, vous avez besoin de la ligne actuelle. Voici un peu de folie pour obtenir la cellule active:

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

Lorsque vous avez la cellule active, vous obtenez l'adresse de la cellule, et à partir de cela, vous avez la ligne. Vous n'avez pas du tout besoin d'utiliser la plage, car vous ne vous préoccupez que d'une seule cellule. Vous obtenez donc la feuille active, puis une cellule particulière de la feuille.

Quelque chose comme ça: ThisComponent.getCurrentController (). GetActiveSheet (). GetCellByPosition (nCol, nRow) .getString () = "a"

Je n'ai pas envie de comprendre ce que cela fait

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

De Fichier d'aide en ligne de LibreOffice:

À quelques exceptions près, Microsoft Office et LibreOffice ne peuvent pas exécuter le même code de macro. Microsoft Office utilise le code VBA (Visual Basic pour Applications) et LibreOffice utilise le code Basic basé sur l'environnement API de LibreOffice (Application Program Interface). Bien que le langage de programmation soit le même, les objets et les méthodes sont différents.

Les versions les plus récentes de LibreOffice peuvent exécuter certains scripts Excel Visual Basic si vous activez cette fonctionnalité dans LibreOffice - Outils de préférences - Options - Charger/Enregistrer - Propriétés VBA.

En réalité, vous devrez probablement vous asseoir avec l'API LibreOffice et réécrire les fonctionnalités. 

7
RubberDuck

Le seul outil automatique que je connaisse est Tableur professionnel (notez que je n’ai aucune expérience personnelle ou professionnelle ni aucune affiliation avec le site).

Cela semble spécifique à OpenOffice mais je pense que cela fonctionne aussi avec LibreOffice.

En général cependant, vous feriez mieux de le faire vous-même, car l'outil est loin d'être parfait ...

2
djikay

Dans LibreOffice 4.4, le premier sous-programme ne fonctionnera pas du tout (je suppose que toutes les variables commençant par 'xl'. Les deux autres fonctionnent parfaitement si vous changez ThisCell en ActiveCell. 

Plutôt que 

Option VBASupport 

J'utilise 

Option VBASupport 1
Option Compatible
1
A. Harding

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft supprime les cellules vides si je ne me trompe pas

0
coleman984