在“基本”OpenOffice 编程中传递数组

Posted

技术标签:

【中文标题】在“基本”OpenOffice 编程中传递数组【英文标题】:passing an array in "Basic" OpenOffice Programming 【发布时间】:2014-05-15 12:46:19 【问题描述】:

我被要求在工作中做点什么,因为我运行的是 Ubuntu 而不是 Windows,所以我有 Libre Office(LO Writer 相当于 Word)。 - 任务是自动化一些合同,其中文档保持 90% 相同,除了一些变量从一个文档更改为另一个文档。

首先 - Basic 是一场噩梦,而且整个宏编写过程通常也很糟糕。

现在到“代码” - 我不断收到一些关于 BASIC error: Argument is not optional 的错误 我要做的就是将两个数组传递给另一个函数:

Function test ( ByVal changeFrom() As String ,ByVal changeTo() As String  )
Dim I As Long
Dim Doc As Object
Dim Replace As Object

Doc = ThisComponent

Replace = Doc.createReplaceDescriptor
For I = 0 To 2
  Replace.SearchString = changeFrom(I) //Error is here
  Replace.ReplaceString = changeTo(I)
  Doc.replaceAll(Replace)
Next I
End Function


REM  *****  BASIC  *****
Sub main
Dim changeFrom(3) As String
Dim changeTo(3) As String


changeFrom() = Array("<word2>", "<word3>", "<word1>")
changeTo() = Array("value1", "value2", "value3")
test( changeFrom , changeTo)
End Sub

一般——

有没有人知道比“基本”更好的方法来做到这一点,这真的让我发疯.. 我知道它可以用 Python 完成,但我有点希望有一种更简单的方法,问题是 word 文档有表格和需要定义的东西,所以我不能只是将模板复制/粘贴到java类并修改它..

谢谢!

【问题讨论】:

可能是因为你定义了一个包含四个项目的数组,但只给了它三个值?Libre Office Basic Arrays 我看不出有什么问题,但Libre Office Basic Guide(download) 在第 83 页对此进行了说明。 是的,我已经下载了指南 - 谢谢 - 但这对我的错误没有帮助.. 您不需要像在 VBA 中那样在 test( changeFrom , changeTo) 之前添加 Call 关键字吗? 不按照指南 - 任何人都可以推荐一种不那么乏味的方式/语言吗?听起来很简单,但我做不到 【参考方案1】:

基本函数 ARRAY() 返回一个包含数组的 VARIANT。所以如果你使用ARRAY函数,你必须用Variants拨号:

Function test ( ByVal changeFrom As Variant ,ByVal changeTo As Variant  )
Dim I As Long
Dim Doc As Object
Dim Replace As Object

Doc = ThisComponent

Replace = Doc.createReplaceDescriptor
For I = lbound(changefrom) To ubound(changefrom)
  Replace.SearchString = changeFrom(I) 'Error is here
  Replace.ReplaceString = changeTo(I)
  Doc.replaceAll(Replace)
Next I
End Function


REM  *****  BASIC  *****
Sub main
Dim changeFrom As variant
Dim changeTo As variant

changeFrom = Array("<word2>", "<word3>", "<word1>")
changeTo = Array("value1", "value2", "value3")
test( changeFrom , changeTo)
End Sub

或者如果你不使用函数ARRAY,你可以使用String()数组:

Function test1 ( ByVal changeFrom() As String ,ByVal changeTo() As String  )
Dim I As Long
Dim Doc As Object
Dim Replace As Object

Doc = ThisComponent

Replace = Doc.createReplaceDescriptor
For I = lbound(changefrom) To ubound(changefrom)
  Replace.SearchString = changeFrom(I)
  Replace.ReplaceString = changeTo(I)
  Doc.replaceAll(Replace)
Next I
End Function


REM  *****  BASIC  *****
Sub main1
Dim changeFrom(2) As String
Dim changeTo(2) As String

changeFrom(0) = "<word2>"
changeFrom(1) = "<word3>"
changeFrom(2) = "<word1>"

changeTo(0) = "value1"
changeTo(1) = "value2"
changeTo(2) = "value3"

test1( changeFrom , changeTo)
End Sub

问候

阿克塞尔

【讨论】:

如果您将调用更改为使用 test1 而不是在 main1 中进行测试,Axel 的解决方案应该可以正常工作。【参考方案2】:

我认为数组总是作为引用传递,即使您声明参数是按值传递的。我需要验证这仍然是正确的,但可以说是 90% 确定。

提供的答案正确使用 LBound 和 UBound 仅使用为传递的数组设置的限制。这可能是您问题的最大部分。现在,也就是说,您可以简单地使用宏并执行以下操作:

Function test1 (Doc, changeFrom, changeTo)
Dim I As Long
Dim Replace As Object

' A paranoid person would verify the parameters. Things like:
' Are the parameters NOT IsEmpty and Not IsNull
' Is the Doc object really a text document
' Are the other parameters really arrays

Replace = Doc.createReplaceDescriptor
For I = lbound(changefrom) To ubound(changefrom)
  Replace.SearchString = changeFrom(I)
  Replace.ReplaceString = changeTo(I)
  Doc.replaceAll(Replace)
Next I
End Function


REM  *****  BASIC  *****
Sub main1
  test1(ThisComponent, Array("<word2>", "<word3>", "<word1>"), Array("value1", "value2", "value3"))
End Sub

【讨论】:

以上是关于在“基本”OpenOffice 编程中传递数组的主要内容,如果未能解决你的问题,请参考以下文章

OpenOffice .xls 导出为 PDF 导致复选框重叠

OpenOffice.org API 还是 LibreOffice API?

在 OpenOffice Calc 正则表达式中搜索精确数字数组

Apache Openoffice Calc 编程

OpenOffice 搜索表以编程方式

在 OpenOffice Calc 中以编程方式更改打印区域