2014-05-15 6 views
1

저는 직장에서 뭔가를해야하고, Windows가 아니라 우분투를 사용하고 있습니다. Libre Office가 있습니다. (LO Writer는 Word와 같습니다.) - 작업은 일부 계약서를 자동화하는 것입니다. 문서는 문서에서 문서로 변경되는 몇 가지 변수를 제외하고는 90 % 동일하게 유지됩니다."Basic"에서 배열을 전달합니다. OpenOffice Programming

우선 - 기본은 악몽입니다. ​​일반적으로이 전체 매크로 쓰기 프로세스 또한 매우 끔찍합니다. 일반적으로

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 

-

누구를 수행합니다 나는 BASIC error: Argument is not optional 에 대한 몇 가지 오류가 계속 내가 할 노력하고있어 모든 다른 함수에 두 개의 배열을 전달합니다 - "코드"에 이제

내게 정말 미친 나를 몰고있는 "기본"이외의 이것을 할 수있는 더 좋은 방법을 알아. 나는 그것이 파이썬으로 할 수있는 이해하지만, 나는 조금 더 쉬운 방법이 있었으면 좋겠다. 문제는 단어 문서이다. 테이블 및 정의해야 할 것들, 그래서 그냥 복사 할 수 없습니다/템플릿을 자바 c에 붙여 넣습니다 아가씨. 그것을 수정해라. ..

고맙다!

+0

가능성이 그 것이다 : //help.libreoffice.org/Basic/Using_Variables#Arrays) – RubberDuck

+0

내가 무엇이 잘못되었는지는 알 수 없지만 [Libre Office Basic Guide (다운로드)] (http://ask.libreoffice.org/upfiles/13691375437855071.odt) 8336 페이지를 참고하십시오. – RubberDuck

+0

예 가이드를 다운로드했습니다 - 고마워요. 그러나 이것은 제 실수로는 도움이되지 않습니다 .. – orepor

답변

1

기본 함수 인 ARRAY()는 배열이 포함 된 VARIANT를 반환합니다. 그래서 당신은 함수 ARRAY를 사용하는 경우, 당신은 변형 다이얼해야 :

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를 사용하지 않는 경우, 당신은 문자열을() 배열을 사용할 수 있습니다

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 

인사말

Axel

+0

main1에서 테스트하는 대신 test1을 사용하도록 호출을 변경하면 Axel의 솔루션이 제대로 작동해야합니다. – Andrew

1

매개 변수가 값으로되어 있다고하더라도 배열은 항상 참조로 전달됩니다. 나는 이것이 여전히 사실임을 입증해야하지만, 90 %를 확신 할 수 있습니다.

제공된 대답은 LBound 및 UBound를 사용하여 전달 된 배열에 설정된 제한값을 올바르게 사용합니다. 이것은 아마도 문제의 가장 큰 부분 일 것입니다. 이제 말했다 수행 할 수 있습니다 단순히이 같은 매크로 무언가 : 네 개의 항목의 배열을 정의하지만 세 값 [리브레 오피스 기본 배열 (HTTPS를 주었기 때문에

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