如何使vba代码与libre office兼容

时间:2014-07-13 15:05:47

标签: excel vba openoffice.org libreoffice

我最近从windows迁移到pclinuxos并且似乎喜欢它。我面临的唯一问题是libreoffice,默认的电子表格包与excel宏不兼容。下面是我的vba代码:

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

有没有办法转换此代码以使其与libreoffice兼容,还是我必须学习像python这样的全新语言?学习python不是问题,但不是我的问题的解决方案,因为我在excel中有很多与工作相关的文件,它们有很多vba代码,而且我不可能在工作中使用开放式办公室/ libreoffice ... < / p>

我只想补充说,函数SinceLastWash在我使用它的某些单元格中给出了正确的值,而在其他单元格中给出了错误,#NAME?

谢谢

5 个答案:

答案 0 :(得分:7)

来自LibreOffice's online help file:

  

除少数例外情况外,Microsoft Office和LibreOffice无法运行相同的宏代码。 Microsoft Office使用VBA(Visual Basic for Applications)代码,LibreOffice使用基于LibreOffice API(应用程序接口)环境的基本代码。虽然编程语言是相同的,但对象和方法是不同的。

     

如果您在LibreOffice - PreferencesTools - 选项 - 加载/保存 - VBA属性中启用此功能,则最新版本的LibreOffice可以运行一些Excel Visual Basic脚本。

实际上,您很可能需要坐下the LibreOffice API并重写功能。

答案 1 :(得分:2)

我唯一知道的自动工具是Business Spreadsheets(请注意,我没有个人或专业经验,也没有任何与该网站的关联)。

它似乎特定于OpenOffice,但我认为它也适用于LibreOffice。

总的来说,你自己做得更好,因为这个工具远非完美......

答案 2 :(得分:2)

在LibreOffice 4.4中,第一个子程序根本不起作用(我怀疑是由于所有变量都以'xl'开头。如果你将ThisCell改为ActiveCell,其他两个工作都很完美。

而不是

Option VBASupport 

我正在使用

Option VBASupport 1
Option Compatible

答案 3 :(得分:1)

您必须翻译操作文档的部分才能使用UNO API。遗憾的是,根据你的宏所做的事情,这可能很棘手。基本陈述直接起作用。修改文档通常不会。

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

Cells命令根据行和列返回特定单元格。所以,你需要当前行。这是获得活跃细胞的一些疯狂:

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

当您拥有活动单元格时,您将获得单元格地址,并从中获得该行。您根本不需要使用该范围,因为您只关心单个单元格,因此,您将获得活动工作表,然后从工作表中获取特定单元格。

这样的事情:     ThisComponent.getCurrentController()。getActiveSheet()。getCellByPosition(nCol,nRow).getString()=“a”

我不想弄清楚这是做什么的

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

答案 4 :(得分:0)

如果我没弄错的话,

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft删除空白单元格